DataAdapter 的 Fill 方法仅使用数据源中的表列和行来填充 DataSet;尽管约束通常由数据源设置,但 Fill 方法在默认情况下不会将此模式信息添加到 DataSet 中。 要使用数据源中的现有主键约束信息填充DataSet,可以调用DataAdapter的FillSchema方法,或者在调用Fill之前,将DataAdapter的MissingSchemaAction属性设置为AddWithKey。 这将确保 DataSet 的主键约束与数据源中的约束一致。 约束信息不包含在内,必须显式创建,如数据表约束中所示。
在向 DataSet 添加架构信息后再填充数据,确保主键约束包含在 DataTable 对象的 DataSet 中。 因此,当执行其他对DataSet的填充调用时,主键列信息用于将数据源中的新行与每个DataTable中的当前行进行匹配,并且表中的当前数据会被数据源中的数据覆盖。 如果没有架构信息,来自数据源的新行将追加到 DataSet 中,从而导致重复的行。
备注
如果数据源中的列被标识为自动递增,则 FillSchema 方法或具有 MissingSchemaActionAddWithKey 的 Fill 方法将创建一个 DataColumn,其中 AutoIncrement 属性设置为 true。 但是,需要自行设置 AutoIncrementStep 和 AutoIncrementSeed 值。 有关自动递增列的详细信息,请参阅创建自动增量列。
使用 FillSchema 或设置 MissingSchemaAction 到 AddWithKey 需要对数据源进行额外处理,以确定主键列信息。 这一额外的处理可能会降低性能。 如果主键信息在设计时已知,为了实现最佳性能,建议显式指定一个或多个主键列。 有关显式设置表的主键信息的详情,请参见定义主键。
下面的代码示例演示如何将架构信息添加到 DataSet 使用 FillSchema:
Dim custDataSet As New DataSet()
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers")
custAdapter.Fill(custDataSet, "Customers")
var custDataSet = new DataSet();
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers");
custAdapter.Fill(custDataSet, "Customers");
下面的代码示例演示如何使用方法的 DataSetMissingSchemaAction.AddWithKey 属性将架构信息添加到其中Fill:
Dim custDataSet As New DataSet()
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
custAdapter.Fill(custDataSet, "Customers")
var custDataSet = new DataSet();
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
custAdapter.Fill(custDataSet, "Customers");
处理多个结果集
DataAdapter如果遇到从 SelectCommand 返回的多个结果集,它将在数据集中创建多个表。 表将被赋予一个从零开始的TableN增量默认名称,而不是“Table0”。 如果将表名作为参数传递给 FillSchema 方法,则表将被赋予从零开始的 TableNameN 增量名称,并以 TableName 开头,而不是以“TableName0”开头。
备注
FillSchema对象的方法用于调用OleDbDataAdapter命令,该命令返回多个结果集时,仅返回第一个结果集中的架构信息。 使用 OleDbDataAdapter 返回多个结果集的架构信息时,建议指定一个MissingSchemaAction,并在调用Fill方法时获取架构信息。