1

私は現在ここで闘争中です。

環境: MSSQL Server 2008 R2 を使用して C# 4.0 でアプリケーションを改善してい ますどのタイプの ORM も使用していません。

デザイン/モデル: (架空) 会話、メッセージ、添付ファイルがあります。会話には複数のメッセージがあり、各メッセージには複数の添付ファイルを含めることができます。とても簡単な 1 .. N 接続があります。

問題:新しい会話メッセージと新しい添付ファイルを含む新しい会話を DB に保存したいと考えています。今の私の状況は、会話を保存してトップダウンに行くというものです。その ID を取得し、その ID をメッセージ オブジェクトに設定してメッセージを保存します (個別の db 呼び出しを行うたびに)。すべての添付ファイルについても同じ話ですが、これらの添付ファイルを保存する前に、まずメッセージを保存する必要があります。

私が調べた、または考えていた私の解決策

  • 現在、ストアド プロシージャを使用して、これらの手順を個別に、トップダウンの保存メカニズムで行っています。

  • SqlBulkCopy : 本当に高速です。すべての会話を保存し、ID を取得し、すべてのメッセージを保存し、ID を取得するなどを念頭に置いていましたが、問題はここにあります。実行可能ですが、このアプリケーションがマルチスレッド化されているという事実により、その瞬間に他のスレッドが新しい行を挿入したり、さらに悪いことに削除したりする可能性があります。

  • ストアド プロシージャを作成して、データセット オブジェクトを送信するクレイジーなストアド プロシージャを作成します (これは、より自由なブレインストーミングです)。

  • 会話を保存し、生成された ID を取得し、それを子オブジェクトに使用する巨大な SQL コマンドを手動で生成します。同様に (疑似 SQL):

    会話を挿入

    currentConversationId = @Identity

    conversationId = currentConversationId の INSERT メッセージ

目標 誰かがより良い提案や代替案を持っていますか。私はレガシー プロジェクトで作業しているので、ORM に行くようにアドバイスしないでください。DB 呼び出しをできるだけ節約したいと考えています。

4

2 に答える 2

2

テーブル値パラメーターを使用して複数の行を送信し、1 回の呼び出しで挿入します。このOUTPUT INSERTED.ID句を使用して、作成された ID を取得できます。ステートメントを使用するMERGEと、ID だけでなく、TVP から元の値も取得できます。これは、ID を TVP 行に一致させるのに役立ちます。それは次のようになります。

OUTPUT @tvp.SomeID, INSERTED.ID
于 2013-07-14T16:41:30.333 に答える
1
  1. 他のスレッドがデータをいじることができないように、テーブル ロックを使用して SqlBulkCopy を実行します。
  2. コードでクエリを生成する=>これを行う多くのプロジェクトを知っており、これは一括挿入に受け入れられるようです...
  3. usr の回答、TVP を使用し、ID をカスタム生成された番号と関連付けます
  4. あなたのIDのGUIDに切り替えます(DBAはこれであなたを殺します:-P)

幸運を!

于 2013-07-15T10:22:56.207 に答える