|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Простір
імен 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 можна вказати ім'я
стовпця, але цей варіант менш
ефективний.
Читання даних
з бази 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 в рядку з'єднання
указується ідентифікатор
користувача, пароль, сервер і ім'я
бази даних. Передаючи цю
інформацію, ми отримуємо об'єкт
з'єднання. Звичайно, лише
прості запити формулюються у
вигляді простого рядка; у будь-якому
скільки-небудь нетривіальному
випадку рядок запиту доводиться
будувати з окремих фрагментів.
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||