Dim rstInPeace As New Recordset
Dim strSQL As String, strConnect As String strSQL = "SELECT * FROM Bicycles" 'Получение всех записей 1 Код, назначающий строку подключения переменной strConnect rstInPeace.Open strSQL, strConnect, adOpenForwardOnly
Определение параметров объектов Recordset
Вы получаете контроль над созданным объектом Recordset с помощью различных параметров, определяющих вид указателя, тип блокировки и т.д. Вы можете определить эти параметры одним из двух способов, в зависимости от того, каким образом вы создавали объект
Recordset - с помощью аргументов метода Open объекта Recordset, а также свойств этого объекта. Оба подхода были продемонстрированы с помощью фрагментов кода раньше в настоящей главе
В базах данных курсор означает функциональные возможности, необходимые для перемещения между записями. Тип курсора, который вы выбираете для объекта Recordset, определяет, насколько свободно пользователь сможет работать с записями, а также будут ли автоматически отражаться изменения, внесенные другими пользователями. Используйте свойство Cursor Type или соответствующий аргумент метода Open для указания выбранного вами варианта. Все доступные варианты перечислены в табл. 17.1. По умолчанию тип курсора определен как Forward-only.
Таблица 17.1. Типы курсоров, доступные для объекта Recordset
Тип курсора |
Константа-значение свойства CursorType |
Определение |
Forward-only |
adOpenForwardOnly |
Разрешает перемещение между элементами объекта только в одном направлении, или на определенное количество записей, или к последней записи. Изменения, внесенные другими пользователями, не появляются до тех пор, пока набор записей не будет закрыт, а затем снова открыт. Этот тип курсора обеспечивает максимальное быстродействие, но только в том случае, если вам необходимо перемещаться по записям всего один раз |
Static |
adOpenStatic |
Фиксированный набор записей, который не может быть обновлен и не отражает изменения, внесенные другими пользователями, до тех пор, пока он не будет закрыт, а затем снова открыт. Этот вариант подходит для поиска данных и создания отчетов, обеспечивая более высокую скорость, чем варианты Keyset и Dynamic |
Keyset |
adOpenKeyset |
Набор, чьи записи их значения могут изменяться в результате внесения соответствующих изменений в базу данных. Однако подобный набор записей не отражает изменения, внесенные другими пользователями |
Dynamic |
adOpenDynamic |
Этот вариант напоминает набор записей Keyset, за исключением того, что он не отражает изменения, внесенные в базу данных |
Свойство Cursor Location объекта Recordset позволяет вам определить, будет ли курсор находиться на компьютере пользователя (компьютере клиента) или на сервере. Для этого присвойте ему значение adUseClient или adUseServer соответственно. Вообще, используйте курсоры на стороне клиента при работе с базами данных SQL Server и другими
сетевыми базами данных, а курсоры на сервере - при работе с базами данных Jet. Вы можете определить расположение курсора по умолчанию для всех наборов записей подключения с помощью свойства Cursor Type объекта Connection. блокирование
Свойство LockType объекта Recordset определяет, как именно должна вести себя программа в том случае, если два или больше пользователей пытаются одновременно изменить одну и ту же запись. По умолчанию значение этого свойства равно adLockPessimistic, что предотвращает внесение изменений. Если вы хотите иметь возможность изменять набор записей, вы должны присвоить свойству LockType одно из значений, приведенных в табл. 17.2.
Таблица 17.2. Параметры блокировки для объектов Recordset
Тип блокировки |
Константа-значение свойства LockType |
Определение |
No lock (Блокировка отсутствует) |
adLockOptimistic |
Несколько пользователей могут одновременно изменять одну и ту же запись, однако при этом получают уведомление о том, что внесенные ими изменения могут конфликтовать с изменениями, внесенными другими пользователями (записи блокируются только при выполнении метода UpDate). Этот вариант хорошо подходит для баз данных, с которыми работает только один пользователь, а также многопользовательских баз данных, в которых всегда правильными и полными считаются сведения, добавленные самыми последними |
Batch update (Пакетное обновление) |
adLockBatchOptimistic |
Этот вариант напоминает предыдущий, за тем исключением, что записи блокируются при групповом, а не индивидуальном обновлении |
Read only (all records) (Только чтение (все записи)) |
adLockReadOnly |
Все записи блокируются в то время, когда набор записей открыт; изменять их не может ни один пользователь, Однако доступ к записям разрешен |
Read only (edited records) (Только чтение (изменяемые записи)) |
adLockPessimistic |
Блокируется только та запись, с которой пользователь работает в данный момент. Блокировка снимается в тот момент, когда пользователь переходит к другой записи |
Проверка записей
Если при создании объекта Recordset с помощью VBA не возникло никаких проблем, вашим первым действием должна быть проверка того, что полученный набор вообще содержит какие-то данные. Если это так, сообщите пользователю о том, что для работы недоступна ни одна запись. Прием заключается в проверке значений свойств BOF (Beginning Of File - Метка начала файла) и EOF (End Of File- конец файла). Если значения обоих свойств равны True, набор записей пуст. Лучший способ организации подобной проверки- использование логического оператора And, который возвращает значение True только в том случае, если оба логических выражения равны True, как показано в приведенном ниже примере:
If rstY.30F and rstY.EOF Then
MsgВох "Записи в этом наборе отсутствуют!"
End If
ADO позволяет вам перемещаться по набору записей достаточно легко. Например, для перемещения к первой записи в наборе используется метод MoveFirst, для перемещения к последней записи в наборе- метод MoveLast, а для перемещения к следующей -1ли предыдущей записи в наборе- метод MoveNext или MovePr evi ous соответственно. Метод Move позволяет вам перемещаться на определенное количество записей в наборе вперед или назад. Например, инструкция rstZ.Move -3 перемещает на три записи назад.
Если вы точно знаете, что захотите вернуться к определенной записи в дальнейшем, создайте для этой записи закладку. При работе с записью присвойте переменной значение свойства Bookmark объекта Recordset, как показано ниже:
varBookmark1 = rstA.Bookmark
После этого вы можете вернуться к этой закладке в дальнейшем, просто обратив инструкции:
rstA.Bookmark = varBookmark1
Метод Seek, а также четыре метода Find ( FindFist, FindLat, FindNext и FindPrevious ) позволяют вам отследить определенную запись, базируясь на ее содержимом. Поскольку метод Seek обнаруживает целевую запись, используя индексный номер, он работает намного быстрее, чем методы Find, однако, прежде чем вы сможете его использовать, содержимое базы данных должно быть проиндексировано.
Используйте метод AddNew для занесения новой записи в набор или перехода к новой записи. Если вы уже создали новый объект Recordset под названием rstIng, все, что вам необходимо для добавления новой записи, - это инструкция rst.Ing. После этого вы можете приступать к заполнению полей записи (подробности в разделе '"Изменение данных поля" дальше в настоящей главе). Однако, если хотите, можете указать значения полей сразу при создании новой записи. Метод -AddXew позволяет вам указывать поля и их значения, как показано ниже: