0

SQL select ステートメントの結果をデータテーブルに入力したいのですが、トランザクションを使用しています。トランザクションを使用している理由は、(データテーブルとして) 名前のリストがあり、名前のリストを反復処理して、名前がリスト上の名前であるデータベース行を選択したいからです。データベースには 500,000 の名前があり、関連する行のみを取得したいと考えています。(テストされていない)ように見えると思うので、手順のコードがありますが、データをデータテーブルに配置する方法がわかりません....だから、データテーブルとそのテーブルの「塗りつぶし」を宣言する場所がありません、誰かがこれを手伝ってくれますか? または、各名前を個別に検索せずに、Batabase から情報を取得する方法を提案してください。

 Using connection As New SQLite.SQLiteConnection(R2WconectionString)
            connection.Open()
            Dim sqliteTran As SQLite.SQLiteTransaction = connection.BeginTransaction()
            Try
                oMainQueryR = "SELECT NameID, Address, Ocupation FROM Employees Where Name= :Name"
                Dim cmdSQLite As SQLite.SQLiteCommand = connection.CreateCommand()
                With cmdSQLite
                    .CommandType = CommandType.Text
                    .CommandText = oMainQueryR
                    .Parameters.Add(":Name", SqlDbType.VarChar)
                End With
               'Prevent duplicate selects by using a dictionary
                Dim NameInalready As New Dictionary(Of String, String) 

                For Each row As DataRow In TheLIST.Rows
                    If NameInalready.ContainsKey(row.Item("Name")) Then
                    Else
                        NameInalready.Add(row.Item("Name"), "")
                        cmdSQLite.Parameters(":Name").Value = row.Item("Name")
                        cmdSQLite.ExecuteNonQuery()
                    End If

                Next

                sqliteTran.Commit()

            Catch ex As Exception
            End Try
        End Using
4

1 に答える 1

1

まず、データベースを更新していないため、トランザクションは必要ありません。

次に、TheLIST内の可能な名前の数によっては、名前セレクターをに変更する価値がある場合がありますIN(つまりSELECT * FROM Employees WHERE Name IN ('name1', 'name2')、約10を超えると予想される場合、これはおそらく問題になりません。

最後に、結果を保持するために新しいDataTableを作成する必要があります。次に、コンストラクターパラメーターとしてcmdSqlLiteを渡すDataAdapterを作成する必要があります。最後に、ExecuteNonQueryをDataAdapter.Fill(DataTable)に置き換えます。

例(後Dim cmdSQLite):

Dim oDataTable As New DataTable("Employees")
Dim oAdapter As New SqliteDataAdapter(cmdSQLite)

ExecuteNonQuery行を次のように置き換えます。

oAdapter.Fill(oDataTable)

微調整が必​​要な場合があると言って、このコードを修飾します。私はクラスオブジェクトとコレクションのみを操作するので、実際にはEmployeeクラスインスタンスのコレクションをロードすることを好みます。

ExecuteNonQueryをExecuteReaderに置き換えてから、読み取ったデータを新しいクラスインスタンスにロードすることで、これを実行できます。このタイプのアプローチは、サービスの境界を越えてデータをシリアル化する際のさまざまな問題(つまり、Webサービスの場合はXml)を解決し、必要に応じてビジネスロジックをクラスに埋め込むこともできます。

于 2012-08-01T01:15:26.000 に答える