【问题标题】:Fill Datatable using SQL 'select' WITHIN A TRANSACTION在事务中使用 SQL 'select' 填充数据表
【发布时间】:2012-08-01 01:02:48
【问题描述】:

我想用来自 SQL 选择语句但使用事务的结果填充数据表。我使用事务的原因是因为我有一个名称列表(作为数据表),并且我想遍历名称列表并选择名称 = 列表中名称的数据库行。数据库中有 500,000 个名称,我只想检索相关行。我有该过程的代码,因为我认为它应该看起来像(未经测试)但我不知道如何将数据放入数据表中......所以我错过了我声明数据表和该表的“填充”的东西,有人可以帮忙吗?或者建议我如何在不单独查找每个名称的情况下从数据库中获取信息。

 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

【问题讨论】:

    标签: sql vb.net sqlite


    【解决方案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),还允许您在需要时将业务逻辑嵌入到类中。

    【讨论】:

    • 列表中可能有大约 500 个名字,我应该说我的 appology,而且我认为 Transactions 也是加速多个数据库查询的好方法。这是我交易的第三天,所以在这方面我相当绿色。
    • 谢谢,这些添加使整个代码完美运行!
    • 想问一下reader解决方案如何实现?虽然上述方法在极端情况下有效,但数据表太大而无法存储在内存中,因此阅读器将是一个很好的解决方案,但是如何在循环名称时执行阅读器?
    猜你喜欢
    • 2016-12-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多