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

时间:2012-05-20 07:54:59

标签: 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

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

1 个答案:

答案 0 :(得分:9)

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

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

Dim row as DataRow
For Each row in RemoteTable.Rows
    LocalTable.LoadDataRow(row.ItemArray, false)
Next

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

LocalTable.Merge(RemoteTable, False)

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