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

时间:2009-10-07 17:45:30

标签: sql sql-server vb.net tsql datatable

我在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并让它排序并插入行吗?

5 个答案:

答案 0 :(得分:16)

尝试使用SqlBulkCopy

答案 1 :(得分:7)

使用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()

答案 2 :(得分: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")

答案 3 :(得分:2)

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

答案 4 :(得分:0)

一种更简单的方法是使用表适配器。然后,您可以使用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

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