从外部数据库表ADO.NET维护表的本地副本

时间:2009-02-18 05:05:39

标签: c# ado.net

我们构建了一个需要来自另一个数据库的表的本地副本的应用程序。我想编写一个ado.net例程,它将使本地表与主服务器保持同步。使用.net 2.0,C#和ADO.NET 请注意我真的无法控制主表,这是第三方,我不想搞砸的关键任务应用程序。

例如,这是主数据表:

ProjectCodeId   Varchar(20)   [PK]
ProjectCode     Varchar(20)
ProjectDescrip  Varchar(50)
OtherUneededField    int
OtherUneededField2   int

我们需要保持同步的本地表...

ProjectCodeId   Varchar(20)   [PK]
ProjectCode     Varchar(20)
ProjectDescrip  Varchar(50)

或许更好的解决这个问题的方法是你过去对这类问题做了什么?什么最适合你或应该不惜一切代价避免?

我对这个问题的目标是确定一个处理这个问题的好方法。因此,我经常将两个或多个脱节数据源的数据组合在一起。由于这个原因,我没有包含数据库平台,它确实应该没关系。在目前的情况下,两个数据库都是MSSQL,但我更喜欢不使用链接数据库或DTS等的解决方案。

当然,截断本地表并每次从主服务器重新填充它是一个选项,但是有数千行我不认为这是非常有效的。你呢?

4 个答案:

答案 0 :(得分:1)

编辑:首先,要认识到您正在做的是手动复制和复制从不简单。 您需要跟踪并应用所有CRUD状态更改。也就是说,ADO.NET可以做到这一点。

要跟踪对源的更改,您可以对源数据库使用“查询通知”。这需要对数据库的特殊权限,因此源数据库的所有者需要采取措施来启用此解决方案。我自己没有使用过这种技术,但这里有一个描述。

请参阅“Query Notifications in SQL Server (ADO.NET)"

  

引入了查询通知   Microsoft SQL Server 2005和   System.Data.SqlClient命名空间   ADO.NET 2.0。以服务为基础   经纪人基础设施,查询   通知允许应用程序   数据发生变化时通知。 :此   功能特别有用   提供缓存的应用程序   来自数据库的信息,例如   Web应用程序,需要   在源数据通知时通知   改变。

要从源db表应用更改,您需要从目标db表中检索数据,将更改应用于目标行并将更改发布回目标db。

要应用更改,您也可以 1)删除并重新插入所有行(简单),或 2)合并逐行更改(硬)。

删除并重新插入是不言自明的,所以我不会详细介绍。

对于逐行更改跟踪,这是一种方法。 (我在这里假设查询通知不会给你逐行更改信息,所以你必须计算它。)

  • 您需要确定修改了哪些行并识别插入和删除的行。使用每个表的排序创建一个DataView,以获取可用于按ID查找匹配行的Find方法。
  • 使用datetime / timestamp列或通过比较所有字段值来标识已修改的行。将修改后的值复制到目标行。
  • 通过循环遍历相应的表DataView并使用其他DataView的Find方法识别第一个表中未显示的行来识别添加和删除的行。根据需要从目标表中插入或删除行。 (Delete方法不会删除该行,但会将其标记为由TableAdapter Update删除。)

    祝你好运!

+汤姆

答案 1 :(得分:0)

我会推动插入数据的应用程序将插入到一个db / table中然后另一个插入到同一函数中的方向。让应用程序完成工作,数据库将被推送。

答案 2 :(得分:0)

一些问题 - 什么是db平台?你是如何使用数据的?

我假设您只是将这些数据用作查找...并且由于您没有时间戳而且没有能力修改现有表格,我只是定期吹掉本地副本并将其下拉从主表再次。

除非你有大量的数据,否则这个开销应该很小。

如果你需要同步回主表,你需要做一些更奇特的事情。

答案 3 :(得分:0)

您可以使用SQL复制吗?这比编写代码更好吗?