將現有條件約束加入至資料集
適用於:.NET Framework .NET .NET Standard
SqlDataAdapter 的 Fill 方法只使用來自資料來源的資料表資料行和資料列填入 DataSet;雖然條件約束一般是由資料來源所設定,但 Fill 方法預設不會將這個結構描述資訊新增至 DataSet。
若要以資料來源的現有主索引鍵條件約束資訊填入 DataSet,您可以呼叫 DataAdapter 的 FillSchema 方法,或在呼叫 Fill 前先將 DataAdapter 的 MissingSchemaAction 屬性設定為 AddWithKey。 這樣能確保 DataSet 內的主索引鍵條件約束反映出資料來源內的主索引鍵條件約束。
注意
不包含外部索引鍵條件約束資訊,且必須明確建立。
將資料填入 DataSet 前先將結構描述資訊新增至其中,便能確保 DataSet 內的 DataTable 物件包含主索引鍵條件約束。 這麼一來,再次呼叫以填入 DataSet 時,便會使用主索引鍵資料行資訊來比對資料來源的新資料列和每個 DataTable 中的目前資料列,然後以資料來源的資料覆寫資料表中的目前資料。 若無結構描述資訊,則來自資料來源的新資料列會附加至 DataSet,而造成資料列重複。
注意
如果資料來源中的資料行定義為自動遞增,則 FillSchema 方法或 MissingSchemaAction 為 AddWithKey 的 Fill 方法,會建立 DataColumn,並將其 AutoIncrement 屬性設為 true
。 但是您必須自行設定 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");
下列程式碼範例示範如何使用 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"。