2017-07-19 10 views
-1

多くのPCから1つのテーブルにデータを保存したいのですが、しかし、データには手作業で入力したインデックス(ID)と以前のデータ(ID)からの注文があるので、まずデータベースでチェックしてからインクリメントします。問題は複数のPC /デバイスが一緒にセーブすると、結果。この問題を解決するには?多くのPCのデータを1つのテーブルに保存する方法SQL

これは、使用された最後のID検索のためのクエリです:

> public DataRow GetPlayerIDByClient(object clientPK) 
>   { 
>    DataRow result = null; 
> 
>    if (clientPK != null) 
>    { 
>     IDbDataParameter clientFKParam = this.CreateParameter(csPlayerNamesEntity.Names.ClientFK, clientPK); 
> 
>     string selectCommand = string.Format("SELECT TOP 1 * FROM {0} WHERE {1} = {3} AND " + 
>               "({2} LIKE 'G%' or {2} LIKE 'g%') ORDER BY {4} DESC", 
>               csPlayerNamesEntity.Names.TableName, //0 
>               csPlayerNamesEntity.Names.ClientFK, //1 
>               csPlayerNamesEntity.Names.ID,//2 
>               clientFKParam,//3 
>               csPlayerNamesEntity.Names.PK); //4 
> 
>     DataTable dt = this.ExecReaderDataTable(selectCommand, clientFKParam); 
> 
>     if (dt != null && dt.Rows.Count > 0) 
>     { 
>      result = dt.Rows[0]; 
>     } 
>    } 
> 
>    return result; 
>   } 
+0

Entity Frameworkについて聞きましたか? ASP.NET MVCアプリケーションでデータベースを扱う際の作業がはるかに簡単になります。 – Robert

+0

これは設計上の問題です。複数の可能な解決策があります。中央のインスタンスからクライアントを同期させることができます。または、データをインポート・テーブルに書き込んで、データベース上のジョブがインポートしたデータを本番表に転送させるようにしてください。 –

+0

SQL Serverは、この問題の解決方法を提供します。たとえば、ID列に対してID列(自動インクリメント)を使用することも、シーケンスを使用して次のIDを取得することもできます。 Google for SQL Serverのシーケンス –

答えて

0

を使用すると、複数のソースからの更新のテーブルを持っていて、IDが正しく、かなり共通している2つの解決策がある設定されていることを確認する必要がある場合を。

1つは、プライマリキーをSQL Server自体をインクリメントするID列にすることです。この値をSQL Serverに戻す必要がある場合は、最後にSELECT SCOPE_IDENTITY()を使用してINSERT SQLを作成し、アプリケーションにIDを戻すことができます。 2つのプログラム/マシンを挿入するものはSQL Serverによってマーシャリングされ、重複IDは取得されません。

もう1つの方法は、列をUNIQUEIDENTIFIERにしてアプリケーションからGuidを供給することです。ソースに関係なく一意であるため、異なるマシン/プロセスは衝突しません。ただし、大きなテーブルでは、Idsが連続しないため、パフォーマンスが低下する可能性があります。正しいシーケンスで行を配置するために挿入するときにSQL Serverが行をシャッフルする必要があります。

関連する問題