Заполнение набора данных DataSet с помощью DataAdapter

Область применения: .NET Framework .NET .NET Standard

Скачать ADO.NET

Объект ADO.NET DataSet является находящимся в оперативной памяти представлением данных, обеспечивающим согласованную реляционную программную модель, независимо от источника данных. Набор данных DataSet представляет собой полную совокупность данных, которая включает таблицы, ограничения и связи между таблицами. Поскольку DataSet не зависит от источника данных, DataSet может включать данные, локальные для приложения, и данные из нескольких источников данных. Управление взаимодействием с существующими источниками данных осуществляется с помощью DataAdapter.

Свойство SelectCommand объекта DataAdapter представляет собой объект Command , получающий данные из источника данных. Свойства InsertCommand, UpdateCommandи DeleteCommand , принадлежащие DataAdapter , являются объектами Command , которые управляют обновлением данных в источнике данных в соответствии с изменениями данных в DataSet. Эти свойства более подробно описаны в разделе Обновление источников данных с помощью объектов DataAdapter.

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

Примечание.

Использование DataAdapter для получения всей таблицы требует времени, особенно при наличии в ней большого числа строк. Это происходит вследствие того, что обращение к базе данных, обнаружение и обработка данных, а также передача данных клиенту занимают длительное время. Передача по запросу всей таблицы клиенту приводит также к блокировке всех строк на сервере. Для повышения производительности можно использовать предложение WHERE , что позволяет значительно уменьшить количество строк, возвращаемых клиенту. Можно также уменьшить количество данных, возвращаемых клиенту, с помощью явно заданного списка требуемых столбцов в инструкции SELECT . Еще одним хорошим решением проблемы является получение строк в пакетах (например, содержащих несколько сотен строк одновременно), а также получение следующего пакета только после завершения обработки текущего.

Метод Fill неявно использует объект DataReader для возврата имен и типов столбцов, используемых для создания таблиц в DataSet, и данных для заполнения строк таблиц в DataSet. Таблицы и столбцы создаются только в том случае, если они еще не существуют. В противном случае метод Fill использует существующую схему DataSet . Типы столбцов создаются как типы .NET Framework в соответствии с таблицами, приведенными в разделе Сопоставление типов данных в ADO.NET. Первичные ключи создаются, только если они существуют в источнике данных и свойство DataAdapter.MissingSchemaAction имеет значение MissingSchemaAction.AddWithKey. Если Fill обнаруживает, что для таблицы существует первичный ключ, то данные в DataSet для строк, в которых значения столбцов первичного ключа совпадают со значениями в строках, возвращенных из источника данных, будут перезаписаны данными из источника данных. Если первичный ключ не найден, то данные добавляются в таблицы DataSet. Fill использует любые сопоставления, которые могут существовать при заполнении объекта DataSet (см. раздел Сопоставление DataAdapter, DataTable и DataColumn).

Примечание.

Если SelectCommand возвращает результаты OUTER JOIN, то DataAdapter не задает значение PrimaryKey для результирующего объекта DataTable. Вам необходимо самостоятельно определить PrimaryKey, чтобы повторяющиеся строки были корректно обработаны.

В следующем примере кода создается экземпляр SqlDataAdapter, использующий соединение SqlConnection для подключения к базе данных Northwind Microsoft SQL Server и заполняющий DataTable в DataSet списком клиентов. Инструкция SQL и аргументы SqlConnection , переданные в конструктор SqlDataAdapter , используются для создания свойства SelectCommand объекта SqlDataAdapter.

Пример

// 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");

Примечание.

Код, показанный в данном примере, не открывает и закрывает Connectionявным образом. Метод Fill неявно открывает Connection, которое используется DataAdapter, если обнаруживает, что соединение еще не открыто. Если Fill открыло соединение, оно также закрывает его после завершения Fill. Это позволяет упростить код при использовании отдельной операции, такой как Fill или Update. Однако при выполнении нескольких операций, требующих открытого соединения, можно повысить производительность приложения путем явного вызова метода Open объекта Connection, выполнения операций с источником данных и последующего вызова метода Close объекта Connection. Необходимо сохранять соединения с источником данных лишь на такое короткое время, насколько это возможно, освобождая ресурсы для использования другими клиентскими приложениями.

Несколько наборов результатов

Если объект DataAdapter обнаруживает несколько результирующих наборов, то создает несколько таблиц в DataSet. Таблицы получают добавочное имя по умолчанию TableN, для Table0 начинающееся с «Table». Если имя таблицы передаётся в качестве аргумента методу Fill, таблицам присваиваются стандартные имена вида TableNameN, начиная с «TableName» для TableName0.

Заполнить DataSet с помощью нескольких объектов DataAdapter

С DataSet можно использовать любое количество объектов DataAdapter. Каждый объект DataAdapter может использоваться для заполнения одного или нескольких объектов DataTable и обратной передачи обновлений в соответствующий источник данных. ОбъектыDataRelation и Constraint могут быть добавлены к DataSet локально, что позволяет связывать данные из разнородных источников данных. Например, DataSet может содержать данные из базы данных Microsoft SQL Server, базы данных IBM Db2, предоставляемой с помощью OLE DB, и источника данных, который передает XML. Один или несколько объектов DataAdapter могут обрабатывать соединение с каждым источником данных.

Пример

Следующий пример кода заполняет список клиентов из базы данных Northwind Microsoft SQL Server и список заказов из базы данных Northwind, который хранится в Microsoft Access. Заполненные таблицы связаны с помощью DataRelation, и затем отображается список клиентов вместе с заказами выбранного клиента.

// 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"]);
}

Тип «decimal» в SQL Server

По умолчанию DataSet сохраняет данные с помощью типов данных .NET. Для большинства приложений благодаря этому появляется удобный способ представления сведений об источнике данных. Однако такое представление может вызвать проблему, если в источнике данных используется тип данных SQL Server decimal или numeric. Тип данных decimal платформы .NET позволяет использовать максимум 28 значащих цифр, тогда как тип данных decimal в SQL Server позволяет использовать 38 значащих цифр. Если SqlDataAdapter определяет во время операции Fill, что точность поля decimal SQL Server превышает 28 символов, текущая строка не добавляется в DataTable. Вместо этого происходит событие FillError , которое позволяет определить, произойдет ли потеря точности, и предпринять соответствующие действия. Дополнительные сведения о событии FillError см. в разделе Обработка событий DataAdapter. Для получения значения типа decimal SQL Server можно также использовать объект SqlDataReader и вызывать метод GetSqlDecimal .

ADO.NET также включает расширенную поддержку System.Data.SqlTypes в DataSet. Дополнительные сведения см. в разделе SqlTypes and the DataSet.