0

データベース テーブルで行われた変更を元に戻す機能を提供するために、Clone()多数の変更の前に DataTable を作成しました。ユーザーは、変更をキャンセルすることを決定する前に、いくつかのフォームを通過することができます。プロセスの最後にキャンセルを選択した場合は、Clone() されたデータを更新してデータベースに戻します。すでに追加されている行を削除してから、元の Clone() された行を追加し直すか、更新予定の行を更新するのが理にかなっているのかわかりません。元の行を更新する場合、クローンから元に行をコピーするためにループする必要があるようですか? それとも別の方法がありますか?

// Clone the original data
cloneDataTable = origDataTable.Clone();
cloneDataTable.ImportRow(dataRow);

// Later in the process, if I need to delete the row
dataRow.Delete();
tableAdapter.Update(dataRow);

// I was considering that I could add the cloned row back in this fashion
origDataTable.ImportRow(cloneDataTable.Rows[0]);
tableAdapter.Update(dataRow);

問題を混乱させた可能性がありますが、基本的には、一連の挿入/更新が既に実行された後に、元の Clone() されたデータをデータベースに復元する簡単で効率的な方法を探しています。
理想的には、データベースの挿入によってシーケンス値が増加するため、更新を実行したいと考えています。

ご協力ありがとうございます。必要に応じて説明を求めてください。

4

3 に答える 3

0

プロセスの複雑さのために、私は自分自身の解決策を考案しなければなりませんでした。トランザクションの作成が機能することを提案してくれた人々に感謝しますが、それがなければ私が尋ねなかったであろう解決策はそれほど単純ではありませんでした。問題は、ユーザーがキャンセルするポイントを選択できることですが、状態は常に追跡および記録する必要があります。私がやったことは、ユーザーが状態を保存するように要求したとき、私Clone()はDataTableであり、cloned = trueフラグを設定しました。

後でキャンセルが選択された場合、私はMerge()古いものから新しいものへの変更を行います。

origDataTable.Merge(cloneDataTable);
tableAdapter.Update(origDataTable.Rows[0]);

これが誰かに役立つことを願っています。少し複雑ですが、このアプリケーションのニーズに合っています。状態をメモリに保存し、データベースに書き込み、元に戻すタイミングを選択できるため、自分のトランザクションを維持できるのが好きです。確かに、これは別の設計のトランザクションに組み込まれている機能の一部を使用する方が簡単な場合がありますが、このアプリケーションでは機能します。アドバイスありがとうございます。

于 2012-06-07T14:34:44.500 に答える
0

このような元に戻す/キャンセル機能を実装するための最善の策は、トランザクションの範囲内でデータベースへのすべての直接変更を行い (選択したデータベースがトランザクションをサポートしていると仮定して)、その後、トランザクションをコミットまたはロールバックすることです。ユーザーが変更を永続的にしたくないかどうか。

DataTable を使用して独自の取り消しメカニズムを実装することは、適切な計画ではありません。

于 2012-06-07T03:11:24.407 に答える
0

トランザクションを使用し、変更を加え、動作する場合はトランザクションを完了します

using(TransactionScope ts = new TransactionScope ())
{
//updates, inserts, etc
ts.Complete();
}

例外またはエラーが発生した場合、トランザクションは transactionScope 内のすべてをロールバックします

SQL Server を使用している場合は、英語が下手で申し訳ありません。

于 2012-06-07T03:17:38.840 に答える