2012-07-26 61 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