是否可以一次将整个 VB.NET 数据表插入 SQL Server

Posted

技术标签:

【中文标题】是否可以一次将整个 VB.NET 数据表插入 SQL Server【英文标题】:Is it possible to insert an entire VB.NET DataTable into a SQL Server at once 【发布时间】:2010-12-04 17:23:37 【问题描述】:

我在 VB.NET 中有一个 SQLClient.DataSet,我想将整个内容插入到 SQL Server 表中,而无需执行以下操作:

For Each dr as Datarow in MyDataset
  Dim sc As New SqlCommand("INSERT INTO MyNewTable " & _
                            "VALUES (@column1, @column2)", MyDBConnection)
  sc.Parameters.AddWithValue("@column1", dr.Item(0))
  sc.Parameters.AddWithValue("@column2", dr.Item(1))
  sc.ExecuteNonQuery()
Next

由于我已经接近一百万行(都很瘦,所以空间不大),我显然不想运行这个循环并生成一百万个 INSERT 语句。

我知道一个选项是在我最初获取数据时使用链接服务器,因为它来自另一个 SQL Server,然后将其从那里插入到 INSERT。但是,如果我的应用程序中已经有数据,是否有更有效的方法来批量插入它?我可以以某种方式将 DataTable 作为参数传递给 SQL Server 并让它对其进行排序并插入行吗?

【问题讨论】:

【参考方案1】:

试试SqlBulkCopy

【讨论】:

这看起来正是我想要的。我什至不知道这个课程存在 - 谢谢! 它在大约四秒钟内插入了所有一百万条记录——这太完美了。再次感谢!【参考方案2】:

在 SQL Server 2008 中,您可以使用 Table-Valued Parameters:

Dim sc As New SqlCommand(
  "INSERT INTO MyNewTable (field1, field2,...)"&
    "SELECT field1, field2,... FROM @MyTable;", MyDBConnection) 
sc.Parameters.AddWithValue("@MyTable", MyDataset)  
sc.ExecuteNonQuery()

【讨论】:

我碰巧在使用 2008,这是一个很棒的主意!我想知道性能与 SQLBulkCopy 相比如何——我现在通过千兆 LAN 进行,但是通过较慢的 WAN 连接,有什么比较的想法吗? 性能将由传输速度(客户端到服务器)驱动,并且批量复制和 TVP 之间的数据量差异很小,因此它们的行为应该相似。更好的衡量标准。【参考方案3】:

使用SqlDataAdapter 的InsertCommand 来定义您的插入查询。然后使用您的数据集作为参数调用 DataAdapter 的更新方法以使其推送数据。

类似:

Dim DA As SqlDataAdapter = New SqlDataAdapter
Dim Parm As New SqlParameter

DA.InsertCommand = New SqlCommand("Insert Into tbl1(fld0, fld1, fld2) Values(@fld0, @fld1, @fld2)", conn)
Parm = DA.InsertCommand.Parameters.Add(New SqlParameter ("@fld0", NVarChar, 50, "fld0"))
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld1", SqlDbType.NVarChar, 50, "fld1"))
Parm = sqlDA.InsertCommand.Parameters.Add(New SqlParameter ("@fld2", SqlDbType.NVarChar, 50, "fld2"))
DA.Update(dataset1, "tbl1")

【讨论】:

我考虑过这个想法,但我认为它仍然会为每一行生成一个 INSERT 语句。不过,至少它是在后台执行的,所以它肯定更干净。 我意识到这是一篇旧帖子,但这篇 MSDN 文章似乎与性能相关...如果源表和目标表在同一个 SQL Server 实例中,使用Transact-SQL INSERT ... SELECT 语句复制数据。 msdn.microsoft.com/en-us/library/…【参考方案4】:

您可以在 DataSet 上调用 .WriteXML() 并通过一次插入将其转储到数据库中。

【讨论】:

【参考方案5】:

一种更简单的方法是使用表适配器。然后您可以使用 Fill 方法将数据表作为参数:

    Dim oStronglyTypedTable As StronglyTypedDataTable = GetTable() 'A custom function that creates your table from wherever you want)
    If Not oStronglyTypedTable Is Nothing Then
        Using oAdapter As New StronglyTypedTableAdapter
            Dim res As Integer = oAdapter.Update(oStronglyTypedTable)
            MsgBox(res & " rows have been updated.")
        End Using
    End If

不要忘记将数据库“复制到输出目录”属性更改为“进行网络复制”并正确设置连接字符串...

【讨论】:

以上是关于是否可以一次将整个 VB.NET 数据表插入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?

在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中

一次将datagridview的所有数据插入数据库

SSIS一次将具有起始范围的递增ID插入多个表中

如何一次将数据插入和更新到 EF 多个表中

导出vs 2005(vb.net)中的所有sql表记录