-1

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

我正在为需要在它和他们的 .NET 1.1 WinForms 应用程序之间同步 30 多个表的客户端构建一个面向 Web 的系统。为了我们双方的理智,为了尽量减少我们之间的互动,我建议使用 XML,就像这样

SELECT *
FROM table1
FOR XML AUTO, XMLDATA

需要注意的是,我需要主键在源数据库和目标数据库之间保持相同。有没有一种优雅的方式来导入 XML?每次有数据同步时,我不想编写丑陋的 SQL 来删除和重新创建表和关系。有没有办法通过 ADO.NET 或 Entity Framework 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> 

注意:这两个数据库不能互相访问。传输是通过 Secure HTTPRequest 进行的。

更新 2:Winforms 应用程序使用 SQL2000,这使得使用同步框架变得不可能,显然......

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

4

1 回答 1

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 导入到暂存数据库中。我可以采取很多自由,因为源表具有完全相同的架构,而且导出的 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";

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

于 2012-11-02T10:29:15.387 回答