合并两个数据表的最佳方法

dr *_*din 1 vb.net datatable

我需要给两个有条件的数据表.我有一个数据表,其中数据来自本地XML数据库,另一个数据表来自远程SQL Server.

如果在远程数据表中进行任何更新,我需要更新/合并本地数据表.这是我到目前为止:

Public Sub MargeTwoTable()

    Dim SQL As String = ""
    Dim RemoteTable As New DataTable
    Dim LocalTable As DataTable
    Dim dal As New DalComon
    Dim yy As Integer = 0
    Dim UpdateDate As String
    Dim TableName As String = "V_Book_Price"


    LocalTable = LoadDataTable(TableName, True)
    UpdateDate = LocalTable.Compute("MAX(update_date)", Nothing)


    SQL = "select * from V_Book_Price where Update_Date > '" & UpdateDate & "'"
    RemoteTable = dal.GetDataSetBySQL(SQL).Tables(0)

    If RemoteTable.Rows.Count > 0 Then

        For i = 0 To RemoteTable.Rows.Count - 1
            Dim st As DataRow


            Dim mm() As DataRow = LocalTable.Select("ID = '" & RemoteTable.Rows(i).Item("ID") & "'")

            If mm.Length = 0 Then

                st = LocalTable.NewRow

                For yy = 0 To RemoteTable.Columns.Count - 1
                    st(yy) = RemoteTable.Rows(i)(yy)
                Next

                LocalTable.Rows.Add(st)

            Else
                st = mm(0)

                For yy = 0 To RemoteTable.Columns.Count - 1
                    If IsDate(RemoteTable.Rows(i)(yy)) Then
                        st(yy) = CDate(RemoteTable.Rows(i)(yy)).ToString("s")
                    Else
                        st(yy) = RemoteTable.Rows(i)(yy)
                    End If
                Next

                mm = Nothing
            End If
        Next

    End If

End Sub
Run Code Online (Sandbox Code Playgroud)

在此代码中,数据来自远程数据库,该数据库更新日期获取器,然后更新本地数据库.两个表都有"ID"作为主键.代码运行良好,但问题是当更新超过1000条记录时,此函数使用循环需要太长时间.

Ste*_*eve 9

不确定是否适用,但你有没有看过 DataTable.LoadDataRow()方法?
替换上面的所有代码似乎是一个很好的选择.

您的代码可以简化为这些行

Dim row as DataRow
For Each row in RemoteTable.Rows
    LocalTable.LoadDataRow(row.ItemArray, false)
Next
Run Code Online (Sandbox Code Playgroud)

另一个替代方案可能是DataTable.Merge,它可以将您的代码切换为单行

LocalTable.Merge(RemoteTable, False)
Run Code Online (Sandbox Code Playgroud)

但是,这两种方法的真正有效性取决于架构兼容性和AutoNumber(标识)列的存在.