Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从外部数据库表ADO.NET维护表的本地副本_C#_Ado.net - Fatal编程技术网

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

C# 从外部数据库表ADO.NET维护表的本地副本,c#,ado.net,C#,Ado.net,我们已经构建了一个应用程序,它需要来自另一个数据库的表的本地副本。我想写一个ado.net例程,它将保持本地表与主表同步。使用.NET2.0、C#和ADO.net。 请注意,我真的无法控制主表,它位于第三方、任务关键型应用程序中,我不想弄乱它 例如,以下是主数据表: ProjectCodeId Varchar(20) [PK] ProjectCode Varchar(20) ProjectDescrip Varchar(50) OtherUneededField int

我们已经构建了一个应用程序,它需要来自另一个数据库的表的本地副本。我想写一个ado.net例程,它将保持本地表与主表同步。使用.NET2.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等


当然,截断本地表并每次从主表中重新填充它是一种选择,但是对于数千行,我认为这不是很有效。你知道吗?

我会将插入数据的应用程序插入到同一函数中的一个db/表中,然后再插入另一个db/表。如果让应用程序执行该操作,数据库将被推送。

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

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

我假设你只是使用这些数据作为查找。。。由于您没有时间戳,也无法修改现有的表,所以我会定期清理本地副本,然后再次从主表中将其下拉

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


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

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

我假设你只是使用这些数据作为查找。。。由于您没有时间戳,也无法修改现有的表,所以我会定期清理本地副本,然后再次从主表中将其下拉

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


如果需要同步回主表,则需要执行一些更奇特的操作。

是否可以使用SQL复制?这比编写代码更可取不?

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

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

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

见“

查询通知是在中引入的 MicrosoftSQLServer2005和 中的System.Data.SqlClient命名空间 ADO.NET 2.0。基于该服务构建 代理基础设施,查询 通知允许应用程序 数据更改时通知。此 此功能对于以下情况特别有用: 提供数据缓存的应用程序 来自数据库的信息,例如 Web应用程序,并且需要 当源数据被删除时通知 已更改。

要应用源db表中的更改,需要从目标db表中检索数据,将更改应用到目标行,然后将更改发布回目标db

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

删除和重新插入是不言自明的,所以我不会详细说明

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

  • 您需要确定修改了哪些行,并标识插入的行和删除的行。创建一个数据视图,对每个表进行排序,以获得一个查找方法,您可以使用该方法按ID查找匹配的行
  • 通过使用datetime/timestamp列或通过比较所有字段值来标识修改的行。将修改的值复制到目标行
  • 通过在各自的表数据视图上循环并使用其他数据视图的Find方法来标识未出现在第一个表中的行,从而标识添加的行和删除的行。根据需要从目标表中插入或删除行。(delete方法不会删除该行,但会通过TableAdapter更新将其标记为删除。)

    祝你好运


+汤姆

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

若要跟踪对源数据库的更改,可以对源数据库使用查询通知。这需要对数据库具有特殊权限,因此源数据库的所有者需要采取措施来启用此解决方案。我自己没有使用过此技术,但下面是对其的说明

见“

查询通知是在中引入的 MicrosoftSQLServer2005和 中的System.Data.SqlClient命名空间 ADO.NET2.0。以服务为基础 代理基础设施,查询 通知允许应用程序 当da