问题描述
我试图将我的 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 的建议(使用更新的数据访问框架)