使用Microsoft同步框架将两个表同步到一个读取表中
我有两个我想同步到读取sql数据库的sql服务器表。我想使用同步框架将来自源数据库的数据平铺到读数据库中的一个表中。我可以这样做吗?使用Microsoft同步框架将两个表同步到一个读取表中
源和目标中的模式需要匹配。您可以添加一个视图,将源数据库中的两个源表连接起来,并以与“读取”数据库期望的格式相同的格式显示数据。
如果您使用的是较早的提供程序(与VS Local Database Cache项目使用的提供程序相同),则可以在服务器端使用一个视图,但是,您的客户端只能是SQL Ce。但即使这很棘手,如果在两个源表上发生更改,是什么限制了更改的行?如果表1更新,表2不是,反之亦然?
较新的SqlSyncProvider提供程序不支持视图,因为其更改跟踪基于触发器,并且整个配置对表都有效。
@Scott,架构或表结构不需要匹配。
我想要做同样的事情,我想。 这是我对计算器的问题: 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