2012-05-20 2 views
1

조건부로 두 개의 데이터 테이블을 채워야합니다. 필자는 로컬 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 개가 넘는 레코드가 업데이트되면이 함수는 루프를 사용하는 데 너무 오래 걸리는 것입니다.

답변

5

해당하는 경우 확실하지 않지만 DataTable.LoadDataRow() 방법을 살펴 보았습니까?
위 코드를 모두 대신 사용하는 것이 좋습니다.

귀하의 코드는 또 다른 대안이

LocalTable.Merge(RemoteTable, False) 

그러나 한 줄에 코드를 절단 할 수있는 DataTable.Merge,이 두 가지 방법의 실제 효과가 될 수

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

이 라인을 단순화 할 수

스키마 호환성 및 일련 번호 (ID) 열의 존재 여부에 따라 다릅니다.

관련 문제