現在のプロジェクトでは、SQL Server 2008、visual studio 2008、linq、ado.netを使用しています。このプロジェクトはWebとデスクトップで実装されています。identity_insertと同期の問題
私の問題は、Web DBとデスクトップDBの間のデータの同期です。ここ
同期は以下の通りです:クライアントに挿入
- 新しいデータがサーバーに同期されます。
- クライアントの更新されたデータがサーバーに同期されます。
ここで私のテーブル構造を見せてください。
私たちは私のテーブル名がフィールド
顧客
...................
customerno、BIGINT、主キーと "顧客" であると仮定してみましょう、nullでない、アイデンティティ真(1から始まる)
FIRSTNAME、...
姓、...
今私は、クライアントで同じテーブルを持っていますが、主キーのIDが20000本を開始します主キーの識別情報は、クライアントシステムの数によって異なります。テーブルに1枚のレコードと
サーバがcustomerno 1から始まる=次のシナリオを考えてみましょう
CLIENT1 = customernoテーブル内の2つのレコードで、20000で始まる
クライアント2 = customernoテーブル
今私は、LINQのdoesntのサポートIDENTITY_INSERT、イム使用してado.netとして、次のコード
cmd.CommandText = "set identity_insert " + tableName + " on";
cmd.ExecuteNonQuery();
foreach (string query in this.queries)
{
cmd.CommandText = query; // this is my insert query
cmd.ExecuteNonQuery();
}
cmd.CommandText = "set identity_insert " + tableName + " off";
cmd.ExecuteNonQuery();
を使用して、CLIENT1で同期を押すと
私のコードでは、最初にidentity_insertをオンに設定し、データを挿入し、最後にidentity_insertをオフに設定します。
ここで私の問題は、データがclient1、 から同期され、2つのレコードが20001,20002というcustomernoを持つサーバーに挿入されたことです。 http://msdn.microsoft.com/en-us/library/ms188059.aspx
サーバにおけるcustomernoカラムの同一の通り
は(この場合には20002となる)最大値に設定されています。私は、サーバーにデータを挿入する際
は今、それは私が最大値を取るために、サーバーのID列をたくないここ20003.
としてcustomernoを挿入します。
上記のように考えると、同期する前にサーバーに1レコードあり、そのIDは1であるため、1つまたは複数のクライアントと同期した後、サーバーの次のID(customerno)サーバーに新しく挿入されたデータの場合は3,4 .....となります。
ここでは、任意の時点で任意のクライアントがサーバーとデータを同期できます。
GUIDが良好な新しい列を使用しています。私のデータベースのすべてのテーブルを変更する必要があります。 – Harsha
データベースの –