“这些列当前没有唯一值”,如何避免此异常?

问题描述

我试图将我的 DataTable _Table 中的一列标记为主键,但它并不总是有效。

DataTable _Table 将填充一行,该行是从另一个 DataTable (Table) 复制的
因此,DataTable _Table 将保存从 sql Server 的表中提取的行,
否则它将保存 sql Server 中尚不存在的新行。
将行从 Table 复制到 _Table 后,我调用代码

_Table.PrimaryKey = new DataColumn[] { Table.Columns[PrimaryKeyName] };

现在,当该行来自数据库中的现有行时,运行这行代码时也不例外。那是因为主键列中有一个唯一值。

但是当它包含一个新行时,主键列中的值仍然为空(标识列),这可能就是我现在收到此错误的原因。

这些列目前没有唯一值。'

目前我正在捕获异常,然后我只是吃异常,一切正常。
但是,感觉就像一些肮脏的黑客,我想正确地做到这一点。

那么,有没有一种方法可以将数据表中的列标记primary key,其中只有一行,并且该列当前包含空值?

解决方法

不,来自 DataAdapters 的表确实需要主键和这些列中的实际数据才能正常工作。

您在评论中提到调用 .Update() 时会出现错误。原因是它需要创建 PrimaryKey,以便它知道如何识别要更改的行。是的,您可能在数据表(和数据库)中只有一行,但由于该表可能有几行,通常情况下确实如此,SQLDataAdapter 确实需要 PrimaryKey。

出于显而易见的原因,PrimaryKeys 不能有 NULL 值,这是您问题的根源,但从设计角度来看,您可以在您的数据库中有一个 Identity 列(iirc DataTable 等效项是 Autonumber)并将其配置为 PrimaryKey .如果这样做,DataTable 的主键中永远不会有 NULL 值,因为新行将使用从数据库提供的标识值。

您可以检查 ADO.NET Identity documentation

注意:如果您正在创建新软件,则值得考虑 Panagiotis 的建议(使用更新的数据访问框架)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...