1

2つのデータテーブルを条件付きでマージする必要があります。データがローカルXMLデータベースからのものであるデータテーブルと、データがリモートSQLServerからのものである別のデータテーブルがあります。

リモートデータテーブルで更新が行われた場合は、ローカルデータテーブルで更新/マージする必要があります。これが私がこれまでに持っているものです:

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を超えるレコードが更新されると、ループを使用するとこの関数に時間がかかりすぎることです。

4

1 に答える 1

11

適用できるかどうかはわかりませんが、 DataTable.LoadDataRow()メソッドを見たことがありますか?
上記のすべてのコードを置き換えるのは良い候補のようです。

コードはこれらの行に簡略化できます

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

もう1つの方法は、コードを1行にカットできるDataTable.Mergeです。

LocalTable.Merge(RemoteTable, False)

ただし、これら2つの方法の実際の効果は、スキーマの互換性とAutoNumber(ID)列の存在に依存します。

于 2012-05-20T08:33:48.277 に答える