跨非链接SQL Server的批量更新表

时间:2011-08-22 19:06:01

标签: c# .net sql-server vb.net ado.net

我正在尝试使用以下方法更新“非链接”SQL服务器上的表: C#或VB.net和ADO.net SqlDataAdapter

我需要使用DataTableSqlDataAdapter

非常重要:我需要使用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。

3 个答案:

答案 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(如果您对此感到满意,可能不会有问题)。