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

Метод Fill dataAdapter заполняет DataSet только столбцы и строки таблицы из источника данных. Хотя ограничения обычно задаются источником данных, метод Fill не добавляет эти сведения схемы в набор данных по умолчанию. Чтобы заполнить набор данных существующими сведениями об ограничении первичного ключа из источника данных, можно вызвать метод FillSchema dataAdapter или задать свойство MissingSchemaAction объекта DataAdapter для AddWithKey перед вызовом Fill. Тем самым ограничения первичного ключа в наборе данных DataSet будут соответствовать ограничениям первичного ключа в источнике данных. Сведения об ограничении внешнего ключа не включены и должны быть созданы явным образом, как показано в ограничениях DataTable.

Добавление данных схемы в DataSet перед его заполнением обеспечивает включение ограничений первичного ключа в объекты DataTable набора данных DataSet. В результате при дополнительных вызовах для заполнения DataSet данные столбца первичного ключа используются для проверки соответствия новых строк из источника данных текущим строкам в каждой таблице DataTable и текущие данные таблиц перезаписываются данными из источника. При отсутствии данных схемы новые строки добавляются из источника данных к набору данных DataSet, что приводит к появлению повторяющихся строк.

Примечание.

Если столбец в источнике данных определяется как автоматическое увеличение, метод FillSchema или метод Fill с параметром MissingSchemaActionaddWithKey создает DataColumn со свойством AutoIncrement, равным true. Но выполнение задачи присваивания значений свойств AutoIncrementStep и AutoIncrementSeed необходимо взять на себя. Дополнительные сведения об автоматическом добавочном столбце см. в разделе "Создание столбцов автоинкремента".

Использование метода FillSchema или присвоение свойству MissingSchemaAction значения AddWithKey требует дополнительной обработки в источнике данных, чтобы определить сведения о столбцах первичного ключа. Такая дополнительная обработка может снизить производительность. Если сведения о столбцах первичного ключа известны во время разработки, рекомендуется явно задавать столбец или столбцы первичного ключа, чтобы добиться оптимальной производительности. Сведения о явном задании сведений о первичном ключе для таблицы см. в разделе "Определение первичных ключей".

В следующем примере кода показано, как добавить сведения о схеме в набор данных с помощью FillSchema:

Dim custDataSet As New DataSet()  
  
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers")  
custAdapter.Fill(custDataSet, "Customers")  
var custDataSet = new DataSet();  
  
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers");  
custAdapter.Fill(custDataSet, "Customers");  

В следующем примере кода показано, как добавить сведения о схеме в набор данных с помощью свойства MissingSchemaAction.AddWithKey метода Fill:

Dim custDataSet As New DataSet()  
  
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey  
custAdapter.Fill(custDataSet, "Customers")  
var custDataSet = new DataSet();  
  
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;  
custAdapter.Fill(custDataSet, "Customers");  

Обработка нескольких результирующих наборов

Если DataAdapter встречает несколько результирующих наборов, возвращаемых из SelectCommand, он создаст несколько таблиц в Наборе данных. Эти таблицы по умолчанию получают имя TableN с последовательно увеличивающимся суффиксом, но начиная с Table, а не с "Table0". Если имя таблицы передается в качестве аргумента методу FillSchema , таблицы будут присвоены отсчитываемого от нуля добавочного имени TableNameN, начиная с tableName вместо TableName0.

Примечание.

Если метод FillSchema объекта OleDbDataAdapter вызывается для команды, возвращающей несколько результирующих наборов, возвращается только информация о схеме из первого результированного набора. При возврате сведений о схеме для нескольких результирующих наборов с помощью OleDbDataAdapter рекомендуется указать missingSchemaActionaddWithKey и получить сведения о схеме при вызове метода Fill.

См. также