我需要某人在以下方面的专业知识:
我正在为客户端构建一个面向窗口的系统,该系统需要在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";
确保每个约束都恢复原状。