Шаг 73 - Метод OpenRecordset

Описание
Создает новый объект Recordset и добавляет его в семейство Recordsets.

Для объектов Connection и Database:
Set наборЗаписей = объект.OpenRecordset (источник, тип, параметры, блокировки)
Для объектов QueryDef, Recordset и TableDef:
Set наборЗаписей = объект.OpenRecordset (тип, параметры, блокировки)

Параметры
наборЗаписей
Объектная переменная, представляющая открываемый объект Recordset.
объект
Объектная переменная, представляющая существующий объект, используемый при создании нового объекта Recordset.
источник
Выражение или переменная типа String, определяющая источник записей для нового объекта Recordset. В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи. Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы.
тип
Необязательный. Константа, указывающая тип открываемого объекта Recordset:

параметры
Необязательный. Произвольная комбинация следующих констант, задающих характеристики нового объекта Recordset:

блокировки
Необязательный. Константа, определяющая тип блокировки объекта Recordset.

Замечания
В рабочей области ядра Microsoft Jet, если аргумент объект задает объект QueryDef или объект Recordset типа динамического набора записей или статического набора записей, а также, если аргумент источник задает инструкцию SQL или объект TableDef, представляющий присоединенную таблицу, то не допускается использование константы dbOpenTable в аргументе тип; в противном случае возникает ошибка выполнения. Если требуется использовать запрос к серверу SQL для присоединенной таблицы при подключении ядра Microsoft Jet к источнику данных ODBC, необходимо сначала указать в свойстве Connect базы данных, содержащей присоединенную таблицу, допустимую строку подключения ODBC. Для однократного прохода по объекту Recordset, открытому при подключении ядра Microsoft Jet к источнику данных ODBC, можно повысить быстродействие, задав константу dbOpenForwardOnly в аргументе тип.
Если аргумент объект задает объект Recordset типа динамического набора записей или статического набора записей, то новый объект Recordset является объектом того же типа. Если аргумент объект задает табличный объект Recordset, то новый объект является объектом Recordset типа динамического набора записей. Не допускается открытие нового объекта Recordset на основе статического набора записей с последовательным доступом или объектов Recordset ODBCDirect.
В рабочей области ODBCDirect возможно открытие Recordset, с указанием более одного запроса на выборку в аргументе источник, например:

"SELECT Фамилия, Имя FROM Авторы 
WHERE Фамилия = 'Иванов';
SELECT Заголовок, ISBN FROM Заголовки 
WHERE Код Like '1-55615-*'"

