2011-02-02 7 views
1

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

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

私は製品が保存されているかどうかをチェックし、そうでなければ新しいレコードを保存する必要があります。私はこれを行う効率的な方法を見つけようとしています。残念ながら、商品オプションに関連付けられたIDを維持して、毎回すべて削除して再保存することは不可能であることは非常に重要です。

説明をもう一度すると、明らかに次のようになります。製品をロードするときに、ユーザーが選択した内容に応じてメモリにロードされ、追加/削除されるオプションのコレクションがあるとします。彼らが '保存'をクリックすると、どのオプションが更新であり、何が新しいものであるのかを確認する必要があります。

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

ありがとうございました。

答えて

1

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

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

効率がサーバー側のエレガントなコードや削減されたコードの場合、私はいくつかの種類のORM、たとえばEntity Framework 4.0を使用して調べます。適切なORMアーキテクチャーを使用すると、データベースレコードとINSERT/UPDATEの観点から思考をほとんど止めることができ、メモリ内のオブジェクトのコレクションを操作するだけです。

+0

フィードバックのおかげで、いつもちょうど私にとって退屈なように思えました。何か面倒なように見えたら、私はもっと効率的なやり方をしていないと思う傾向があります。私はそれが意味することにもかかわらず、それはしばらく時間がかかるでしょう知っていることは分かりません。 – scaryjones

0

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

詳細がわからないと、他に何を教えていいのか分かりません。これはかなり標準的です。

+0

フィードバックのおかげで、いつもちょっと退屈だと思っていました。面倒なことがあるように見えるときは、私はもっと効率的なやり方をしていないと思う傾向があります。私はそれが意味することにもかかわらず、それはしばらく時間がかかるでしょう知っていることは分かりません。 – scaryjones

1

私は通常、次のことを実行することによって、次の操作を行います、各項目について

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

また、あなたが重複行を防ぐユニーク制約作成した場合、逆の操作を行うことができます。各項目について

  1. を、それを挿入しよう。
  2. 制約のため挿入が失敗した場合(エラーコードを確認してください)、代わりに更新を実行してください。
+0

フィードバックのおかげで、いつもちょうど私にとって退屈に思えました。何か面倒なように見えるときは、もっと効率的なやり方をしていないと思う傾向があります。私はそれが意味することにもかかわらず、それはしばらく時間がかかるでしょう知っていることは分かりません。 – scaryjones

+0

SQL Serverを使用している場合は、MERGEコマンドを使用できます。おそらくあなたがしようとしていることをします。しかし、デバッグするのは簡単ではないので、私はそれを避ける傾向があります。 –

関連する問題