请问:在填充DataSet或DataTable时如何将表的各种约束如主键约束,默认值,check约束等也填充上?

时间:2022-06-07 10:00:05
DataSet ds = new DataSet();
da = new SqlDataAdapter("select * from orders",oConn); oConn连接的是northwind
da.Fill(ds);
ds.Tables[0].PrimaryKey.Length 仍然为0
ds.Tables[0].Constraints.Count 也是0
数据库里的主键并没有保存在DataTable里
除了手工指定外,有办法在Fill()的时候就自动将表的各种约束也填充上?
求教!

2 个解决方案

#1


da.FillSchema(ds,SchemaType.Mapped);

#2


将名为“Table”的 DataTable 添加到指定的 DataSet 中,并根据指定的 SchemaType 配置架构以匹配数据源中的架构。
参数
dataSet 
要用数据源中的架构填充的 DataSet。 
schemaType 
SchemaType 值之一。 
返回值
包含从数据源返回的架构信息的 DataTable 对象。

实现
IDataAdapter.FillSchema

备注
FillSchema 方法使用 SelectCommand 从数据源中检索架构。与 SelectCommand 关联的连接对象必须有效,但不需要将其打开。如果调用 FillSchema 之前连接已关闭,则将其打开以检索数据,然后再将其关闭。如果调用 FillSchema 之前连接已打开,它将保持打开状态。

FillSchema 操作将 DataTable 添加到目标 DataSet 中。然后,它向 DataTable 的 DataColumnCollection 中添加列,并且当数据源中存在以下 DataColumn 属性时配置这些属性: 

AllowDBNull 
AutoIncrement。您必须分别设置 AutoIncrementStep 和 AutoIncrementSeed。 
MaxLength 
ReadOnly 
Unique 
FillSchema 还根据以下规则配置 PrimaryKey 和 Constraints 属性: 

如果 SelectCommand 返回一个或多个主键列,则它们被用作 DataTable 的主键列。 
如果未返回任何主键列,但返回了唯一列,则当且仅当所有唯一列都不可为空时,唯一列用作主键。如果任何一列都可以为空,则将 UniqueConstraint 添加到 ConstraintCollection 中,但不设置 PrimaryKey 属性。 
如果既返回了主键列又返回了唯一列,则主键列用作 DataTable 的主键列。 
请注意,主键和唯一约束按照上述规则添加到 ConstraintCollection 中,但不添加其他约束类型。

如果 DataAdapter 在填充 DataTable 时遇到重复列,它将以“columnname1”、“columnname2”、“columnname3”这种模式命名后面的列。如果传入数据包含未命名的列,它们将按“Column1”、“Column2”的模式放在 DataSet 中。向 DataSet 添加多个结果集时,每个结果集都放在一个单独的表中。将整数值追加到指定的表名(例如“Table”、“Table1”、“Table2”等)从而对附加结果集进行命名。在应用程序中使用列名和表名时应小心,一定不要与这些命名模式发生冲突。

FillSchema 不返回任何行。使用 Fill 方法将行添加到 DataTable 中。

注意   当处理返回多项结果的批处理 SQL 语句时,用于 OLE DB 的 .NET Framework 数据提供程序的 FillSchema 的实现只为第一项结果检索架构信息。若要为多项结果检索架构信息,请使用 MissingSchemaAction 设置为 AddWithKey 的 Fill。

#1


da.FillSchema(ds,SchemaType.Mapped);

#2


将名为“Table”的 DataTable 添加到指定的 DataSet 中,并根据指定的 SchemaType 配置架构以匹配数据源中的架构。
参数
dataSet 
要用数据源中的架构填充的 DataSet。 
schemaType 
SchemaType 值之一。 
返回值
包含从数据源返回的架构信息的 DataTable 对象。

实现
IDataAdapter.FillSchema

备注
FillSchema 方法使用 SelectCommand 从数据源中检索架构。与 SelectCommand 关联的连接对象必须有效,但不需要将其打开。如果调用 FillSchema 之前连接已关闭,则将其打开以检索数据,然后再将其关闭。如果调用 FillSchema 之前连接已打开,它将保持打开状态。

FillSchema 操作将 DataTable 添加到目标 DataSet 中。然后,它向 DataTable 的 DataColumnCollection 中添加列,并且当数据源中存在以下 DataColumn 属性时配置这些属性: 

AllowDBNull 
AutoIncrement。您必须分别设置 AutoIncrementStep 和 AutoIncrementSeed。 
MaxLength 
ReadOnly 
Unique 
FillSchema 还根据以下规则配置 PrimaryKey 和 Constraints 属性: 

如果 SelectCommand 返回一个或多个主键列,则它们被用作 DataTable 的主键列。 
如果未返回任何主键列,但返回了唯一列,则当且仅当所有唯一列都不可为空时,唯一列用作主键。如果任何一列都可以为空,则将 UniqueConstraint 添加到 ConstraintCollection 中,但不设置 PrimaryKey 属性。 
如果既返回了主键列又返回了唯一列,则主键列用作 DataTable 的主键列。 
请注意,主键和唯一约束按照上述规则添加到 ConstraintCollection 中,但不添加其他约束类型。

如果 DataAdapter 在填充 DataTable 时遇到重复列,它将以“columnname1”、“columnname2”、“columnname3”这种模式命名后面的列。如果传入数据包含未命名的列,它们将按“Column1”、“Column2”的模式放在 DataSet 中。向 DataSet 添加多个结果集时,每个结果集都放在一个单独的表中。将整数值追加到指定的表名(例如“Table”、“Table1”、“Table2”等)从而对附加结果集进行命名。在应用程序中使用列名和表名时应小心,一定不要与这些命名模式发生冲突。

FillSchema 不返回任何行。使用 Fill 方法将行添加到 DataTable 中。

注意   当处理返回多项结果的批处理 SQL 语句时,用于 OLE DB 的 .NET Framework 数据提供程序的 FillSchema 的实现只为第一项结果检索架构信息。若要为多项结果检索架构信息,请使用 MissingSchemaAction 设置为 AddWithKey 的 Fill。