Классы SqlDataAdapter и DataSet (Набор данных). Отсоединенный режим.
Класс DataSet (Набор данных) представляет собой резидентную упрощенную реляционную базу данных, не соединенную прямо ни с какой другой базой данных. Некоторые из его свойств описывают таблицы (Tables) и отношения (Relations) между ними в наборе данных. Управлять проверкой ограничений можно с помощью свойства EnfогceConstraint. Имя набора данных можно установить с помощью свойства DataSet-Name, а кроме того, его можно определить и в конструкторе DataSet (Набор данных).
И Класс SqlDataAdapter используется для передачи данных от базы данных объекту DataSet (Наборданных). В конструкторе класса HotelBroker (Посредник, бронирующий места в гостинице) продемонстрировано, как использовать SqlDataAdapter для заполнения набора данных. Пример CaseStudy для данной главы содержит приведенный ниже исходный код15. Этот фрагмент находится в файле HotelBroker .h из папки CaseStudy\HotelBrokerAdmin\Hotel.
conn = new SqlConnection(connString); citiesAdapter = new SqlDataAdapter(); citiesAdapter › SelectCommand = new SqlCommand("select distinct City from Hotels", conn); citiesDataset = new DataSet; // новый Набор данных citiesAdapter › Fill(citiesDataset, "Cities"); // Города
Среди свойств класса SqlDataAdapter есть такие, которые связывают его с операциями выборки, вставки, обновления или удаления данных источника данных. В нашем примере экземпляр класса SqlCommand не вызывается непосредственно одним из его методов, а связывается со свойством SelectCommand класса SqlDataAdapter.
Затем для выполнения указанной команды используется метод Fill (Заполнить) класса SqlDataAdapter. При этом объект DataSet (Набор данных) заполняется информацией из таблицы, имя которой указано как аргумент метода Fill (Заполнить). После завершения работы этого метода соединение остается в том же состоянии, в котором оно было при вызове метода.
Теперь соединение с базой данных можно закрыть. Но при этом, вне зависимости от наличия соединения с базой данных, можно продолжить работу с объектом DataSet (Набор данных), содержащим данные.
Класс SqlDataAdapter реализован на основе класса SqlDataReader, поэтому при использовании последнего можно ожидать большей производительности. SqlDataReader может также эффективнее использовать память. Это зависит от структуры.
Примером CaseStudy для этой главы является решение AcmeGui, состоящее из трех проектов AcmeGui, Customer и Hotel. Проекты Customer и Hotel реализованы на управляемом C++, проект Customer – на С". Так сделано потому, что AcmeGui реализует аспекты программы, связанные с графическим интерфейсом пользователя (GUI), а это значительно удобнее делать на С", нежели на управляемом C++. Тем не менее, поскольку в данной главе рассматриваются вопросы, связанные с доступом к базам данных, весь исходный код для работы с базами данных реализован на управляемом C++.
Так что, если у вас нет необходимости использовать преимущества класса DataSet (Набор данных), нет смысла увеличивать накладные расходы в приложении.
Отсоединенный режим
Режим работы с базами данных при отсутствии постоянного соединения с базой данных называют отсоединенным (disconnected). Соединенный режим представляет собой сильносвязанную среду, которая может содержать состояния и соединения. Среда клиент/сервер является тому подтверждением. Именно для такого подхода и были разработаны ADO и OLEDB (OLE для баз данных). В среде соединенного режима можно использовать устройства считывания данных. При необходимости для этих целей можно использовать, посредством обеспечивающих взаимодействие СОМ-компонентов, ADO. Фактически, специально для применения в .NET, изменения в ADO не вносились, так что здесь есть полная обратная совместимость, включая также ошибки и прочее.
Однако держать соединение постоянно открытым слишком дорого в среде, в которой требуется обеспечить возможность работы нескольким пользователям. Это относится к многоузловым и Internet-ориентированным решениям. В таких средах часто нет необходимости блокировать доступ к таблицам баз данных. А это способствует масштабируемости, так как уменьшает вероятность конфликтов. Объекты DataSet (Набор данных) из коллекции таких объектов Tables (Таблицы), с их ограничениями, могут имитировать таблицы исходной базы данных и взаимосвязи между ними. В приложениях, полностью реализованных в .NET, одна часть приложения может передавать или получать экземпляр DataSet (Набор данных). Конкурентоспособным разработкам это может дать большое преимущество в масштабируемости и производительности, что справедливо также для многих типов Internet-приложений и приложений, ориентированных на внутрисетевое применение.
При работе в отсоединенном режиме соединение осуществляется таким же образом, как и в соединенном режиме. Данные получают с помощью классов преобразования данных источников данных. Свойство SelectCommand определяет SQL-запрос, используемый для передачи данных в набор данных. В отличие от устройства считывания данных, которое связано соединением с определенной базой данных, набор данных не имеет связей ни с какой базой данных, даже с той, из которой были получены хранящиеся в нем данные.