Пространство имен System.Data.OleDb

Пространство имен System.Data.OleDb содержит классы, используемые при взаимодействии с OLE DB-совместимыми базами данных (такими, как Microsoft Access или Microsoft Fox Pro). Обычно в программах используются классы OleDbConnectl on, OleDbCommand и OleDbDataReader этого пространства имен. Ниже приведены краткие описания этих важных классов.

  • Класс OleDbConnection: можно считать, что этот класс представляет соединение с источником данных OLE DC и содержит свойства, необходимые для подключения к базе данных (данные провайдера OLE DB, имя пользователя и пароль). После соединения в экземпляре класса сохраняются дополнительные метаданные о базе данных.
  • Класс OleDbCommand: класс представляет команды SQL, применяемые к базе данных OLE DB. Вместе с командой хранятся все параметры и дополнительная информация, необходимая для обработки запроса.
  • Класс OleDbDataReader: используется после получения данных от источника при помощи двух классов, описанных выше. Является специализированной формой класса потока ввода (см. главу 9) и умеет только читать данные, возвращаемые объектом OleDbCommand. Аналогом объекта DataReader в ADO является набор записей, хранящийся на сервере, доступный только для чтения и поддерживающий только перебор в прямом направлении.
  • Ниже приведен пример использования этих трех классов. Наше приложение подключается к базе данных 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, поэтому преобразования данных с потерей точности допускаются лишь с явным приведением к заданному типу.

     

    System. Data.SqlClient

    Чтение данных из базы 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.