将现有约束添加到 DataSet

适用于:.NET Framework .NET .NET Standard

下载 ADO.NET

SqlDataAdapterFill 方法仅使用数据源中的表列和表行来填充 DataSet;虽然约束通常由数据源来设置,但在默认情况下,Fill 方法不会将此架构信息添加到 DataSet 中 。

若要使用数据源中的现有主键约束信息填充 DataSet,则可以调用 DataAdapter 的 FillSchema 方法,或者在调用 Fill 之前将 DataAdapter 的 MissingSchemaAction 属性设置为 AddWithKey 。 这将确保 DataSet 中的主键约束反映数据源中的主键约束。

注意

外键约束信息不包含在内,必须显式创建。

如果在使用数据填充 DataSet 之前向其中添加架构信息,可以确保将主键约束与 DataSet 中的 DataTable 对象包含在一起 。 这样,当再次调用来填充 DataSet 时,将使用主键列信息将数据源中的新行与每个 DataTable 中的当前行相匹配,并使用数据源中的数据改写表中的当前数据 。 如果没有架构信息,来自数据源的新行将追加到 DataSet 中,从而导致重复的行。

备注

如果数据源中的某列被标识为自动递增列,则 FillSchema 方法或 MissingSchemaAction 为 AddWithKey 的 Fill 方法将创建一个 AutoIncrement 属性设置为 true 的 DataColumn 。 不过,你需要手动设置 AutoIncrementStep 和 AutoIncrementSeed 值 。

注意

当使用 FillSchema 或将 MissingSchemaAction 设置为 AddWithKey 时,需要在数据源中进行额外的处理来确定主键列信息 。 这一额外的处理可能会降低性能。 如果主键信息在设计时已知,为了实现最佳性能,建议显式指定一个或多个主键列。

以下代码示例显示如何使用 FillSchema 向 DataSet 添加架构信息:

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

以下代码示例显示如何使用 MissingSchemaAction 属性和 Fill 方法向 DataSet 添加架构信息:

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

处理多个结果集

如果 DataAdapter 遇到从 SelectCommand 中返回的多个结果集,将在 DataSet 中创建多个表 。 将向这些表提供基于零的递增的默认名称 TableN,从 Table 开始,而不是从“Table0”开始。 如果以自变量形式向 FillSchema 方法传递表名称,则将向这些表提供基于零的递增的名称 TableNameN,从“TableName”开始,而不是从“TableName0”开始。

另请参阅