通过xml导出同步SQL Server数据

时间:2012-10-25 12:45:44

标签: sql-server ado.net sql-server-2000 data-synchronization

我需要以下人员的专业知识:

我正在为客户端构建面向Web的系统,该系统需要在它与.NET 1.1 WinForms应用程序之间同步30多个表。为了最大限度地减少我们之间的互动,我建议使用XML,就像这样

SELECT *
FROM table1
FOR XML AUTO, XMLDATA

需要注意的是,我需要主键在源DB和目标DB之间保持相同。有一种优雅的方式导入XML吗?每次有数据同步时,我都不想写丑陋的SQL来删除并重新创建表和关系。有没有办法通过ADO.NET或实体框架3告诉数据库“看,这是你的数据,请使用它而不是你现在拥有的”?

以下是导出的XML的示例:

<taxGroup>
   <Schema name="Schema29" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
      <ElementType name="taxGroup" content="empty" model="closed">
         <AttributeType name="taxGroupId" dt:type="i8"/>
         <AttributeType name="regionId" dt:type="i8"/>
         <AttributeType name="description" dt:type="string"/>
         <AttributeType name="percentage" dt:type="number"/>
         <AttributeType name="exportNumber" dt:type="string"/>
         <attribute type="taxGroupId"/>
         <attribute type="regionId"/>
         <attribute type="description"/>
         <attribute type="percentage"/>
         <attribute type="exportNumber"/>
      </ElementType>
   </Schema>
   <taxGroup xmlns="x-schema:#Schema29" taxGroupId="38000001" regionId="1482000001" description="VAT" percentage="0.1400" exportNumber=""/>
   <taxGroup xmlns="x-schema:#Schema29" taxGroupId="38000002" regionId="1482000001" description="VAT2" percentage="0.1700" exportNumber=""/>
</taxGroup> 

注意:两个DB无法相互访问。传输是通过安全HTTPRequest。

更新2:Winforms应用程序使用SQL2000,这使得使用Synch Framework变得不可能,显然......

更新3:让我们假设我不得不以这种方式做事情。 .NET应用程序部署在各个第三方站点,每个站点都有一个单独的数据库副本,并连接到Web应用程序的单独实例。它是一个经销商软件包,用于所有意图和目的:物理店面组件和在线商店组件。有些第三方拒绝从SQL2000升级。

1 个答案:

答案 0 :(得分:0)

好的,所以我把这个问题带到了MD,他是前世的系统架构师。他建议我将XML导入到一个具有相同结构的独立数据库中。在添加数据之前,我禁用了约束检查并清空了暂存中的所有表:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";
EXEC sp_msforeachtable "DELETE FROM ? ";
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";

然后,我将XML读入到临时数据库中,方法是将其读入ADO.NET数据集,并将每行写入数据库中的相应表。我可以采取很多自由,因为源表具有完全相同的模式,并且导出的XML在标题中具有模式,因此一切都很简单。

然后我在首先触发的目标数据库上执行自定义存储过程

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

然后删除目标表中的所有内容。我不能简单地运行[EXEC sp_msforeachtable“ALTER TABLE?NOCHECK CONSTRAINT all”],因为目标数据库中还有额外的表也会受到影响。

然后我只是做了一个

SELECT INTO 

从分段中的每个表到目标中的副本。 最后,我运行

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

确保每个约束都恢复原状。