Использование объектов подключения и набора записей ADO
Владея основами работы с ADO, можно переходить к написанию программ для работы с ADO в приложениях. Мы снова воспользуемся средствами ADO для подключения к базе данных Biblio.mdb, но и этого будет вполне достаточно для демонстрации общих принципов. Начнем со следующего примера и затем перейдем к программированию:
1. Создайте новый проект командой File > New Project. Выберите в диалоговом окне New Project значок Standard EXE и нажмите кнопку ОК.
2. Задайте свойству Name проекта значение ADORecordset.
3. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption — зна-чениеРабота с наборами записей ADO.
4. Создайте список на форме frmMain и задайте его свойству Name значение 1st Authors.
Как упоминалось ранее, элемент данных ADO является элементом ActiveX. Его можно перетащить на форму, как и любой другой элемент. Объекты подключения и набора записей являются DLL-библиотеками (библиотеками динамической компоновки) Active, и доступ к ним осуществляется только с помощью ссылки на библиотеку типов.
ПРИМЕЧАНИЕБиблиотека типов содержит полное описание компонента: свойства, методы, события и типы данных.
5. Выполните в Visual Basic команду Project > References, чтобы открыть диалоговое окно References.
6. Создайте ссылку на библиотеку типов ADO. Для этого следует установить флажок рядом со строкой Microsoft ActiveX Data Objects 2.0 (рис. 8.19).
Puc. 8.19. Создание ссылки на библиотеку типов ADO
7. Нажмите кнопку OK, чтобы создать ссылку на библиотеку и закрыть диалоговое окно References. Теперь вы можете использовать объекты подключения и набора записей ADO в своей программе.
8. Добавьте следующие объявления в секцию (General)(Declarations) формы:
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
9. Вставьте следующий фрагмент в процедуру события Form_Load:
Private Sub Form_Load()
Dim cmd As String
Dim sql As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
'Создать строку подключения
cmd = "Provider=microsoft.jet.OLEDB.3.51'" & _
"Data Source=" & _
"C:\Program Files\Microsoft Visual Studio" & _
"\VB98\Biblio.mdb"
'Установить соединение с базой данных
Set cn = New ADODB.Connection
With cn
.ConnectionString = cmd
.Open
End With
' Создать запрос
sql = "select * from authors"
' Открыть набор записей
Set rs.= New ADODB.Recordset
With rs
.Open sql, cn, adOpenForwardOnly, adLockReadOnly
Do While Not rs.EOF
' Включить автора в список
lstAuthors.AddItem rs("Author")
' Перейти к следующей записи
rs.MoveNext
Loop
' Закрыть набор записей .
Close
End With
Set rs = Nothing
' Закрыть подключение
cn.Close
'уничтожить объект подключения
Set cn = Nothing
End Sub
10.Сохраните и запустите проект.
Программа просто обращается к базе данных Biblio.mdb и заполняет список именами авторов из таблицы Authors. Наверное, вам покажется, что для такой простой задачи программа получилась слишком большой, но если как следует разобраться, вы поймете, что в ней нет ничего сложного.
В начале программы объявляются две переменные, cmd и sql. В переменной cmd, будет храниться строка подключения ADO, используемая для подключения к базе данных. Переменная sql предназначена для текста SQL-запроса. Следующий фрагмент создает строку для подключения к Biblio.mdb c помощью нового провайдера OLEDB (указывается после конструкции Provider = в начале строки).Если вам потребуется подключиться к источнику данных другого типа, допустим, к SQL Server - укажите другого провайдера. Второй параметр стро ки определяет имя базы данных. Строка подключения ADO выполняет всю основную работу, поэтому ей следует уделить основное внимание. Выделение этого кода в отдельную функцию позволяет создавать различные строки подключения для работы с различными базами данных (например, Access, SQL Server и Oracle). Такой функции можно передавать параметр, по которому строится уникальная строка подключения. Это упростит процесс перенесения ваших приложений с поддержкой ADO на другие источники данных.
Следующий шаг — фактическое подключение к базе данных. Для этого мы создаем объект ADO.Connection и затем устанавливаем его свойство ConnectionString равным cmd. После этого выполняется метод . Open данного объекта. Метод берет данные, находящиеся в свойстве ConnectionString, и использует их для подключения к базе.
После установки соединения с базой мы открываем объект ADO. Recordset для получения записей. Тем не менее сначала необходимо передать ему SQL-запрос, который определяет нужные записи. В нашей программе это делает следующая строка:
sql = "select * from authors"
Не вдаваясь в подробности SQL, этот запрос означает следующее: «выбрать все (*) записи из таблицы с именем Authors». Именно это и было сделано в нашем примере.
У нас имеется запрос, по которому можно создать набор записей. Новый объект набора записей создается следующим образом:
Set rs = New ADODB.Recordset
Только что созданный набор не содержит никакой информации. В блоке With мы приказываем ADO открыть набор командой
With rs
.Open sql, cn, adOpenForwardOnly, adLockReadOnly
Вероятно, вы обратили внимание на параметры, необходимые для открытия набора записей. В первом параметре хранится SQL-запрос для данного набора. Второй параметр, cn, говорит о том, что для подключения к базе данных набор должен использовать объект подключения cn. Можно провести аналогию между набором записей и машиной: подключение — дорога, по которой машина добирается к данным. Следующий параметр сообщает ADO, какой тип курсора базы данных должен использоваться для набора. В следующей таблице перечислены возможные варианты курсоров с краткими описаниями.
Тип курсора | Описание |
adOpenForwardOnly | Курсор этого типа может использоваться лишь для последовательного перебора записей в одном направлении. Перебор в обратном направлении и произвольные переходы не разрешаются. Тем не менее этот вариант отличается быстротой и пригодится в случае, если вам потребовалось быстро заполнить список или комбинированное поле |
Ad0penKeyset | Оптимальный тип курсора для больших наборов. Вы не получаете сообщений об изменениях в данных, которые могут повлиять на ваш набор записей |
Ad0penDynamic | Курсор позволяет отслеживать все изменения, вносимые другими пользователями в ваш набор записей. Он обладает наибольшими возможностями, но из-за этого работает медленнее всех остальных |
AdOpenStatic | Статический курсор удобен для небольших наборов |
Наконец, последний параметр сообщает ADO о том, что доступ к набору записей будет осуществляться только для чтения. Вместо него можно указать другой pe-жимблокировки из следующей таблицы, однако в нашем примере был выбран самый быстрый вариант.
Тип блокировки | Описание |
aLockReadOnly | Данный режим блокировки следует использовать лишь в том случае, если вы не собираетесь добавлять, обновлять или удалять записи из набора |
AdLockPessimistic | Запись блокируется в момент начала редактирования и остается заблокированной до его завершения или перемещения курсора к следующей записи |
AdLockOptimistic | Оптимистический режим: блокировка включается при вызове метода . Update для записи. В процессе редактирования запись остается незаблокированной и лишь временно блокируется на время сохранения изменений в базе |
AdLockBatchOptimistic | Режим позволяет выполнять оптимистическую блокировку при обновлении нескольких записей |
Если все параметры были указаны верно, набор записей открывается и вы можете работать с его данными.
В следующем фрагменте программа в цикле перебирает все записи до тех пор, пока не будет найден признак конца файла (EOF). При перемещении курсора к очередной записи мы заносим данные из поля Author в список:
lstAuthors.AddItem rs("Author")
После занесения очередного имени в список мы переходим к следующей записи с помощью метода . MoveNext. Если позабыть об этом, цикл будет работать вечно, потому что признак конца файла никогда не будет достигнут. Наконец, после окончания работы все открытое нужно закрыть, а все созданное — уничтожить. Для этого следует вызвать метод .Close для объектов Recordset и Connection. Далее этим объектам присваивается Nothing для предотвращения утечек памяти в вашем приложении.
ВНИМАНИЕОбрабатывая записи набора в цикле, обязательно включайте в него метод . MoveNext. Если вы забудете это сделать (а это случается часто), ваша программа зациклится. Запишите оператор Do While..., a потом - команду .MoveNext сразу же перед командой Loop, а уже потом вставляйте свой код обработки данных. Тем самым вы сводите вероятность ошибки к минимуму.
Добавление записей
Хотя в данном примере такая возможность не требовалась, в большинстве приложений в наборы добавляются новые записи. С объектами наборов записей ADO эта задача выполняется чрезвычайно просто. Для этого в программе следует вы-зватьметод .AddNew:
rs.AddNew
rs("Author) = "Doe, John" rs("Au_ID") = 123456
rs.Update
Все очень просто. Когда вам требуется создать новую запись, вы вызываете метод .AddNew. Он создает пустую запись, в которую затем заносятся данные. Это можно сделать несколькими способами, включая следующие:
Rs("Author") = "Doe, John"
Rs!Author = "Doe, John"
Rs.Fields(1) = "Doe, John"
Все они эквивалентны, и выбор зависит лишь от вашего личного вкуса. Лично я предпочитаю первый способ, потому что он выглядит наиболее очевидно. Я точно знаю, какое поле обновляется, а поскольку имя поля заключено в кавычки, оно может содержать пробелы.
После занесения данных в запись следует обновить набор, вызвав метод . Update.
Обновление записей
Процесс обновления записей напоминает процесс добавления, однако на этот раз вам не придется вызывать метод .AddNew. Достаточно переместить курсор базы данных к нужной записи, изменить данные и вызвать метод . Update. Например:
Rs("Author") = "Brown, Steve"
Rs("Au_ID") = 373737
Rs.Update
ПРИМЕЧАНИЕЕсли вам приходилось работать с объектами DAO, возможно, вы привыкли вызывать метод . Edit для перехода к редактированию данных. Он не поддерживается объектами ADO.
Удаление записей
Удаление записей в ADO выполняется так же просто. Все, что от вас требуется -установить курсор базы данных на удаляемой записи и вызвать метод . Delete. Программа выглядит примерно так:
'Создать запрос
sql = "select *from authors where [Author] = 'Brown, Steve""
' Открыть набор записей
Set rs = New ADODB.Recordset
With rs
.Open sql, cn, adOpenForwardOnly, adLockReadOnly
If rs.RecordCount > 0 Then
rs.Delete
End If
' Закрыть набор записей
.Close
End With
' Уничтожить объект набора записей
Set rs = Nothing
ПОДСКАЗКАПереходите на использование ADO, поскольку Microsoft развивает свои технологии работы с данными именно в этом направлении. Вы не только будете работать с последними технологическими новинками, но и сможете переносить свои приложения на другие источники данных с минимальными изменениями кода (или вообще без изменений).Более того, ADO даже позволяет организовать обмен данными между базой и Web-страницей!
Теперь вы умеете создавать базы данных Access и работать с ними различными способами. Навыки, описанные в этом уроке, помогут вам работать с базами данных в будущих приложениях. Хотя возможности новой версии Visual Data Manager заметно возросли, все же я рекомендовал бы приобрести Microsoft Access, если вы не сделали этого раньше. Access обладает многими возможностями, упрощающими создание базы данных даже по сравнению с описанным выше несложным процессом. А самое приятное — ваши базы данных останутся совместимыми с Visual Basic!
Научившись работать с файлами и базами данных, вы сможете взять данные из своего приложения и сохранить их для последующей загрузки или печати, а также воспользоваться ими для сохранения и выборки рабочих параметров приложения. Не жалейте времени на эксперименты с Visual Data Manager. Он обладает многими возможностями, не упоминавшимися в этом уроке (полное описание потребовало бы отдельной книги). Объединяя возможности Visual Basic по программированию и работе с базами данных, вы сможете создавать достаточно мощные приложения. Следующий урок посвящен третьему важному аспекту любого приложения — печати.
Что нового мы узнали?
В этом уроке мы научились:
Открывать ASCII-файлы и работать с ними.
Работать с файлами в режиме последовательного, произвольного и двоичного доступа.
Использовать элемент данных для доступа к базам данных.
Использовать Visual Data Manager.
Создавать таблицы и запросы.
УРОК Печать
Вывод данных на печать
Метод Print
Окно непосредственных вычислений
Метод PrintForm
Коллекция Printers
Использование Crystal Reports в VisualBasic
Работа с отчетами в приложениях
Печать исходных текстов программы
Результаты, выведенные на принтер, — ощутимый плод ваших усилий по программированию. Когда речь заходит о приложениях и программировании, на принтер выводится самая разнообразная информация. Возможно, вам захочется получить листинг своей программы, экранную копию проектируемой формы или результаты работы вашего приложения. Visual Basic позволяет сделать все это и многое другое!
В этом уроке вы узнаете, как коллекция Printers и объект Printer применяются для вывода данных на форму, в окно непосредственных вычислений или на принтер. Кроме того, вы научитесь использовать Crystal Reports Pro для построения профессиональных отчетов, интегрируемых непосредственно в приложения Visual Basic.
Вывод данных на печать
На протяжении своего жизненного цикла программа вводит данные, производит с ними операции в памяти и, возможно, сохраняет на диске. Все эти функции чрезвычайно важны, и во многих приложениях без них не обойтись, но все же самое важное — вывести их на печать. В Visual Basic существует несколько способов печати:
О печать текущей формы;
О построчная печать на форме или принтере;
О печать в окне непосредственных вычислений;
О печать отчетов, созданных в Crystal Reports Pro (поставляется с Visual Basic);
О печать из другого приложения (например, Word for Windows) средствами DDE и OLE Automation.
Метод Print
Наш урок начинается с изучения метода Print. Он выводит значения переменных, что позволяет вам проследить за тем, как эти переменные изменялись перед выполнением оператора Print. Кроме того, значения переменных можно просмотреть в окне непосредственных вычислений — для этого следует прервать выполнение программы (команда Run > Break). Метод Print применяется для вывода данных на форму и на принтер. Для вывода информации на принтер используется метод Printer. Print, а для вывода на текущую форму достаточно просто написать Print, хотя в подобных случаях рекомендуется указывать перед методом имя объекта (например, frmMyForm.Print).
ПРИМЕЧАНИЕМетод Cls убирает с формы весь текст, выведенный ранее. Если его не вызвать, после нескольких вызовов Print текст исчезает под нижним краем формы.
При выводе на принтер необходимо указать, когда следует приступать к печати. Метод Print лишь направляет результаты вывода в память — он готовит их к пе-
чати, но не печатает. Почему? Представьте себе, что вам нужно напечатать несколько строк на одной странице. Если бы метод Ргint немедленно начинал печатать, то вы бы получили несколько страниц, на каждой из которых была выведена одна строка. Печать начинается методом EndDoc, а для многостраничных документов существует метод NewPage.
Например, следующий фрагмент (возможно, находящийся в процедуре события Click формы) печатает документ, состоящий из нескольких страниц:
Printer.Print "Первая страница"
Printer.Print "Вторая строка на первой странице"
Printer.NewPage
Printer.Print "Вторая страница"
Printer.EndDoc