通过XML导出同步SQL Server数据



我需要某人在以下方面的专业知识:

我正在为客户端构建一个面向窗口的系统,该系统需要在IT和他们的.NET 1.1 Winforms应用程序之间同步30 odd表。为了使我们之间的互动最小化,我建议使用XML,例如So

SELECT *
FROM table1
FOR XML AUTO, XMLDATA

注意事项是我需要主要密钥在源和目标数据库之间保持相同。有没有一种优雅的导入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,这使得使用同步框架变得不可能,显然...

更新3:让我们把它作为一个给定的,我被卡住了必须以这种方式做事。.NET应用程序部署在各个第三方站点,每个站点都有单独的DB副本,并连接到Web应用程序的单独实例。出于所有意图和目的,这是一个经销商软件包:物理店面组件和在线商店组件。一些第三方拒绝从SQL2000升级。

好吧,所以我把这个问题交给了我们的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数据集中并将每一行写入DB中的相应表中,将XML导入了登台DB。我可以进行很多自由度,因为源表具有完全相同的模式,再加上导出的XML在标题中具有模式,因此所有内容都很简单。

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

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

然后从目标表中删除所有内容。我不能简单地运行[exec sp_msforeachtable" alter table?nocheck约束"],因为目标db中有额外的表格。

我只是做一个

SELECT INTO 

从每个表格中的每个表格到目标中的重复。最后,我运行

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

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

最新更新