我正在尝试使用以下方法更新“非链接”SQL服务器上的表:
C#或VB.net和ADO.net SqlDataAdapter
。
我需要使用DataTable
和SqlDataAdapter
。
非常重要:我需要使用BatchUpdate
并避免循环遍历DataTable
。
服务器1中的表格设计与服务器2中的表格设计不同。
来源表:
Server 1. Table 1
ID INT
NAME Varchar(30)
Date DateTime
目的地表:
Server 2. Table 2
ID INT
TableOneId INT (Foreign Key from Server 1. Table 1)
NAME Varchar(30)
Date DateTime
我需要一个示例,说明如何使用SqlDataAdapter
或其他批处理方法更新服务器2上的表2。
答案 0 :(得分:1)
您应该将SqlDataAdapter的UpdateBatchSize属性设置为0(无限制)。 我没有看到在没有循环table1的情况下更新table2的方法。
以下是一个示例代码,向您展示实现此目的的一种方法:
Public Sub BatchUpdate(ByVal table1 As DataTable)
Dim connectionStringServer2 As String = GetConnectionString()
Using connection As New SqlConnection(connectionStringServer2)
Dim adapter As New SqlDataAdapter()
'Set the UPDATE command and parameters'
adapter.UpdateCommand = New SqlCommand( _
"UPDATE Table2 SET " _
& "NAME=@NAME,Date=@Date WHERE TableOneId=@TableOneId;", _
connection)
adapter.UpdateCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.UpdateCommand.Parameters.Add("@Date", _
SqlDbType.DateTime, 0, "Date")
adapter.UpdateCommand.Parameters.Add("@TableOneId", _
SqlDbType.Int, 0, "TableOneId")
adapter.UpdateCommand.UpdatedRowSource = _
UpdateRowSource.None
' Set the batch size,'
' try to update all rows in a single round-trip to the server'
adapter.UpdateBatchSize = 0
Dim table2 As New DataTable("table2")
table2.Columns.Add(New DataColumn("Name", GetType(String)))
table2.Columns.Add(New DataColumn("Date", GetType(Date)))
table2.Columns.Add(New DataColumn("TableOneId", GetType(Int32)))
' copy content from table1 to table2'
For Each row As DataRow In table1.Rows
Dim newRow = table2.NewRow
newRow("TableOneId") = row("ID")
newRow("Name") = row("Name")
newRow("Date") = row("Date")
table2.Rows.Add(newRow)
' note: i have not tested following, but it might work or give you a clue'
newRow.AcceptChanges()
newRow.SetModified()
Next
' Execute the update'
adapter.Update(table2)
End Using
End Sub
答案 1 :(得分:0)
由于您的DataTable具有不同的模式,因此您必须遍历DataTable中的每一行,以使其正确地从一个端口移植到另一个。
如果是我,那将是我最不关心的事情。那会很快。最大的问题是内存使用和网络速度。
您将不得不拥有两个DataTable,两个DataAdapter和两个数据库(每个服务器一个)。这是很多工作要做。循环应该不那么令人担忧。
(虽然,我同意服务器2的DataTable上的批量更新是明智的。)
答案 2 :(得分:0)
如果您使用的是SQLServer 2008或更高版本,则使用SqlDataAdapter的替代方法可能是使用表值参数:
http://msdn.microsoft.com/en-us/library/bb675163.aspx
所以步骤是:
1)将源数据读入DataTable
2)在目标数据库中写入一个新的存储过程,它将执行导入。这将采用表值参数作为其参数之一。您将在步骤1)中创建的DataTable传递给此存储过程。
优点:完全控制导入过程。可能比使用SqlDataAdapter更好的性能。例如你可以编写T-SQL来一次更新整个表。
缺点:需要编写一些T-SQL(如果您对此感到满意,可能不会有问题)。