【问题标题】:How to delete a row from a typed dataset and save it to a database?如何从类型化数据集中删除一行并将其保存到数据库中?
【发布时间】:2012-06-24 13:57:23
【问题描述】:

我将这个项目作为一个小项目来了解 .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 中。

我已经成功地实现了更新和插入新记录,但是我尝试删除行并将更改保存到数据库中完全失败了。

我是一个类型化的数据集。

如果我使用这个:

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 文件中弹出异常。

从昨天开始,我几乎就被困在了这一点上。我在任何地方都找不到任何与我的问题相似的地方。而且我无法理解到底发生了什么。

【问题讨论】:

  • 在 Delete() 之后使用 m_SoldaCompaniesFileDataSet.AcceptChanges()。
  • 感谢您的回答!根据文档: Remove() 就像调用 Delete() 然后 AcceptChanges();我之前已经尝试过,但它不起作用。我尝试过各种组合。我在设计器中设置了这样的 DeleteCommand:DELETE FROM ContactPersons WHERE (ContactPersonID = @Original_ContactPersonID)
  • Remove 仅从集合中删除记录,其中 Delete 会在调用 AcceptChnages 时从数据库中永久删除数据。
  • 所以你知道为什么我在 DataSet 上使用 Delete() 后尝试刷新/重新填充 DataGridView 时得到 DeletedRowInaccessibleException。
  • 让我知道一件事,你现在是在删除行(而不是删除)后调用 Acceptchanges() 吗?如果没有,请尝试。

标签: .net database sql-server-2008-r2 ado.net dataset


【解决方案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 :) 请注意,检查行是否处于已删除状态必须在代码中的任何位置执行。

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多