Добавление существующих ограничений к набору данных DataSet

ПРИМЕНИМО К: .NET Framework .NET Core .NET Standard

Скачать ADO.NET

Метод 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".

См. также