我在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并让它排序并插入行吗?
答案 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
不要忘记将数据库的“复制到输出目录”属性更改为“执行网络复制”并正确设置连接字符串...