2

これは、.NET4.0およびSQLServer2008R2の切断および接続されたモデルについて学習するための小さなプロジェクトとして行っています。

私は3つのテーブルを持っています:

Companies (PK CompanyID) 
Addresses (PK AddressID, FK CompanyID) 
ContactPersons (PK ContactPersonID, FK CompanyID)

CompanyIDは、ユーザーによって手動で割り当てられます。他のIDは自動生成されます。企業はContactPersonと1対多の関係にあります。カスケードに変更を設定しました。

会社のすべてのレコードをDataGridViewに表示し、行をクリックすると、ContactPersonsの対応するレコードが2番目のDataGridViewに表示されます。

新しいレコードの更新と挿入は正常に実装されましたが、行を削除して変更をデータベースに保存しようとしても完全に失敗しました。

私は型付きデータセットを使用しています。

これを使用する場合:

DataRow[] contactPersonRows = m_SoldaCompaniesFileDataSet.ContactPersons.Select("ContactPersonID = "
                                                  + this.m_CurrentContactPerson.ContactPersonID);

m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Remove(contactPersonRows[0]);

レコードはDataGridViewに正しく表示されますが、後でデータベースに保存されることはありません。

これを使用する場合:

DataRow row = m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Find(this.m_CurrentContactPerson.ContactPersonID);
row.Delete();

レコードは設定されていますが、DataGridViewを更新しようとすると、DeletedRowInaccessibleExceptionという例外が発生します。自動生成されたdataset.designファイルに例外がポップアップ表示されます。

私は昨日からこの時点でかなり立ち往生しています。自分の問題にリモートで似ているものはどこにも見つかりません。そして、私は実際に何が起こっているのか理解できません。

4

1 に答える 1

1

私は次のようなLinq-to-Dataセットクエリを実行しています:

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons
                              where row.CompanyID == companyID
                              select new
                              {
                                   ContactPersonID = row.ContactPersonID,
                                   CompanyID = row.CompanyID,
                                   NameFirst = row.NameFirst,
                                   NameLast = row.NameLast,
                                   PhoneNumber = row.PhoneNumber,
                                   EmailAddress = row.EmailAddress,
                                   Position = row.Position
                              };

このチェックを行って、削除された行を Linq クエリから除外する必要があることを理解するのにかなりの時間がかかりました。

row.RowState != DataRowState.Deleted

したがって、上記のコードは次のように修正されます。

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons
                              where row.RowState != DataRowState.Deleted && row.CompanyID == companyID
                              select new
                              {
                                   ContactPersonID = row.ContactPersonID,
                                   CompanyID = row.CompanyID,
                                   NameFirst = row.NameFirst,
                                   NameLast = row.NameLast,
                                   PhoneNumber = row.PhoneNumber,
                                   EmailAddress = row.EmailAddress,
                                   Position = row.Position
                              };

これ以上 DeletedRowInaccessibleException はありません:) 行が削除された状態にあるかどうかのチェックは、コードのどこでも実行する必要があることに注意してください。

于 2012-06-23T11:14:27.097 に答える