Элемент управления Data и объекты доступа к данным
1. Перемещение по набору записей с использованием Move-методов.
2. Перемещение по набору записей с помощью закладок.
3. Применение Find-методов для поиска записи.
4. Использование метода Seek для поиска записи.
5. Как узнать, можно ли изменять базу данных.
7. Редактирование текущей записи.
Использование объекта управления данными позволяет быстро создавать простые приложения для работы с базами данных практически без написания кода, только при помощи соответствующих установок его свойств и применения его методов. Для отображения информации на экранной форме используются связанные элементы управления. Однако, для повышения функциональности разрабатываемого приложения вам, скорее всего, придется все-таки писать код. К счастью, Visual Basic 5 обеспечивает очень широкие возможности для программирования операций с данными. В следующих разделах этой главы описана лишь небольшая часть из чрезвычайно широкого сервиса, предоставляемого разработчику системой Visual Basic 5. Более полно и подробно использование в приложениях объектов доступа к данным изложено в последующих уроках.
Перемещение по набору записей с использованием Move-методов
Ранее было показано, как перемещаться от записи к записи в базе данных с использованием кнопок со стрелками на объекте управления данными. В этом разделе обсуждаются способы перемещения по базе данных с использование методов объекта Recordset, созданного объектом Data, то есть с помощью программного кода.
Следующая таблица показывает, вызов какого из методов объекта Recordset эквивалентен нажатию кнопки со стрелкой на объекте управления данными.
Куда переместить указатель текущей записи | Кнопка на объекте Data | Использование метода Move |
К первой записи | Data1.Recordset.MoveFirst | |
К предыдущей записи | Data1.Recordset.MovePrevious | |
К следующей записи | Data1.Recordset.MoveNext | |
К последней записи | Data1.Recordset.MoveLast |
При разработке приложений часто возникает необходимость перемещения к первой или последней записи в наборе записей. Например, если вам требуется запрограммировать процедуру поиска записи, содержащей какое-либо значение, вполне естественным условием будет начинать поиск с первой строки.
Для перемещения указателя текущей записи на первую или последнюю записи используются методы MoveFirst и MoveLast:
Data1.Recordset.MoveFirst
Data1.Recordset.MoveLast.
Если текущий указатель позиционирован на первой или последней записи в наборе записей, то дальнейшее перемещение назад и вперед, соответственно, устанавливает свойства объекта Recordset BOF и EOF в True. Если BOFAction и EOFAction свойства объекта управления данными установлены в единицу, то в этом случае указатель текущей записи становится недопустимым и связанные органы управления очищаются. При использовании метода Move для перемещения указателя за пределы файла Visual Basic генерирует ошибку.
Пусть требуется последовательно проделать какие-либо операции с записями от текущей до последней включительно. В этом случае вы можете использовать следующий фрагмент кода для безопасного перемещения от любой записи в базе данных к последней:
Do While Data1.Recordset.EOF = False
Data1.Recordset.MoveNext
код для работы с текущей записью
Loop
Data1.Recordset.MoveLast
В конце этого цикла указатель текущей записи становится недопустимым и требуется использовать метод MoveLast, чтобы его переустановить на последнюю запись в наборе.
Методы MoveNext и MovePrevious перемещают указатель на следующую и предыдущую записи в наборе записей. Обычно эти методы используются для последовательного просмотра содержимого полей базы данных.
Следующий фрагмент кода загружает два списка и заполняет их названиями книг и годами их публикации из таблицы TITLES базы данных BIBLIO.MDB.
Data1.DatabaseName="С:\VB5\BIBLIO.MDB"
Data1.RecordSource="Titles"
Data1.Refresh
Do Until Data1.Recordset.EOF
Entry = Data1.Recordset("Title")
List1.AddItem Entry
Entry = Data1.Recordset("Year Published")
List2.AddItem Entry
Data1.Recordset.MoveNext
Loop
Вы также можете применить Move метод с целочисленным аргументом для перемещения указателя текущей записи на определенное количество строк вперед или назад (в зависимости от знака аргумента) от текущего положения указателя или от положения, сохраненного с использованием закладки. Следующий пример показывает, как переместить указатель текущей записи на пять строк вперед, начиная от положения, определенного свойством MyBookmark:
Data1.Recordset.Move 5, MyBookmark.
Для перемещения по набору записей также можно использовать такие свойства объекта Recordset, как AbsolutePosition и PercentPosition.
Перемещение по набору записей с помощью закладок
Использование закладки (bookmark) позволяет сначала сохранить указатель на текущую запись и затем, из любого места базы данных непосредственно позиционировать его на этой записи. Свойство Bookmark объекта Recordset содержит указатель на запись. Установкой свойства Bookmark, равному значению сохраненного ранее указателя, вы можете прямо позиционировать указатель на требуемую запись.
Следующий фрагмент кода устанавливает указатель текущей записи в положение, предварительно сохраненное с использованием закладки MyBookmark:
Dim MyBookmark As Variant
MyBookmark = Data1.Recordset.Bookmark
Data1.Recordset.MoveLast
Data1.Recordset.Bookmark=MyBookmark.
Применение Find-методов для поиска записи
Ранее было показано, как осуществлять перемещение по базе данных для просмотра записей. Однако большинству пользователей необходимо иметь возможность не только просматривать запись за записью в базе данных, но и осуществлять поиск записи, отвечающий какому-либо условию. Чтобы найти определенную запись, можно воспользоваться методами Find для объектов - наборов записей типа dynaset и snapshot и методом Seek - для наборов записей типа table.
Методы Find используются для поиска в наборах записей типа dynaset и snapshot. В Visual Basic поддерживается четыре метода Find:
Метод FindFirst осуществляет поиск первой записи, удовлетворяющей условию.
Метод FindLast осуществляет поиск последней записи, удовлетворяющей условию.
Метод FindNext осуществляет поиск следующей записи, удовлетворяющей условию.
Метод FindPrevious осуществляет поиск предыдущей записи, удовлетворяющей условию.
При использовании любого из Find методов необходимо определить условие поиска. Обычно условием поиска является равенство имени поля какому-нибудь значению. Например, следующий фрагмент кода показывает, как найти в таблице Titles первую запись, в которой поле AU_ID равно пяти:
Data1.Recordset.FindFirst "AU_ID=5".
Построим простое приложение для просмотра таблицы Titles базы данных BIBLIO2.MDB с возможностью простого поиска записи. Для этого:
1. Создайте новый проект и разместите на форме объект Data, объект DBGrid и две командные кнопки, как показано на рис.5.1.
Рис.5.1. Главное окно приложения.
2. Установите следующие свойства для объектов Data и DBGrid:
Data1.DatabaseName=" C:\VB5\BIBLIO2.MDB"
Data1.RecordSource=Titles
DBGrid1.DataSource=Data1.
3. Как обычно, предусмотрим возможность завершения работы приложения, определив обработку нажатия кнопки “Выход” следующим образом:
Private Sub Command2_Click()
Unload Me
End Sub.
4. Для загрузки и вывода на экран окна поиска записи добавьте в процедуру обработки нажатия кнопки “Поиск” следующую строку:
Private Sub Command1_Click()
Form2.Show
End Sub
5. Добавьте в проект новую форму и разместите на ней текстовое окно, метку и две командные кнопки, как показано на рис.5.2.
Рис.5.2. Окно поиска записи.
6. Добавьте в процедуру обработки нажатия кнопки “Поиск” следующий код:
Private Sub Command1_Click()
Dim strCompare As String
strCompare = "[Year Published] = " + Text1.Text
Form1!Data1.Recordset.MoveFirst
Form1!Data1.Recordset.FindFirst strCompare
Unload Me
End Sub.
Строковая переменная strCompare определяет условие поиска. Перед использованием метода FindFirst указатель текущей записи устанавливается на первую запись в наборе. Таким образом поиск осуществляется с первой записи в наборе.
В данном случае поиск предусмотрен только по году издания книги. При необходимости вы можете сами по своему усмотрению определить требуемый критерий поиска.
7. Для отмены поиска необходимо выгрузить окно в процедуре обработки нажатия кнопки “Отмена”:
Private Sub Command2_Click()
Unload Me
End Sub.
8. Запустите приложение.
Использование метода Seek для поиска записи
Метод Seek используется для поиска только в наборе записей типа Table. При использовании метода Seek процессор баз данных использует текущий индекс таблицы, который определен свойством Index объекта Recordset. После выполнения этого метода текущей записью в наборе становится найденная запись.
Метод Seek имеет следующий синтаксис:
Recordset.Seek comp, key1, key2.
Первый из аргументов - comp является строкой, которая определяет тип сравнения. В следующей таблице представлены типы сравнения, которые используются с методом Seek.
Строка | Описание |
“=” | Равно определенной величине. |
“>=” | Больше или равно определенной величине. |
“>” | Больше определенной величины. |
“<=” | Меньше или равно определенной величине. |
“<” | Меньше определенной величины. |
Аргументы keyn представляют собой последовательность значений, с которыми Visual Basic производит сравнение содержимого записей таблицы.
В следующем примере метод Seek используется для поиска записи, содержащей величину 5 в поле AU_ID, которое является уникальным индексным полем.
Dim MyTable As Recordset
Set MyTable = Data1.Recordset
MyTable.Index = "AU_ID"
MyTable.Seek "=", 5
Стоит еще раз подчеркнуть, что перед использованием метода Seek необходимо установить текущий индекс с использованием свойства Index. В противном случае обращение к этому методу приведет к ошибке.
Как узнать, можно ли изменять базу данных
Если вы намереваетесь редактировать содержимое базы данных, то должны быть уверены, что это можно делать. При использовании наборов записей типа snapshot, вы не можете вносить изменения в базу данных по определению. Если вы не уверены, что содержимое базы данных можно редактировать, можете проверить выполнение следующих условий:
Свойства Updatable у базы данных, набора записей и поля должны быть установлены в True. Если какое-нибудь из этих свойств установлено в False, то соответствующие данные доступны только для чтения.
Вы должны использовать объект управления данными, у которого свойство ReadOnly установлено в False.
С помощью следующего фрагмента кода вы можете проверить, можно ли редактировать базу данных:
If Data1.ReadOnly = True or Data1.Database.Updatable = False Or _
Data1.Recordset.Updatable = False Then
MsgBox "Эти данные не могут быть изменены"
End If
Для того, чтобы определить, допускает ли возможность редактирования определенное поле базы данных, надо проверить бит dbUpdatableField у свойства Attributes. Если этот бит содержит 0, то содержимое поля изменить невозможно. В противном случае редактирование поля допускается.
В следующем примере показано, как проверить возможность редактирования поля "Author":
If Data1.Recordset.Fields("Author").Attributes And _
dbUpdatableField = 0 Then
MsgBox "Это поле не может быть изменено"
End If
Теперь, когда вы убедились, что база данных и набор записей допускают редактирование, можно добавлять новые записи.
Для того, чтобы добавить новые записи в набор записей надо проделать следующие действия:
1. Добавить новую пустую запись с помощью метода AddNew объекта Recordset. При этом указатель текущей записи сохраняется и затем перемещается на новую запись.
2. Определить новые значения в полях добавленной записи.
3. Сохранить сделанные изменения использованием метода Update. При этом указатель текущей записи принимает значение, которое у него было перед использованием метода AddNew.
Следующий фрагмент кода показывает, как с помощью программного кода добавить новую запись в таблицу Titles.
Data1.DatabaseName = "BIBLIO.MDB"
Data1.RecordSource = "Titles"
Data1.Refresh
Data1.Recordset.AddNew 'Добавить новую запись
Data1.Recordset("Title") = "Visual Basic" 'Установить значения полей
Data1.Recordset("Year Published") = "1996"
Data1.Recordset("AU_ID") = 37
Data1.Recordset("ISBN") = "111-111-11-11"
Data1.Recordset("PubID") = 43
Data1.Recordset.Update ' Сохранить изменения
Для того чтобы изменить данные в вашей базе данных, вы должны сначала сделать запись, подлежащую изменению, текущей записью. Это можно просто сделать при помощи одного из методов Move или при помощи кнопок со стрелками на объекте управления данными. Затем можно провести необходимые изменения содержимого связанных объектах управления. Чтобы сохранить сделанные изменения, достаточно просто переместить указатель текущей записи на любую другую запись или использовать метод Update.
Таким образом, для редактирования текущей записи надо сделать следующее:
1. Позиционируйте указатель текущей записи на запись, которую вы хотите редактировать.
2. Определите новые значения в полях текущей записи.
3. Используйте метод Update или любой из методов Move
Следующий пример показывает, как с помощью программного кода изменить содержимое поля PubID в первой записи таблицы Titles. Обратите внимание, что вы можете изменить данные либо в самом наборе записей, либо в связанном объекте управления :
Data1.DatabaseName = "C:\VB5\BIBLIO2.MDB"
Data1.RecordSource = "Titles"
Data1.Refresh
Data1.Recordset("PubID") = "48"
TxtPub.Text = "Visual Basic"
Data1.Recordset.Update
Чтобы удалить запись, установите указатель на требуемую запись и примените метод Delete объекта Recordset. Удаление одной записи нам уже встречалось при изучении свойства Recordset объекта управления данными. Чтобы удалить группу записей, надо повторить подобные действия необходимое количество раз. В следующем примере из таблицы Titles базы данных BIBLIO.MDB удаляются все записи, у которых поле “Year Published” содержит величину меньшую, чем 1989.
Data1.DatabaseName="С:\VB5\BIBLIO.MDB"
Data1.RecordSource="Select * from Titles where [Year Published]<1989"
Data1.Refresh
Do While Data1.Recordset.EOF = False
Data1.Recordset.Delete
Data1.Recordset.MoveNext
Loop
В этом примере при каждом проходе тела цикла используется метод MoveNext для перемещения указателя на следующую запись. Вам необходимо использовать этот метод, так как после удаления текущая запись становится недопустимой (invalid) и любая попытка доступа к ней вызовет ошибку.
Использование пары методов Delete и MoveNext не является единственным способом удаления сразу нескольких записей из базы данных. Для аналогичных целей можно использовать соответствующий SQL-запрос. Например, вместо приведенного выше кода можно использовать аналогичный по своему действию SQL-запрос:
DELETE FROM Titles WHERE [Year Published] < #1/1/1989#.
Причем, такой подход оказывается более эффективным, чем применение в цикле пары методов Delete и MoveNext.