Платформа .NET Framework,
предложенная недавно корпорацией Microsoft
содержит множество новых технологий: Common Language Runtime (CLR), Active Server Pages+ (ASP+), Web Forms, Win Forms и множество библиотек классов, которые составляют Class Framework.
Есть в .NET новая библиотека доступа к базам данных - ADO.NET, она же ADO+ (ActiveX Data Objects). В этой статье
описана объектная модель ADO+ и показаны
основные возможности этой библиотеки.
Изменения
Отличий ADO+ от ADO
много. О них будет рассказано ниже:
·
ADO+ намного лучше поддерживает работу с
отсоединенными данными. Появился объект Dataset,
который используется для хранения отсоединенных данных.
·
В ADO+ включена поддержка XML. Теперь можно без затруднений работать с базами данных,
поддерживающими XML. Вы можете импортировать и
экспортировать в Dataset не только данные, но и схемы.
·
В ADO.NET удобнее создавать связи между
таблицами.
·
Ну и, конечно же, куча мелких изменений.
Объектная модель
На рис. 1 представлена объектная модель ADO+.
Рисунок 1. Объектная модель ADO
В таблице 1 кратко описаны функции каждого из основных объектов.
Объект
|
Функции
|
Connection
|
Создание соединения с базой данных.
|
Command
|
Создание команды SQL
и ее выполнение.
|
DataReader
|
Чтение данных из базы данных.
|
DataAdapter
|
Связь объекта DataSet
с базой данных.
|
DataSet
|
Хранение и работа с отсоединенными
данными.
|
Таблица 1.
Итак, чем же отличаются объектные модели ADO+
и ADO? Старый добрый Recordset
заменен объектом DataReader. Он отличается от Recordset тем, что перемещаться по записям в DataReader можно только вперед (forward only), к тому же DataReader
открыт только для чтения (read only). Главное преимущество DataReader
перед Recordset - скорость.
Появился объект DataSet, который
используется для хранения отсоединенных данных и работы с ними. DataSet связывается с базой данных с помощью объекта DataAdapter.
Выборка данных
Как осуществить выборку данных в ADO+?
Очень просто! Напишем 2 строчки в разделе Form Declarations (в самом начале
модуля), чтобы импортировать пространства имен. Это позволит нам, к примеру,
писать DataSet вместо System.Data.DataSet.
Imports System.Data
Imports System.Data.OleDb
Сначала нужно объявить необходимые переменные:
Dim Conn As OleDbConnection
Dim Comm As OleDbCommand
Dim DR As OleDbDataReader
Затем создаем и открываем соединение с базой данных:
Conn = New OleDbConnection()
Conn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
"C:\qa.mdb"
Conn.Open()
Создаем экземпляр объекта Command. Свойству
Connection присваиваем ссылку на объект Conn, а свойству CommandText – запрос
SQL:
Comm = New OleDbCommand)
Comm.Connection = Conn
Comm.CommandText = "Select * From
Questions"
Затем присваиваем объекту DR результат
метода ExecuteReader объекта Comm
и выводим в TextBox1 значение поля name:
DR = Comm.ExecuteReader
Do While DR.Read
TextBox1.Text = TextBox1.Text &
DR("name") & vbCrLf
Loop
Метод Read объекта DataReader
используется для перехода к следующей записи. После прочтения последней записи
он возвращает False.
Данные получены, теперь нужно закрыть объекты DR
и Conn и уничтожить их:
DR.Close()
Conn.Close()
DR = Nothing
Conn = Nothing
Изменение и удаление записей
Изменить или удалить запись в БД можно, выполнив соответствующую SQL-команду. Для этого нам нужны только 2 объекта: Connection и Command. Поскольку при
выполнении команды-действия получать данные из БД нам не нужно, мы
воспользуемся методом ExecuteScalar, а не ExecuteReader. Код, расположенный ниже удаляет из таблицы Questions запись, в которой значение поля ID
равно 1:
Dim Conn As OleDbConnection
Dim Comm As OleDbCommand
Conn = New OleDbConnection()
Conn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
"C:\qa.mdb"
Conn.Open()
Comm = New OleDbCommand("Delete From
Questions Where ID=1", Conn)
Comm.Connection = Conn
Call Comm.ExecuteScalar()
Отличие доступа к соединённым данным
Как Вы могли
заметить, технология доступа к соединённым данным (выборка, изменение и
удаление записей) также немного изменилась.
Во-первых, если в ADO можно было при выборке данных обойтись
без объекта Command (его функции частично заменял объект Recordset), то теперь его использование стало
обязательным.
Во-вторых, изменение
и удаление записей теперь осуществляется только с помощью SQL команд
(раньше можно было изменять и удалять записи, используя объект Recordset).
DataSet
Объект DataSet впервые появился в ADO+. Он используется для работы с отсоединенными данными. На
рис. 2 представлена структура объекта DataSet.
Рисунок 2. Структура объекта DataSet
Объект DataSet содержит 2 коллекции.
Коллекция Relations содержит связи полей разных таблиц (объекты
DataRelation). Коллекция Tables
содержит таблицы (объекты DataTable).
Объект DataTable содержит 3 коллекции.
Коллекция Columns содержит поля таблицы (объекты DataColumn). Коллекция Rows – записи
таблицы (объекты DataRow). А коллекция Constraints содержит объекты Constraint.
Объект Constraint задаёт
некоторое правило для конкретного поля. Самые распространённые правила - ForeignKey
Constraint и Unique Constraint. Первое правило отвечает за сохранность связей,
т.е. чтобы удаление записей, на которые имеются ссылки из других таблиц, было
невозможным. А второе используется для того, чтобы избежать дублирующихся
записей (часто это правило устанавливается для поля ID).
Создание Dataset
Предположим, нужно создать DataSet с одной
таблицей, двумя полями, десятью записями и первичным ключом. Сначала объявим
все необходимые переменные:
Dim ds As DataSet
Dim tb As DataTable
Dim col As DataColumn
Dim pkColArray(1) As DataColumn
Dim workRow As DataRow
Dim i As Integer
Теперь нужно создать экземпляр объекта DataSet:
ds = New DataSet()
Создаем таблицу Questions и добавляем ее в
коллекцию Tables объекта DataSet:
tb = New DataTable()
tb.TableName = "Customers"
ds.Tables.Add(tb)
Таблица создана, теперь надо создавать поля. Они создаются
аналогично таблице. Объект Column имеет свойства Unique и AllowNull. Если свойство Unique равно True, поле не может
содержать одинаковые значения в разных записях. Если свойство AllowNull
равно True, поле может иметь значение Null.
Также с помощью свойства DefaultValue можно присвоить
полю значение по умолчанию.
col = New DataColumn()
col.ColumnName = “CustomerID”
col.DataType =
System.Type.GetType("System.Int32")
col.Unique = True
tb.Columns.Add(col)
col.ColumnName = “CustomerName”
col.DataType =
System.Type.GetType("System.String")
col.DefaultValue = “Имя”
tb.Columns.Add(col)
На заключительном этапе создания структуры нужно задать первичный
ключ по первому полю таблицы. Это делается с помощью свойства PrimaryKey
объекта DataTable. Нужно создать массив, состоящий из
двух элементов (с индексами 0 и 1), элементу 0 присвоить ссылку на поле CustomerID и присвоить свойству PrimaryKey
объекта DataTable этот массив.
pkColArray(0) =
tb.Columns("CustomerID")
tb.PrimaryKey = pkColArray
Структура создана, теперь нужно заполнить DataSet
данными. Это делается с помощью объекта DataRow,
который представляет собой запись.
For i = 1 To 10
workRow = tb.NewRow()
workRow("CustomerID") = i
workRow("CustomerName") = "Имя
номер " & i.ToString()
tb.Rows.Add(workRow)
Next
Загрузка данных из БД в DataSet
Для того чтобы загрузить данные из базы данных в объект DataSet, нужно воспользоваться объектом DataAdapter,
а точнее его методом Fill. Как всегда, сначала
объявляем переменные:
Dim Conn As OleDbConnection
Dim Comm As OleDbCommand
Dim Ad As OleDbDataAdapter
Открываем соединение и создаем команду:
Conn = New OleDbConnection()
Conn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
"C:\qa.mdb"
Conn.Open()
Comm = New OleDbCommand)
Comm.Connection = Conn
Comm.CommandText = "Select * From
Questions"
Создаем экземпляры объектов DataSet и DataAdapter:
DS = New DataSet()
Ad = New OleDbDataAdapter()
Заполняем DataSet:
Ad.SelectCommand = Comm
Ad.Fill(DS, "Questions")
И напоследок закрываем и удаляем соединение:
Conn.Close()
Conn = Nothing
XML
В ADO+ появилась поддержка XML. ADO+ позволяет работать с XML-файлами.
Загрузить XML-файл в объект DataSet можно с помощью метода ReadXml
объекта DataSet. В качестве параметра методу нужно
передать путь и имя XML-файла.
Dim ds As Dataset
ds.ReadXml(System.AppDomain.CurrentDomain.BaseDirectory
& "xml.xml") ‘загружаем файл xml.xml из директории приложения
Содержимое объекта DataSet можно сохранить
в XML-файле с помощью метода WriteXml.
Dim ds As Dataset
ds.WriteXml(System.AppDomain.CurrentDomain.BaseDirectory
& "xml.xml") ‘сохраняем данные в файл xml.xml в директории
приложения
Сохранить и загрузить структуру данных объекта DataSet
(имена таблиц, имена и типы полей и т.д.) можно с помощью методов WriteXmlSchema и ReadXmlSchema.
Dim ds As Dataset
ds.ReadXmlSchema(System.AppDomain.CurrentDomain.BaseDirectory
& "xmlschema.xml") ‘загружаем файл xmlschema.xml из директории
приложения
ds.WriteXmlSchema(System.AppDomain.CurrentDomain.BaseDirectory
& "xmlschema.xml") ‘сохраняем структуру в файл xmlschema.xml в
директории приложения
Заключение
Система доступа к данным ADO.NET, впрочем,
как и другие компоненты .NET Framework, претерпела
огромные изменения. Как всегда, есть как хорошие, так и плохие изменения. Но
все-таки больше хороших. Конечно, это только мое мнение.
Статья впервые опубликована в журнале "Программист".
Павел Сурменок
pavel@vbnet.ru
http://vbnet.ru