Пространство
имен System.Data.OleDb
Пространство
имен System.Data.OleDb содержит классы,
используемые при взаимодействии с
OLE DB-совместимыми базами данных (такими,
как Microsoft Access или Microsoft Fox Pro). Обычно
в программах используются классы
OleDbConnectl on, OleDbCommand и OleDbDataReader этого
пространства имен. Ниже приведены
краткие описания этих важных
классов.
Ниже приведен
пример использования этих трех
классов. Наше приложение
подключается к базе данных Northwind,
входящей в поставку Access и
современных версий SQL Server.
1 Imports System.Data.OleDb
2 Module Modulel
3 Sub Maint)
4 Dim myAccessConn
As OleDbConnection
5 Dim dbReader As
OleDbDataReader
6 Dim dbCmd As
OleDbCommand =New OleDbCommand(
7 "SELECT
Employees.FirstName.Employees.LastName FROM Employees")
8 Try
9 ' Открыть
соединение
10 myAccessConn =
New OleDbConnection(
11 "Provider=Microsoft.Jet.OLEDB.4.0;"
&_
12 "Data Source=C:\Program Files \Microsoft _
Office\0ffice\SamplesNNorthwind.mdb")
13 myAccessConn.Open()
14 dbCmd.Connection
= myAccessConn
15 dbReader = dbCmd.ExecuteReader(CommandBehavior.SingleResult)
16 Do While dbReader.Read()
17 Console.WriteLine(dbReader.GetString(0) & " " & _
dbReader.GetString(1))
18 Loop
19 Console.ReadLine()
20 Catch e As
Exception
21 MsgBox(e.Message)
22 End Try
23 End Sub
24 End Module
Результаты,
полученные при запуске этого
приложения, показаны на рис. 11.1.
Рис. 11.1. Результаты
выполнения простого запроса SQL
Хотя наше
приложение всего лишь выводит
список работников Northwind, его код
типичен для подключения к любой
базе данных при помощи .NET-провайдера
OLE DB, предоставленного VB .NET. В строке
1 для упрощения дальнейших ссылок
импортируется пространство имен
System. Data. 0leDb. В строках 4 и 5
объявляются две объектные
переменные. Объект 0leDbConnecti on
инкапсулирует текущее соединение к
провайдеру OLE DB и в конечном счете к
базе данных (строки 10-12). Объект 0leDbDataReader
инкапсулирует рабочие данные. В
отличие от объектов RecordSet эти
данные не обязаны относиться к
одной таблице (хотя в нашем примере
это именно так). Строка 6 определяет
запрос SQL, хранящийся в объекте
OleDbCommand. Использована версия
конструктора с параметром типа Stri
ng, в котором передается команда SQL,
— в нашем случае это простейший из
всех возможных запросов. В строке 10
создается соединение с базой
данных. При вызове конструктора
передается строка с именем
провайдера OLE DB. Значение берется из
реестра Windows и не является частью .NET
(в нашем примере используется
стандартный провайдер для Access).
Также обратите внимание на жесткую
кодировку местонахождения базы
данных Northwind; в нашем примере выбран
каталог, используемый по умолчанию
при установке Office. Если на вашем
компьютере база данных Northwind
находится в другом каталоге,
отредактируйте эту строку.
Затем созданное
соединение открывается. Поскольку
эта операция по различным причинам
может завершиться неудачей,
программный код открытия и чтения
из базы данных заключается в блок Try-Catch.
После успешного вызова Ореn() (строка
13) соединение можно использовать в
программе (выполнение этих
операций в конструкторе позволило
бы сократить программу на
несколько строк). Объект OleDbCommand
пока не знает, какое соединение он
должен использовать, поэтому
открытое соединение с базой данных
назначается свойству Connecti on
объекта OleDbCommand (строка 14). Одно из
преимуществ подобного решения
заключается в том, что оно
позволяет использовать один объект
команды с несколькими соединениями.
Команда
выполняется методом ExecuteReader()
объекта 0leDbCommand (строка 15). Мы
используем метод ExecuteReader, поскольку
остальные методы Execute возвращают
данные в формате XML и традиционные
наборы записей, обрабатываемые
менее эффективно. В строке 14
значение перечисляемого типа
CommandBehavior. SingleResul t передается методу
ExecuteReader в качестве параметра. Флаг Si
ngl eResult означает, что команда должна
выбрать из базы данных все записи
результата. Другие флаги позволяют
ограничить выборку одной или
несколькими записями. Прочитанные
записи перебираются в цикле в
строках 16-18.
Код перебора
записей эквивалентен следующему
фрагменту VB6/ADO:
Do While Not rs.EOF
Print rs(0)
rs.MoveNext() Loop
Использование
метода Read предотвращает одну
распространенную ошибку, часто
допускаемую программистами VB6 ADO,
которые забывают перейти к
следующей записи методом MoveNext. Все
операции с одной записью
выполняются между вызовами Read,
поскольку после вызова Read
вернуться к содержимому предыдущей
записи уже не удастся.
В цикле
вызываются различные методы GetXXX
объекта 01 eDbReader, возвращающие
значение поля с заданным индексом (нумерация
полей записи начинается с 0). Таким
образом, вызов
dbReader.GetString()
возвращает
значение второго столбца в
формате String. Вместо индекса при
вызове GetStrlng можно указать имя
столбца, но этот вариант менее
эффективен.
Перед
получением значения поля
необходимо указать правильный тип.
Мы всегда про-граммируем в режиме
Option Strict On, поэтому преобразования
данных с потерей точности
допускаются лишь с явным
приведением к заданному типу.
Чтение данных
из базы SQL Server происходит
аналогичным образом —
пространства имен OleDb и SqlClient имеют
практически одинаковый синтаксис.
Ниже приведена версия предыдущей
программы для SQL Server:
Imports System.Data.SqlClient
Module Modulel
Sub Main()
Dim mySQLConnString
As String
Dim mySQLConn As
SqlConnection
Dim dbReader As
SqlDataReader
Dim dbCmd As
SqlCommand = New SqlCommand(
"SELECT
Employees.FirstName.Employees.LastName FROM
Employees") Try
mySQLConnString = _
"uid-test:password=apress;
database=northwind:server=Apress"
mySQLConn = New
SqlConnection(mySQLConnString)
mySQLConn.Open()
dbCmd.Connection =
mySQLConn
dbReader = dbCmd.ExecuteReader(CommandBehavior.SingleResult)
Do While dbReader.Read()
' Вывести данные в консольном окне
Console.WriteLinetdbReader.GetString(0) & "." &_
dbReader.GetString(1))
Loop
Catch e As Exception MsgBox(e.Message)
End Try
Console. ReadLine()
End Sub
End Module
Основное
различие (помимо имен классов)
наблюдается в формате строки
соединения. Предполагается, что на
сервере Apress имеется учетная запись
с паролем apress. При подключении к SQL
Server в строке соединения
указывается идентификатор
пользователя, пароль, сервер и имя
базы данных. Передавая эту
информацию, мы получаем объект
соединения. Конечно, лишь
простейшие запросы формулируются в
виде простой строки; в любом
сколько-нибудь нетривиальном
случае строку запроса приходится
строить из отдельных фрагментов.
Несмотря
на разный формат строк соединения,
в приложениях SQL и OLE DВ используется
одна и та же программная модель ADO .NET
— это весьма существенное
преимущество. Наличие общих
интерфейсов IDbConnection, IdbCommand и т. д.
значительно упрощает написание
обобщенного кода в ADO .NET.