2012-10-25 27 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"; 

爲了確保每一個約束是回到它的方式。