【问题标题】:Which dataset row is violating the DB unique constraint?哪个数据集行违反了数据库唯一约束?
【发布时间】:2010-12-03 08:05:46
【问题描述】:

我正在使用 c# 2005 和 Sql Server 2000 编写应用程序。

我有一个带有唯一约束的表,在我关心的情况下,我有两个用户使用一个表单,该表单将(当按下保存时)更新表。

如果表是 NAMES(ID int, NAME varchar(20)) 并且唯一约束在 NAME 上,如果第一个保存的用户添加了 NAMEs 'David' 和 'John' 那就没问题了。如果第二个用户尝试使用包含名称为“John”和“Susan”的行的 DataTable 进行更新,则会引发 SqlException。但是,异常中没有任何内容可以告诉我 DataTable 中的哪一行违反了约束。

除了从数据库中获取唯一约束组成的详细信息,然后使用此信息检查我的 DataTable 中的每一行以查看该行是否违反约束之外,有没有办法确定哪一行有问题?

【问题讨论】:

    标签: c# .net sql sql-server unique-constraint


    【解决方案1】:

    您应该使用DataTable.GetErrors 来获取有错误的DataRows 数组。

    对于数组中的每个 DataRow,您应该检查 DataRow.RowError 以及哪些列与 DataRow.GetColumnsInError 有错误。

    【讨论】:

    • DataTable.GetErrors.Length 为 0,所以这没有帮助,很遗憾。
    • 我希望 DataTable.GetErrors 中存在错误,如果我在 DataTable 中添加了一行(比如说)在不可为空的列中有一个空值,但是在DataTable 是有效的行。只是当它们访问数据库时,它们才与数据库中已有的行发生冲突。
    • 你用什么从DataTable获取数据到数据库?数据适配器?
    • 我不确定它是否会影响您的思路,但对于我最初示例中的两个用户来说,他们从一个空的 DataTable 开始,因为(当他们开始编辑时)数据库表是空的。
    • 感谢@AlfredMyers 这对于确定异常的根本原因非常有帮助。
    【解决方案2】:

    此外,DataTable 中的行可能只是简单地相互冲突,因此数据库操作失败,即使数据库中没有任何提交的内容与 DataTable 冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2020-04-01
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多