-1

次のことについて誰かの専門知識が必要です。

クライアントと .NET 1.1 WinForms アプリケーションの間で 30 奇数のテーブルを同期する必要があるクライアント用の Web 向けシステムを構築しています。私たちの正気を保つために私たちの間のやり取りを最小限に抑えるために、私は XML を使用することを提案しました。

SELECT *
FROM table1
FOR XML AUTO, XMLDATA

注意点は、ソース DB と宛先 DB の間で主キーを同じままにする必要があることです。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> 

注: 2 つの DB は相互にアクセスできません。トランスポートは Secure HTTPRequest 経由です。

更新 2: Winforms アプリは SQL2000 を使用しているため、同期フレームワークの使用が不可能になっているようです...

更新 3: この方法で物事を行う必要があり、行き詰まっていることを前提として考えてみましょう。.NET アプリはさまざまなサード パーティのサイトにデプロイされ、それぞれが DB の個別のコピーを持ち、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 DataSet に読み取り、各行を DB の対応するテーブルに書き込むことで、XML をステージング DB にインポートします。ソース テーブルにはまったく同じスキーマがあり、さらにエクスポートされた XML にはヘッダーにスキーマが含まれているので、すべてが簡単です。

次に、最初に起動するターゲット DB でカスタム ストアド プロシージャを実行します。

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

次に、ターゲット テーブルからすべてを削除します。[EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"] を単純に実行することはできません。これは、ターゲット DB に追加のテーブルも影響を受けるためです。

次に、単に

SELECT INTO 

ステージングの各テーブルからターゲットの複製に。最後に、私は実行します

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";

すべての制約が元の状態に戻っていることを確認します。

于 2012-11-02T10:29:15.387 に答える