1

C# を介して SQL Server 2012 のデータベースにアクセスし、CRUD 変更を実行するプロジェクトを開発しています。メインフォームは次のとおりです。

ここに画像の説明を入力

右側の両方のリストボックスは、中間テーブル (多対多の関係) に含まれる情報を処理するために使用されます。基本的に、コンボボックスからタイプと能力を選択し、「追加」をクリックすると、それぞれのリストボックスに追加されます。リストボックス内の項目を削除するには、項目を 1 つ選択して [削除] をクリックするだけです。疑問を解消するための別のプリントを次に示します。

ここに画像の説明を入力

ここで提供した最初の印刷物には、「フシギダネ」のデータが表示されます。PokémonID​​ = 1 は「フシギダネ」で表されます。TypeID = 1 と 12 はそれぞれ「Grass」と「Poison」です。AbilityID = 1 は「Overgrow」です。

SQLクエリ(SqlCommand、SqlDataReaderなど...)を使用して更新関数(update_click)を作成しようとしましたが、ポケモンとそのタイプ(および能力)の関連付け全体削除してから、それらを再度追加することなく、リストボックスの新しい変更について。一部のポケモンが何千ものタイプと能力を保持している可能性がある場合に備えて、メモリを節約するためにそれを避けたいと思います...

出来ますか?必要に応じて、詳細について私の C# プロジェクトをお送りします。

4

2 に答える 2

0

基本的に、あなたがやりたいと言っているのは、データベースに「変更を送信する」ことだけです。

  • 以前にはなかった能力を追加します。
  • データベースにあったが削除された能力を削除します

その場合、できるようにする必要があるのは、単純なセット操作です。

  • ユニオンを設定
  • 交差を設定
  • セット差

単純な配列またはリストを使用してこれらの操作を実行できますが、一般的な HashSet<> などの実際のセットの実装を使用する方がはるかに効率的です。セットまたはハッシュ テーブルを使用して正しく実装すると、線形時間のパフォーマンスを実現できます。

これがあなたを正しい方向に向けるのに役立つことを願っています..

于 2013-01-31T02:09:26.090 に答える
0

次の組み合わせをお勧めします。

1) テーブル値パラメーターを使用して、すべてのデータ (リストボックス内の現在の状態) を T-SQL クエリまたはストアド プロシージャに一度に送信します。

2) EXCEPTand/orINTERSECT演算子 (および必要な LEFT または RIGHT JOIN) を使用して、テーブル値パラメーター (基本的にはテーブル自体) の内容を基になるテーブルの現在のデータと比較することを検討してください。

3) それに応じて更新/削除/挿入

于 2013-01-31T02:17:17.000 に答える