如何在C#/.NET中通过DataSet获取主键列名?
问题解答
你通过DataTable.PrimaryKey获取主键列的方式本身没有问题,出现PrimaryKeys.Length为0的问题,核心原因出在XML读取环节,而非主键查询逻辑。
问题诱因
- 你调用
ReadXml时指定了XmlReadMode.ReadSchema模式,该模式只会读取XML字符串中自带的Schema约束信息,如果你传入的tableXml里没有通过Schema标签明确声明主键约束,DataSet读入后自然不会生成对应的主键配置。 - 多数场景下从数据库导出XML、或者程序生成XML时,默认不会把主键约束写入Schema片段,需要手动配置导出规则才会包含。
排查和解决方法
- 首先可以先调试查看
dataSetUpdate.Tables[0].Constraints集合,如果其中没有IsPrimaryKey属性为true的UniqueConstraint对象,即可确认是XML缺失主键约束导致的问题。 - 如果你明确知道对应表的主键列名,可以在读取XML后手动给表设置主键,示例代码如下:
// 替换为你实际的主键列名 dataSetUpdate.Tables[0].PrimaryKey = new DataColumn[] { dataSetUpdate.Tables[0].Columns["PrimaryKeyColumnName"] };
- 如果你自己控制XML的生成逻辑,可以在XML的Schema片段中添加主键声明,示例如下:
<xs:key name="PK_TableName"> <xs:selector xpath=".//TableName" /> <xs:field xpath="PrimaryKeyColumnName" /> </xs:key>
内容的提问来源于stack exchange,提问作者Dilshad Nazir
相关产品推荐
相关产品推荐

