1

製品に関する情報を保存するさまざまなテーブルを備えたSQLDB(オンラインショップ用)があり、C#でコーディングしています。特定の製品に関連付けられたオプションがあり、前述のように、これらのオプションについて記録された情報は、保存時にいくつかのテーブルに分散されます。

これで、CMSでこの製品を編集するようになると、既存の製品オプションのリストが表示され、期待どおりにそのリストに追加したり、リストから削除したりできます。

製品を保存するとき、レコードがすでに存在するかどうかを確認する必要があります。存在する場合は更新し、存在しない場合は新しいレコードを保存します。私はこれを行うための効率的な方法を見つけようとしています。製品オプションに関連付けられたIDを維持することは非常に重要です。そのため、毎回IDをすべてクリアして再保存することは、残念ながら実行可能ではありません。

もう一度説明すると、おそらくもっと明確に:製品をロードするときにオプションのコレクションがあると想像してください。これはメモリにロードされ、ユーザーの選択に応じて追加/削除されます。彼らが「保存」をクリックしたとき、私はどのオプションが更新であり、どのオプションがリストに新しく追加されたかを確認する必要があります。

これを行うための効率的な方法の提案はありますか?

ありがとう。

4

3 に答える 3

1

私は通常、次のことを実行してこれを行います。

  1. アイテムごとに、アイテムが存在する場合はそのアイテムを更新する更新クエリを実行します。
  2. 更新するたびに、更新された行数を確認します(SQLServerの@@ROWCOUNTを使用)。ゼロ行が更新された場合は、挿入を実行して行を作成します。

または、行の重複を防ぐ一意の制約を作成する場合は、逆のことを行うことができます。

  1. アイテムごとに挿入してみてください。
  2. 制約のために挿入が失敗した場合(エラーコードを確認してください)、代わりに更新を実行してください。
于 2011-02-02T18:13:26.110 に答える
1

達成しようとしている効率がデータベースへのラウンドトリップの数に関連している場合は、更新または挿入を行うためのストアドプロシージャを作成できます。

ただし、ほとんどの場合、最初にSELECTを回避する必要はありません。ただし、テーブルに適切な主キーまたは一意のインデックスがある場合、これは非常に高速です。

効率がサーバー側の洗練されたコードまたは削減されたコードの観点から見た場合、私はある種のORM、たとえばEntityFramework4.0の使用を検討します。適切なORMアーキテクチャを使用すると、データベースレコードとINSERT / UPDATEの観点から考えるのをほとんどやめ、メモリ内のオブジェクトのコレクションを操作することができます。

于 2011-02-02T18:17:46.023 に答える
0

IDの選択クエリチェックを実行します。存在する場合は、更新する必要があります。存在しない場合は、挿入する必要があります。

詳細がなければ、他に何を言うべきかよくわかりません。これはかなり標準的です。

于 2011-02-02T18:08:22.553 に答える