2012-10-25 23 views
-1

我需要有人对以下专业知识:通过XML导出同步SQL Server数据

我建立了一个需要它,他们的.NET 1.1 WinForms应用程序之间同步30余台客户端的面向网络的系统。为了尽量减少为我们的理智的缘故,我们之间的互动,我建议使用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> 

注:两个DB的不必相互访问。传输是通过安全HTTPRequest。

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

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

+1

您是否阅读过Microsoft Sync Framework? – goatshepard

+0

我没有,但在你问之后。是的,它似乎天堂般,直到我读到sql2005R2或更高是必需的,并且客户端使用SQL2000。 –

+3

不幸的是,客户端似乎期望您从头开始重新开发SQL复制或MS Sync。我会投入精力让他们升级,这将使他们花费更少,从长远来看更有利于他们。如果他们不同意,请确保他们清楚地明白他们正在向您付费重新发明轮子,并将您的时间成本与新的SQL Server许可证的成本进行比较。 – Pondlife

回答

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"; 

我然后通过读入ADO.NET数据集,写每一行到相应的导入XML到分级DB表中的数据库。我可以采取很多的自由,因为源表具有完全相同的模式,加上导出的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"; 

为了确保每一个约束是回到它的方式。