(1) プロローグ
DataSet に主テーブルと副テーブル (主キー テーブル/外部キー テーブル) の両方が含まれている場合、リレーションシップ制約が厳しすぎることがあります。
たとえば、リレーショナル データベースの整合性ルールは次のとおりです。
1. エンティティの整合性。主キー テーブルの主キーを空にすることはできません。
2. 参照整合性。外部キー テーブルの外部キーの値は、主キー テーブルの主キーに対応する必要があります。
空、または主キー テーブル内の主キー値。
3. 整合性をカスタマイズします。
DataSet テーブルで定義された複数テーブル リレーションシップの制約が厳しすぎる場合は、Update メソッドを直接使用します。
DataSet 内の複数のテーブルをまとめて送信すると、整合性ルールが満たされず、エラーが発生する場合があります。
理由: たとえば、CompanyMain (会社のメイン テーブル) と CompanySon (会社のサブテーブル) の 2 つのテーブルを設定します。
CompanyMain(会社メインテーブル)は主に会社の基本情報を格納し、CompanySon(会社サブテーブル)は主に会社の基本情報を格納します。
主にこの会社の一部の顧客に関する情報を会社のメインテーブルに、(BelongID) をサブテーブルに格納します。
関連付け、つまり主キーと外部キーの関係を確立します。1 つの会社が複数の顧客に対応します。つまり、ID:BelongID = 1:n の関係になります。
メインテーブルのIDは自動生成される番号です。
それで:
新しい会社のインターフェースを一緒に提出すると、システムはデータベースを更新するための「データベース整合性ルール」に準拠しません。
最初にサブテーブルを更新してからメインテーブルを更新すると、メインテーブルの会社情報がまだ挿入されていないためにエラーが報告される場合があります。
データベース内のテーブルには会社番号:IDが生成されず、サブテーブル更新時に対応するBelongIDが存在しません。
このとき、整合性ルール「外部キーテーブルの外部キーはnullではない」が設定されていると例外がスローされます。
これは単なるエラーの可能性であり、さらに多くのエラーが発生する可能性があり、分散設計ではそのようなエラーが発生する可能性が高くなります
(2)。
これにより
、多数のエラーの可能性が回避されます。
ルール: DataSet を更新する前に、<table> および <テーブルの RowState 属性> によって分割送信を実行します。
I. <table> によって分割送信を実行することは
、DataSet 内のテーブルがまとめて送信されるのではなく、一度に 1 つずつ送信されることを意味します。テーブル、複数回送信
II. <テーブルの RowState 属性> に従って分割送信とは、
RowState 属性に従って DataSet 内の 1 つのテーブルを分割し、
同じ RowState を 1 回送信し、複数回送信する
ことを意味します。 2.
ルールに基づきます
。1、最初に <new> と <modified> のステータスを更新し、次に <deleted> を更新します。
つまり、最初に DataRowState 値を更新します: 追加と変更、次に更新: 削除済み。
ルール 1 とルールに基づきます
。
2、DataRowState が追加および変更されると、最初にメイン テーブルが更新され、
次にルール 1 とルール 2 に基づいて、DataRowState が削除されると、最初にサブテーブルが更新されます
。(3) 上記 3 つのルールを次のように要約します:
1.
DataSet 内のテーブルを分割し、RowState に従って各テーブル レコードをグループ化し、それを異なるデータ セットに格納します。
// これは次のようになります。 Update は DataSet のパラメーターを受け入れ、WebService は //DataSet のみをサポートします
。シリアル化操作の
コード例
:更新されるデータ セットが dsCompany (メイン テーブルの 2 つのテーブルを含む) であると仮定します。およびサブテーブル) テーブル、および
更新されるデータを格納します)
//dtCompanyMain は会社のメイン テーブル情報を格納し、dtCompanySon は会社のサブテーブル情報を格納します
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone() //メイン テーブルのデータを分離し
、別のオブジェクトを格納します
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //サブテーブルのデータを分離し
、別のオブジェクトを格納
DataSet dsAdded = new DataSet() //メインテーブルの新規追加データを格納
DataSet dsMidified = new DataSet();メインテーブルのテーブル編集行レコードを保存
DataSet dsDeleted = new DataSet() //メインテーブルの削除行レコードを保存
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); //メインテーブルに設定された新しい行
レコード
を取得します。 dtCompanyMain.GetChanges (DataRowState.Modified); //メイン テーブルで
編集された
行レコード セットを取得します。 dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //メイン テーブルで削除された
行レコード セット
を取得します。 2. DataRowState ステータスを更新します。メイン テーブルの追加および変更されたレコード
SqlDataAdapter.Update(dsAdded,"dtCompanyMain") //追加されたレコード セットをデータベースに更新します
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); //変更されたレコード セットを更新します。
3. サブテーブル
の DataRowState ステータスの更新: 追加および変更されたレコード
... //コードは省略されています。2 つのメイン テーブルの更新と同様です
。 4. サブテーブルの DataRowState ステータスの更新: 削除されたレコード
... ..... .... // コードは省略されています。以下の 5 と同様です
。 5. メイン テーブルの DataRowState ステータスを次のように更新します。 削除されたレコード
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); // 変更されたレコード セットをデータベースに更新します。
読んでいただきありがとうございます!