Добавление существующих ограничений к набору данных DataSet
Область применения: платформа .NET Framework .NET Standard
Метод Fill объекта SqlDataAdapter заполняет DataSet только столбцами таблицы и строками из источника данных. Хотя источники данных обычно устанавливают ограничения, метод Fill по умолчанию не добавляет эти данные схемы к набору данных DataSet.
Чтобы учесть при заполнении набора данных DataSet существующие ограничения первичного ключа, заданные в источнике данных, можно вызвать метод FillSchema объекта DataAdapter или задать значение свойства MissingSchemaAction объекта DataAdapter, равное AddWithKey, перед вызовом метода Fill. Тем самым ограничения первичного ключа в наборе данных DataSet будут соответствовать ограничениям первичного ключа в источнике данных.
Примечание.
Данные об ограничениях внешнего ключа не добавляются, их нужно создавать явно.
Добавление данных схемы в DataSet перед его заполнением обеспечивает включение ограничений первичного ключа в объекты DataTable набора данных DataSet. В результате при дополнительных вызовах для заполнения DataSet данные столбца первичного ключа используются для проверки соответствия новых строк из источника данных текущим строкам в каждой таблице DataTable и текущие данные таблиц перезаписываются данными из источника. При отсутствии данных схемы новые строки добавляются из источника данных к набору данных DataSet, что приводит к появлению повторяющихся строк.
Примечание.
Если столбец в источнике данных определен как столбец автоприращения, метод FillSchema или Fill со свойством MissingSchemaAction, имеющим значение AddWithKey, создает столбец DataColumn, свойство которого AutoIncrement имеет значение true
. Но выполнение задачи присваивания значений свойств AutoIncrementStep и AutoIncrementSeed необходимо взять на себя.
Примечание.
Использование метода FillSchema или присвоение свойству MissingSchemaAction значения AddWithKey требует дополнительной обработки в источнике данных, чтобы определить сведения о столбцах первичного ключа. Такая дополнительная обработка может снизить производительность. Если сведения о столбцах первичного ключа известны во время разработки, рекомендуется явно задавать столбец или столбцы первичного ключа, чтобы добиться оптимальной производительности.
В следующем примере кода показано добавление данных схемы в объект DataSet с помощью метода FillSchema.
// 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");
В следующем примере кода показано добавление данных схемы в объект DataSet с помощью свойства MissingSchemaAction и метода Fill:
// 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".