SQLを調べるVB.net 2017 Windowsサービスを作成していますが、行数によっては複数のスレッドが作成されます。これらのスレッドはフォルダを監視し、別のテーブルに戻って報告し、それに応じてデータを記録します。このコードは数年間実行されていて、うまく機能していますが、ここ数日は起動時に実行されるコンソールアプリケーションからウィンドウサービスに切り替えることにしました。これが初めてですWindowsサービスの作成。スレッドからDBに接続するSubを呼び出す
コードを実行してコードを取得しましたが、テストを実行することができなかったため、テストは大きな苦労でした。私はいくつかの変更を行い、重複セクションのいくつかを統合しました。たとえば、データをSQLに書き込むか、SQLからデータをプルするために、4つまたは5つの異なるコード・セクションを作成していました。私はこれらを2つのサブルーチンだけに統合し、スレッドはそれらを連続的に使用します。状況に応じて、プログラムは1〜15スレッドを持つことができます。スレッドをさらに起動すると、問題に遭遇しました。私はすでに、コンソールアプリケーションから自分のコードに文を入れて移植しましたが、新しいプログラムを作成するときにこれらをログテーブルに入れて、 "Open connection"を開こうとしていると不平を言っていました。ここではSQLからデータを引き出し1つのルーチンの例です:
Public con As New SqlClient.SqlConnection
Public dsGeneral As New DataSet
Public dc1 As SqlClient.SqlCommand
Public pullGeneral As SqlClient.SqlDataAdapter
Public maxRowsGeneral As Integer
Public Sub PullGeneralSQL(ByVal SQL As String)
Try
If (con.State = ConnectionState.Closed) Then
con.Open()
End If
dsGeneral.Tables.Clear()
pullGeneral = New SqlClient.SqlDataAdapter(SQL, con)
pullGeneral.Fill(dsGeneral, "General")
maxRowsGeneral = dsGeneral.Tables("General").Rows.Count
Catch ex As Exception
Msg(ex.Message, "Error")
maxRowsGeneral = 0
End Try
con.Close()
End Sub
私も接続がすでに同様閉じていることを言って、エラーを取得しています。私は別のスレッドが接続を終了し、スレッドがタスクの途中にある間に接続を閉じたと仮定しています。
私の質問は、これを処理する最善の方法は何ですか?
一度に1つのスレッドにデータベース接続をオープンしたいだけですか?もしそうなら、一度に一つのスレッドに制限するために、接続を開いたり閉じたりするコードの周りに 'SyncLock'を使いたいかもしれません。それ以外の場合は、接続文字列に 'MultipleActiveResultSets'を有効にしてください。 – jmcilhinney
最大15個のスレッドがありますか? – EJD
jmcihinney - 私は基本的にスレッドが接続を開くことを望み、そのことをして接続を閉じます。私は、各スレッドが独立して接続することを許可され、互いに問題を引き起こさないと考えていました。 – dbooher2011