0

.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に表示されます。

次に、ContactPersonsテーブルから次の行を削除します。

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

そして、DataGridViewにデータを取り込むためのデータソースを作成するためにテーブルをクエリしようとすると、次のようになります。

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
                              };

DeletedRowInaccessibleExceptionを受け取りました。私がここで間違っていることについて何か考えはありますか?

実際には、例外は、型指定されたDataSetの自動生成されたコードから発生します。

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public int CompanyID {
                get {
                    try {
                        return ((int)(this[this.tableContactPersons.CompanyIDColumn])); // <<<--- DeletedRowInaccessibleException
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("The value for column \'CompanyID\' in table \'ContactPersons\' is DBNull.", e);
                    }
                }
4

1 に答える 1

1

私は上記の質問を書いた直後にそれを理解しました(それは私を完全に1日以上かかりましたが):

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
                              };

次のチェックを実行して、削除された行をLinqクエリから除外する必要があります。

row.RowState != DataRowState.Deleted
于 2012-06-25T11:51:59.597 に答える