共用方式為


將現有條件約束加入至資料集

適用於:.NET Framework .NET .NET Standard

下載 ADO.NET

SqlDataAdapterFill 方法只使用來自資料來源的資料表資料行和資料列填入 DataSet;雖然條件約束一般是由資料來源所設定,但 Fill 方法預設不會將這個結構描述資訊新增至 DataSet

若要以資料來源的現有主索引鍵條件約束資訊填入 DataSet,您可以呼叫 DataAdapterFillSchema 方法,或在呼叫 Fill 前先將 DataAdapterMissingSchemaAction 屬性設定為 AddWithKey。 這樣能確保 DataSet 內的主索引鍵條件約束反映出資料來源內的主索引鍵條件約束。

注意

不包含外部索引鍵條件約束資訊,且必須明確建立。

將資料填入 DataSet 前先將結構描述資訊新增至其中,便能確保 DataSet 內的 DataTable 物件包含主索引鍵條件約束。 這麼一來,再次呼叫以填入 DataSet 時,便會使用主索引鍵資料行資訊來比對資料來源的新資料列和每個 DataTable 中的目前資料列,然後以資料來源的資料覆寫資料表中的目前資料。 若無結構描述資訊,則來自資料來源的新資料列會附加至 DataSet,而造成資料列重複。

注意

如果資料來源中的資料行定義為自動遞增,則 FillSchema 方法或 MissingSchemaActionAddWithKeyFill 方法,會建立 DataColumn,並將其 AutoIncrement 屬性設為 true。 但是您必須自行設定 AutoIncrementStepAutoIncrementSeed 的值。

注意

若您使用 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");

下列程式碼範例示範如何使用 Fill 方法與 MissingSchemaAction 屬性將結構描述資訊新增至 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 內建立多個資料表。 會給予資料表一個以零為底數的 Table N 增量預設名稱,並從 Table 開始,而非 "Table0"。 如果資料表名稱作為引數傳遞至 FillSchema 方法,則會給予資料表一個以零為底數的 TableName N 增量名稱,並從 TableName 開始,而非 "TableName0"。

另請參閱