2

よし、これがシナリオだ。それはかなり一般的だと思います。前世でブルートフォースアプローチを使用して解決したことがありますが、もっと良い方法があるはずだと考えています。

名前の順序付けられたリストと、ユーザーが名前を並べ替え、削除、編集、リストに追加できる UI が与えられた場合、SQL データベースに保存されているリストをどのように更新しますか?

テーブル定義は次のとおりです。

CREATE TABLE [dbo].[AssyLines](
  [AssyLineID] [int] IDENTITY(1,1) NOT NULL,
  [ShortName] [varchar](16) NOT NULL,
  [LongName] [varchar](45) NOT NULL,
  [Seq] [tinyint] NOT NULL,
CONSTRAINT [PK_AssyLines] PRIMARY KEY CLUSTERED 

私がやりたいことは、テーブルからすべてのエントリを読み取り、それらを UI に Seq 順に表示することです。次に、ShortName または LongName の編集、リストの並べ替え、新しいエントリの追加または既存のエントリの削除を行い、変更したリストをデータベースに保存します。

違いがある場合、これはクライアント/サーバー アプリケーションです。WCF サービスはデータベースの対話を処理し、クライアントはサービスとの間でレコードの配列を送信するだけです。

私の強引なアプローチには、テーブルをロックし、すべてのエントリを削除してから、新しいレコードをテーブルに書き直すことが含まれます。もちろん、すべてトランザクション内で、ストアド プロシージャとテーブル変数または一時テーブルのいずれかを使用します。粗雑ですが効果的ですが、誰かがマイナーな編集を行うたびにテーブルを壊して再作成することなく、これを行うためのかなり標準的な方法があると感じずにはいられません。

何か案は?現在取り組んでいるアプリケーションには、そのようなリストが 4 つまたは 5 つあります。

ありがとう、デイブ

4

3 に答える 3

0

私は.NET開発者ではありませんが、これを行うためのもう1つのエレガントな方法は、テーブルに3人のリスナーを配置することです。追加リスナー、更新リスナー、および削除リスナー。リスナーは、それぞれINSERT、UPDATE、およびDELETEをトリガーします。

リストを並べ替えても、データベースに保存されているデータには影響しません。

于 2011-02-11T17:15:12.617 に答える
0

他の列をユーザーが指定したものに更新する各レコード (AssyLineID によって識別され、変更されるべきではない) に対して UPDATE クエリを実行しないのはなぜですか? 何も削除する必要はありません。ユーザーが変更した内容を追跡することで、DB 操作の量を減らすことができます。

パーツの並べ替えが心配な場合は、次のSeqようにするとうまくいくと思います。

if (newSeq < oldSeq)
{
    sql = "UPDATE AssyLines SET Seq = Seq + 1 WHERE Seq >= @seq AND Seq < @oldSeq AND AssyLineID <> @lineID";
}
else if (newSeq > oldSeq)
{
    sql = "UPDATE AssyLines SET Seq = Seq - 1 WHERE Seq <= @seq AND Seq > @oldSeq AND AssyLineID <> @lineID";
}

毎回テーブルを爆破する必要があると感じる理由が理解できないかもしれません。Seq 部分以外の基本的な選択 - 変更 - 保存操作のように聞こえます。

于 2011-02-11T17:18:32.567 に答える
0

これで私が取るアプローチは、主キーを使用して更新、挿入、および削除を変更に結び付け、データを介していくつかのパスを作成することです。

  1. リストをデータベースから UI にロードし、アイテムに対して ID を保存します。また、最初はすべてのアイテムに対して false に設定されている「変更済み」フラグを保存します。
  2. 次のように、UI のデータに変更を加えます。
    • データを追加し、ID (主キー) を -1 に設定し、変更済みフラグを true に設定することによるデータへの追加。
    • データを編集してデータを更新し、changed フラグを true に設定します。
    • それらを削除するだけでデータから削除します。
  3. 変更されたフラグが true であるリスト内の各項目を反復処理し、以下を実行します。
    • ID = -1 の場合、INSERT を使用して新しいレコードを追加します。
    • ID > -1 の場合、UPDATE を使用して、更新するレコードに対して ID に一致する既存のレコードを更新します。
  4. 次に、データベースに存在するレコードのすべての ID を再度読み取り、それぞれをループして、リストが存在するかどうかを確認します。そうでない場合は、DELETE を使用してデータベースから削除します。

大量のデータがある場合、ステップ 4 は非常に遅くなる可能性があります。わずかに異なるより効率的な方法は、UI でレコードを削除済みとして「マーク」し、削除せずにビューから非表示にすることができるかどうかによって異なります。次に、変更されたフラグを、挿入、更新、または削除のいずれであるかに応じて、「I」、「U」、または「D」に設定されたステータスに置き換えることができます。そうすれば、データを 1 回通過するだけで済みます。

于 2011-02-11T17:40:10.553 に答える