0

我正在使用.NET 4.0和SQL Server 2008 R2。从强类型DataSet中删除行后引发异常?

我有三个表:

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

CompanyID是由用户手动分配。其他ID是自动生成的。公司与ContactPerson有一对多的关系。我已设置任何更改级联。

我在DataGridView的公司中显示所有记录,当单击一行时,ContactPersons中的相应记录显示在第二个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); 
        } 
       } 

回答

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 
相关问题