В возвращенном объекте Recordset будут открыты результаты первого запроса. Чтобы открыть результаты следующих запросов, следует вызвать метод NextRecordset.
Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.
Константа dbSeeChanges позволяет в рабочей области Microsoft Jet перехватывать при работе с записью изменения, вносимые в ту же запись другими пользователями. Например, если два пользователя начинают изменять одну и ту же запись, успешно выполнить обновление сможет только пользователь, первым вызвавший метод Update. При вызове метода Update вторым пользователем возникнет ошибка при выполнении. Аналогично этому, ошибка выполнения возникает, если второй пользователь пытается с помощью метода Delete удалить запись, в которую первый пользователь успел занести изменения.
Обычно, перехват такой ошибки должен приводить к программному обновлению содержимого полей и загрузке измененных значений. Если ошибка возникает при попытке удаления, программа должна вывести новое содержимое записи и сообщение, показывающее, что запись недавно была изменена. Программа должна запросить подтверждение на удаление измененной записи.
Кроме того, константу dbSeeChanges следует использовать, если пользователь открывает объект Recordset при подключении ядра Microsoft Jet к источнику данных ODBC, который является таблицей Microsoft SQL Server версии 6.0 (или более поздней) со столбцом IDENTITY, в противном случае может возникнуть ошибка.
В рабочей области ODBCDirect допускается выполнение запросов в асинхронном режиме, задаваемом константой dbRunAsync в аргументе параметры. Это позволяет приложению продолжать обработку других инструкций во время выполнения запроса в фоновом режиме. Однако пользователь не сможет в этом случае получить доступ к данным в объекте Recordset до завершения запроса. Чтобы определить, закончено ли выполнение запроса, следует проверить значение свойства StillExecuting нового объекта Recordset. Если выполнение запроса занимает больше времени, чем предполагается, пользователь имеет возможность прекратить выполнение с помощью метода Cancel.
Попытка открыть несколько объектов Recordset на основе одного источника данных ODBCOpenRecordset. Одним из способов обойти эту трудность является использование указателя на стороне сервера и средств ODBCDirect, если они поддерживается сервером. Другим способом является заполнение объекта Recordset с помощью метода MoveLast при открытии объекта Recordset.
Если открыть объект Connection с заданным для свойства DefaultCursorDriver значением dbUseClientBatchCursor, пользователь имеет возможность открыть объект Recordset как буфер для измененных данных в рабочей области ODBCDirect (такой способ называют пакетным обновлением). Для включения буфера обновления следует указать константу dbOptimisticBatch в аргументе блокировки. Дополнительные сведения о выборе способа немедленной записи изменений на диск или способа обновления через буфер с их последующей записью на диск в пакете см. в разделе справки для метода Update.
Закрытие объекта Recordset с помощью метода Close приводит к автоматическому удалению объекта из семейства Recordsets.
Если в аргументе источник указана инструкция SQL, образованная путем слияния строки с нецелым числовым значением, а в системной настройке задано использование неамериканского символа десятичного разделителя, такого как запятая (например, strSQL = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке открыть объект Recordset возникает ошибка. Причина заключается в том, что число преобразуется в строковое значение с использованием текущей системной настройки, а в языке SQL распознается только американский символ разделителя целой и дробной части (десятичная точка).

Пример
Следующая программа использует метод OpenRecordset для открытия пяти объектов Recordset и отображения их содержимого. Для выполнения данной процедуры требуется процедура OpenRecordsetOutput.

Sub OpenRecordsetX()

	Dim wrkJet As Workspace
	Dim wrkODBC As Workspace
	Dim dbsNorthwind As Database
	Dim conPubs As Connection
	Dim rstTemp As Recordset
	Dim rstTemp2 As Recordset
	' Открывает сеансы Microsoft Jet и ODBCDirect, базу данных 
	' Microsoft Jet и подключение ODBCDirect.
	Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
	Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)
	Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

	Set conPubs = wrkODBC.OpenConnection("", , , "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")
	' Открывает пять объектов Recordset и отображает 
	' содержимое каждого объекта.
	Debug.Print "С последовательным доступом, " & 	"где источником является объект QueryDef..."
	Set rstTemp = dbsNorthwind.OpenRecordset( "Десять самых дорогих товаров", dbOpenForwardOnly)
	OpenRecordsetOutput rstTemp
	Debug.Print "Динамический набор записей только для чтения, " & "где источником является инструкция SQL..."
	Set rstTemp = dbsNorthwind.OpenRecordset( "SELECT * FROM Сотрудники", dbOpenDynaset, dbReadOnly)
	OpenRecordsetOutput rstTemp
	' Использует свойство Filter для отбора записей 
	' при следующем вызове метода OpenRecordset.
	Debug.Print "Отбор записей из существующего " &  "объекта Recordset..." rstTemp.Filter = "Фамилия >= 'Ж'"
	Set rstTemp2 = rstTemp.OpenRecordset()
	OpenRecordsetOutput rstTemp2
	Debug.Print "Набор записей динамического типа " & "для подключения ODBC..."
	Set rstTemp = conPubs.OpenRecordset( "SELECT * FROM stores", dbOpenDynamic)
	OpenRecordsetOutput rstTemp
	' С помощью свойства StillExecuting проверяет, готов ли 
	' объект Recordset для обработки.
	Debug.Print "Статический набор записей на основе " &  "асинхронного запроса для подключения ODBC..."
	Set rstTemp = conPubs.OpenRecordset("publishers", dbOpenSnapshot, dbRunAsync)
	Do While rstTemp.StillExecuting Debug.Print "    [еще выполняется...]"
	Loop
	OpenRecordsetOutput rstTemp
	rstTemp.Close
	dbsNorthwind.Close
	conPubs.Close
	wrkJet.Close
	wrkODBC.Close
End Sub

Sub OpenRecordsetOutput(rstOutput As Recordset)
	' Отображает указанный объект Recordset.
	With rstOutput
		Do While Not .EOF
			Debug.Print , .Fields(0), .Fields(1) .MoveNext
		Loop
	End With
End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.