我想用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
答案 0 :(得分:1)
首先,您不需要事务,因为您没有更新数据库。
其次,根据TheLIST中可能的名称数量,您可能值得将名称选择器更改为IN
(即SELECT * FROM Employees WHERE Name IN ('name1', 'name2')
。但是,如果您希望超过10,这可能不值得麻烦。
最后,您需要创建一个新的DataTable来保存结果。然后,您需要创建一个传递cmdSqlLite作为构造函数参数的DataAdapter。最后,用DataAdapter.Fill(DataTable)替换你的ExecuteNonQuery。
例如(在Dim cmdSQLite
之后):
Dim oDataTable As New DataTable("Employees")
Dim oAdapter As New SqliteDataAdapter(cmdSQLite)
并将ExecuteNonQuery
行替换为:
oAdapter.Fill(oDataTable)
我将通过说它可能需要一些调整来限定此代码。我只使用类对象和集合,所以我的偏好实际上是加载Employee类实例的集合。
我会通过用ExecuteReader替换ExecuteNonQuery,然后将读取的数据加载到新的类实例中来实现。这种方法解决了跨服务边界序列化数据的各种问题(即Web服务的Xml),还允许您将业务逻辑(如果需要)嵌入到类中。