Visual Basic, .NET, ASP, VBScript
 

   
 

.NET разработчик, автор множества статей. В ранние годы (2001 - 2003) занимался разработкой на Visual Basic 6 и Active Server Pages, с 2003 года в основном занят разработкой корпоративного программного обеспечения на платформе Microsoft .NET (C#, VB.NET; ASP.NET, Silverlight). Личный блог: http://pavel.surmenok.com/

 
     
   
 

Платформа .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

 
     

   
   
     
  VBNet рекомендует