DataTable.PrimaryKey用唯一的聚集索引而不是主键填充

时间:2019-01-03 17:50:54

标签: c# sql-server ado.net

我有一个SQL Server表MyTable,其中为列A设置了主键,还为列BC设置了唯一的聚集索引。

此通话后:

(new SqlDataAdapter(new SqlCommand($"select top 0 * from MyTable", conn))).FillSchema(theDataTable, SchemaType.Mapped);

theDataTable的{​​{1}}设置为.PrimaryKeyB列,而不是C列。
为什么会这样呢?

1 个答案:

答案 0 :(得分:3)

正如我所评论的,FillSchema(DataTable, SchemaType, IDbCommand, CommandBehavior)文档实际上涵盖了这一点:

  

FillSchema还配置PrimaryKey和Constraints属性   根据以下规则:

     
      
  • 如果SelectCommand返回了一个或多个主键列,则它们将用作菜单的主键列。   数据表。

  •   
  • 如果不返回主键列,但返回唯一列,则当且仅当所有   唯一列不可为空。如果任何列可为空,则   将UniqueConstraint添加到ConstraintCollection中,但是   没有设置PrimaryKey属性。

  •   
  • 如果同时返回了主键列和唯一列,则主键列将用作主键列的主键列。   数据表。

  •   
     

请注意,主键和唯一约束已添加到   根据前面的规则ConstraintCollection,但其他   约束类型未添加。

     

如果在SQL中的一个或多个列上定义了唯一的聚集索引   服务器表和主键约束在单独的位置上定义   列集,然后是聚集索引中的列名   将被退回。返回一个或多个主键的名称   列,请在带有SELECT语句的查询提示中使用指定   主键索引的名称。有关指定的更多信息   查询提示,请参见Query Hint (Transact-SQL)

如果确实需要从.PrimaryKey获取主键详细信息,则需要使用提示,如文档所建议的那样。但是,如果没有表的DDL(包括索引),我们将无法告诉您提示是什么。