1. Введение в ADO.NET
ADO.NET - это модель доступа к данным в приложениях .NET.
Ее можно использовать для доступа как к реляционным базам данных, таким как Microsoft SQL server 2000,
так и к другим источникам данных, для которых существуют OLE DB провайдеры. С одной стороны, ADO.NET
представляет просто очередной этап развития технологии ADO, но, с другой стороны, ADO.NET предлагает
фундаментальные нововведения, направленные на развитие в первую очередь Web-приложений, для которых
характерно использование слабо связанных, фактически оторванных от источников наборов данных.
Одно из ключевых изменений в ADO.NET связано с заменой объекта ADO Recordset
комбинацией новых объектов: DataTable, DataSet,
DataAdapter и DataReader. Объект DataTable представляет коллекцию
строк из одной таблицы и в этом отношении соответсвует объекту Recordset. Объект
DataSet, в свою очередь,представляет коллекцию объектов DataTable,
а также связывающие их отношения и ограничения. В сущности DataSet представляет
собой реляционную структуру в памяти со встроенной поддержкой языка XML.
Одна из ключевых особенностей объекта DataSet состоит в том, что этот объект ничего
не знает об источнике данных, который использовался для его заполнения. Это несвязанная самостоятельная
сущность, используемая для представления коллекции данных, которую можно передавать в рамках
распределенного приложения от одного компонента другому. Для передачи данных между источником данных
и объектом DataSet в ADO.NET используется объект DataAdapter.
Кроме того, он обеспечивает выполнение усовершенствованных функций пакетного обновления
данных, ранее относившихся к объекту Recordset.
Провайдеры данных на платформе .NET
ADO.NET пользуется услугами провайдеров
данных .NET. Они (провайдеры) обеспечивают
доступ к низлежащим источникам данных и
включают четыре ключевых объекта: Connection,
Command, DataReader и DataAdapter. В настоящее
время в состав поставки ADO.NET включено два
основных провайдера:
- SQL Server .NET Data Provider - это провайдер для
Microsoft SQL server 7.0 и более поздних версий. Этот
провайдер оптимизирован для доступа к SQL
server и использует его внутренний протокол
для работы с данными. Используйте его,
если вы собираетесь работать с данными
Microsoft SQL server 7.0 или 2000.
- OLE DB .NET Data Provider - это управляемый
провайдер для работы с любыми
источниками данных по протоколу OLE DB. Этот
провайдер менее эффективен, чем
предыдущий, так как реализует доступ к
данным через прослойку OLE DB. Необходимо
помнить, что этот провайдер не
поддерживает работу с OLE DB провайдером
для ODBC (MSDASQL). Для работы с источниками
данных через ODBC следует использовать ODBC .NET
Data Provider.
Кроме перечисленных, .NET предлагает
следующие виды провайдеров для работы с
данными:
- ODBC .NET Data Provider - обеспечивает "родной"
интерфейс для работы с ODBC-драйверами.
- Управляемый провайдер для получения XML-данных
в среде SQL server 2000.
Пространства имен
Типы (под типами .NET понимает классы,
структуры, перечисления и т.д.), связанные с
каждым провайдером данных, описаны в
отдельном пространстве имен:
- System.Data.SqlClient содержит типы,
относящиеся к SQL Server .NET Data Provider.
- System.Data.OleDb содержит типы, относящиеся
к OLE DB .NET Data Provider.
- System.Data.Odbc содержит типы,
относящиеся к ODBC .NET Data Provider.
- System.Data содержит типы, не зависимые от
конкретных провайдеров, например, DataSet
и DataTable.
В соответствующем пространстве имен для
каждого провайдера хранится реализация
специфичных для него объектов: Connection, Command,
DataReader и DataAdapter. Имена объектов в
пространстве имен SqlClient начинаются с
префикса Sql (например, SqlConnection),
аналогично в пространстве OleDb - с OleDb
(например, OleDbConnection).
Основы программирования
Если вы хотите иметь возможность
обращаться к различным источникам данных,
использую один и тот же код, имеет смысл
воспользоваться интерфейсами IDbConnection, IDbCommand,
IDataReader и IDbDataAdapter, определенными в
пространстве имен System.Data. Все реализации
объектов Connection, Command,
DataReader и DataAdapter должны поддерживать
эти интерфейсы.
Приведенный ниже рисунок показывает
возможные варианты доступа к данным с
помощью ADO.NET и других технологий,
включающих ADO и OLE DB.
Хранимые процедуры или непосредственные
вызовы SQL операторов
В большинстве примеров, которые вы
встретите в этой статье, манипуляции с
базой данных выполняются путем обращения к
хранимым процедурам посредством объектов
SQLCommand. В некоторых случаях вы не увидите
объекта SQLCommand, так как имя хранимой
процедуры передается непосредственно
объекту SQLDataAdapter, хотя в результате все
равно выполняется вызов SQLCommand. Для доступа
к данным рекомендуется
использовать именно хранимые процедуры, а
не непосредственные вызовы SQL операторов.
Это обусловлено следующими причинами:
- Хранимые процедуры обычно повышают
производительность при работе с данными,
так как сервер базы данных берет на себя
оптимизацию плана запроса и помещает его
в кэш для последующих обращений
- В рамках базы данных каждой хранимой
процедуре могут быть назначены
индивидуальные права доступа. Клиенту
могут быть предоставлено право вызова
процедуры, при этом он может не иметь прав
доступа к лежащим в ее основе таблицам
- Хранимые процедуры легче сопровождать,
так как модифицировать хранимую
процедуру проще, чем SQL-операторы,
закодированные в откомпилированном
приложении
- Хранимые процедуры вносят
дополнительный уровень абстракции,
отдаляя клиента от схемы базы данных
- Хранимые процедуры позволяют снизить
сетевой трафик, потому что позволяют за
один вызов выполнить пакет SQL-операторов,
минимизируя количество обращений
клиента к серверу.
Свойства или аргументы конструктора
Значения свойств объектов ADO.NET можно
устанавливать либо путем передачи
соответствующих аргументов конструктору,
либо непосредственно задавая значения
свойств. Так, например, следующие фрагменты
кода функционально одинаковы:
// Использование аргументов конструктора
SqlCommand cmd = new SqlCommand("SELECT * FROM PRODUCTS", conn);
// Индивидуальное задание свойств
sqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM PRODUCTS";
С точки зрения производительности кода
эти два подхода практически идентичны, так
как операции считывания и задания (set/get)
свойств в .NET объектах выполняются более
эффективно, чем в COM-объектах.
Поэтому выбор зависит от индивидуальных
предпочтений разработчика и выбранного
стиля программирования. Однако явное
задание свойств делает код более
читабельным, особенно для новичков ADO.NET,
облегчает процесс отладки.
|