Стив Каммингс - VBA для чайников
Прежде всего настройте объект Command, присвоив его свойству ActiveConnection значение, соответствующее необходимому подключению. После этого вы можете уделить внимание и объекту Recordset. В этом случае вы должны сначала определить параметры этого объекта как свойства. После этого вы наполняете объект Recordset записями, пользуясь результатами выполнения метода Execute объекта Command. Соответствующий пример приведен ниже:
Dim conTest As New Connection
Dim cmdTest As New Command
Dim rstTest As Recordset
Dim strSQL As String
...(код, создающий объект подключения contest
... и определяющий строку strSQL)
' Создание объекта Command:
With cmdTest
Set .ActiveConnection = contest
.CommandText = strSQL
.CommandType = adcmdText
End With
rstTest.CursorType = adOpenForwardOnly
rstTest.lockType = adLockReadOnly
Set rstTest = cmdTest.Execute()
Последний прием для создания объектов Recordset заключается в использовании метода Execute объекта Connection. Этот подход намного проще, чем использование объекта Connection, кроме того, он позволяет вам работать с сохраненными процедурами. Однако, если для выполнения процедур необходимы определенные параметры, вам придется включить эти параметры в инструкцию SQL. Все это проиллюстрировано на следующем примере кода:
Dim conVert As New Connection
Dim rstVert As Recordset
Dim strSQL As String
...(код, создающий объект подключения conVert
... и определяющий строку strSQL)
rstVert.CursorType = adOpenForwardOnly
rstVert.lockType = adLockReadOnly
Set rstVert - conVert.Execute()
Если вам известно, что подключение необходимо только для одного объекта Recordset, предварительное создание подключения не обеспечит никаких преимуществ.
Вместо этого вы можете указать строку подключения в качестве второго аргумента метода
Open объекта Recordset, как показано ниже:
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 позволяет вам указывать поля и их значения, как показано ниже: