【问题标题】:An exception is thrown after a row is deleted from a strongly typed DataSet?从强类型数据集中删除一行后抛出异常?
【发布时间】:2012-06-23 09:10:38
【问题描述】:

我正在使用 .NET 4.0 和 SQL Server 2008 R2。

我有三张桌子:

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

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

我在 DataGridView 中显示 Companies 中的所有记录,当单击一行时,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。有什么想法我在这里做错了吗?

实际上异常来自类型化数据集的自动生成代码:

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

【问题讨论】:

    标签: ado.net datagridview linq-to-objects strongly-typed-dataset delete-row


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2015-06-29
      • 2015-12-24
      • 2018-01-28
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多