我有一个SQL Server表MyTable
,其中为列A
设置了主键,还为列B
和C
设置了唯一的聚集索引。
此通话后:
(new SqlDataAdapter(new SqlCommand($"select top 0 * from MyTable", conn))).FillSchema(theDataTable, SchemaType.Mapped);
theDataTable
的{{1}}设置为.PrimaryKey
和B
列,而不是C
列。
为什么会这样呢?
答案 0 :(得分:3)
正如我所评论的,FillSchema(DataTable, SchemaType, IDbCommand, CommandBehavior)文档实际上涵盖了这一点:
FillSchema还配置PrimaryKey和Constraints属性 根据以下规则:
如果SelectCommand返回了一个或多个主键列,则它们将用作菜单的主键列。 数据表。
如果不返回主键列,但返回唯一列,则当且仅当所有 唯一列不可为空。如果任何列可为空,则 将UniqueConstraint添加到ConstraintCollection中,但是 没有设置PrimaryKey属性。
如果同时返回了主键列和唯一列,则主键列将用作主键列的主键列。 数据表。
请注意,主键和唯一约束已添加到 根据前面的规则ConstraintCollection,但其他 约束类型未添加。
如果在SQL中的一个或多个列上定义了唯一的聚集索引 服务器表和主键约束在单独的位置上定义 列集,然后是聚集索引中的列名 将被退回。返回一个或多个主键的名称 列,请在带有SELECT语句的查询提示中使用指定 主键索引的名称。有关指定的更多信息 查询提示,请参见Query Hint (Transact-SQL)。
如果确实需要从.PrimaryKey
获取主键详细信息,则需要使用提示,如文档所建议的那样。但是,如果没有表的DDL(包括索引),我们将无法告诉您提示是什么。