2012-07-26 91 views

回答

1

源和目標中的模式需要匹配。您可以添加一個視圖,將源數據庫中的兩個源表連接起來,並以與「讀取」數據庫期望的格式相同的格式顯示數據。

0

如果您使用的是較早的提供程序(與VS Local Database Cache項目使用的提供程序相同),則可以在服務器端使用一個視圖,但是,您的客戶端只能是SQL Ce。但即使這很棘手,如果在兩個源表上發生更改,是什麼限制了更改的行?如果表1更新,表2不是,反之亦然?

較新的SqlSyncProvider提供程序不支持視圖,因爲其更改跟蹤基於觸發器,並且整個配置對錶都有效。

@Scott,架構或表結構不需要匹配。

0

我想要做同樣的事情,我想。 這是我對計算器的問題: Merging 2 tables in a single table with different schema

我曾在這個問題上的一些時間和我達成了一些結果... 現在,我工作中的變化的僅爲跟蹤的情況下, PERSON表(所以如果ADDRESS中的某些內容發生更改,則更改不會同步)。但我想代碼可以改進以跟蹤ADDRESS中的變化......而現在我沒有考慮到目標數據庫中的變化(在CUSTOMER表中)。這將是更難以編碼,我想...

無論如何,我的解決方案添加一個處理程序changesSelected,那裏我改變了DataTable添加我需要的列(地址和城市)。我通過sql SELECT獲取地址和城市,並更新行...這適用於更新和插入的行... 問題引發了刪除的行。在我的db CUSTOMER中,主鍵必須是Id-Address,而不僅僅是Id(或者我不能爲每個人擁有多個ADDRESS)。因此,當SyncFX嘗試執行刪除操作時,鍵不匹配,並且刪除操作不會影響任何行...我不知道如何更改刪除狀態的DataRow,而且我也無法獲取從數據庫的地址...所以我不能有刪除的DataRow中的Id-Address信息...現在,我只能使用Id(唯一可用的信息爲已刪除的行)執行一個sql刪除。 ..

請嘗試改進代碼併發回,以便我們可以互相幫助!

這是代碼。首先是addhandler,然後將代碼放入處理程序。

AddHandler remoteProvider.ChangesSelected, AddressOf remoteProvider_ChangesSelected 

...

Private Shared Sub remoteProvider_ChangesSelected(ByVal sender As Object, ByVal e As DbChangesSelectedEventArgs) 

     If (e.Context.DataSet.Tables.Contains("PersonGlobal")) Then 
      Dim person = e.Context.DataSet.Tables("PersonGlobal") 

      Dim AddressColumn As New DataColumn("Address") 
      AddressColumn.DataType = GetType(String) 
      AddressColumn.MaxLength = 10 
      AddressColumn.AllowDBNull = False 
      'NULL is not allowed, so set a defaultvalue 
      AddressColumn.DefaultValue = "Nessuna" 

      Dim CityColumn As New DataColumn("City") 
      CityColumn.DataType = GetType(String) 
      CityColumn.AllowDBNull = False 
      CityColumn.DefaultValue = 0 

      persona.Columns.Add(AddressColumn) 
      persona.Columns.Add(CityColumn) 

      Dim newPerson = person.Clone() 

      For i = 0 To person.Rows.Count - 1 Step 1 

       Dim row = person.Rows(i) 

       If (row.RowState <> DataRowState.Deleted) Then 
        Dim query As String = "SELECT * FROM dbo.address WHERE Id = " & row("AddressId") 

        Dim sqlCommand As New SqlCommand(query, serverConn) 
        serverConn.Open() 
        Dim reader As SqlDataReader = sqlCommand.ExecuteReader() 
        Try 
         While reader.Read() 
          row("Address") = CType(reader("Address"), String) 
          row("City") = CType(reader("City"), String) 
          ' Solo importando mantengo i valori di RowState 
          newPerson.ImportRow(row) 
         End While 
        Finally 
         reader.Close() 
        End Try 
        serverConn.Close() 
       Else 
        ' TODO - Non funziona la cancellazione!!! 
        ' La cancellazione cerca la chiave primaria su cliente, che è ID-Via 
        ' Noi abbiamo l'ID corretto, ma "nessuna" come via... 
        ' Dobbiamo recuperare la via giusta... 

        Dim query As String = "DELETE FROM dbo.customer WHERE Id = " & row("Id", DataRowVersion.Original) 

        Dim sqlCommand As New SqlCommand(query, clientConn) 
        clientConn.Open() 
        sqlCommand.ExecuteNonQuery() 
        clientConn.Close() 
       End If 
      Next 

      newPerson.Columns.Remove(newPerson.Columns("AddressId")) 

      e.Context.DataSet.Tables.Remove(person) 
      e.Context.DataSet.Tables.Add(newPerson) 
     End If 

    End Sub