Поделиться через


Метод Database.OpenRecordset (DAO)

Область применения: Access 2013 | Office 2013

Создает новый объект Recordset и добавляет его в коллекцию Recordsets.

Синтаксис

выражение.OpenRecordset (Name, Type, Options, LockEdit)

выражение: переменная, представляющая объект Database.

Параметры

Имя

Обязательный/необязательный

Тип данных

Описание

Name

Обязательный

String

Источник записей для нового объекта Recordset. Источником может быть имя таблицы, имя запроса или оператор SQL, возвращающий записи. Для объектов Recordset табличного типа в базах данных ядра СУБД Microsoft Access источником может быть только имя таблицы.

Type

Необязательный

Variant

Константа RecordsetTypeEnum, которая указывает на то, какой тип объекта Recordset нужно открыть.

ПРИМЕЧАНИЕ: при открытии Recordset в рабочей области Microsoft Access, если вы не указали тип, OpenRecordset создает табличный тип Recordset, если возможно. Вы укажете связанную таблицу или запрос, OpenRecordset создаст объект Recordset типа dynaset.

Options

Необязательно

Variant

Сочетание констант RecordsetOptionEnum, которые указывают характеристики нового объекта Recordset.

ПРИМЕЧАНИЕ. Константы dbConsistent и dbInconsistent являются взаимоисключающими, и использование обеих констант вызывает ошибку. Предоставление аргумента LockEdit, когда в качестве аргумента Options используется константа dbReadOnly, также приводит к возникновению ошибки.

LockEdit

Необязательно

Variant

Константа LockTypeEnum, определяющая блокировку Recordset.

ПРИМЕЧАНИЕ. Вы можете использовать dbReadOnly в аргументе Options или в аргументе LockedEdit, но не одновременно. Если вы используете его для обоих аргументов, возникает ошибка во время выполнения.

Возвращаемое значение

Recordset

Примечания

Обычно если у пользователя возникает эта ошибка во время обновления записи, код должен обновлять содержимое полей и возвращать измененные значения. Если ошибка возникает при удалении записи, код может отобразить для пользователя данные новой записи и сообщение о недавнем изменении данных. В этот момент код может запросить у пользователя подтверждение удаления записи.

Вы также можете использовать константу dbSeeChanges при открытии Recordset в рабочей области ODBC, подключенной к ядру СУБД Microsoft Access для таблицы Microsoft SQL Server 6.0 (или более поздней версии), содержащей столбец IDENTITY, в противном случае может возникать ошибка.

Открытие нескольких объектов Recordset для источника данных ODBC может привести к завершению работы, так как подключение будет занято предыдущим вызовом OpenRecordset. Один из способов решения этой проблемы состоит в полном заполнении Recordset с помощью метода MoveLast непосредственно после открытия Recordset.

Закрытие Recordset с помощью метода Close автоматически удаляет его из коллекции Recordsets.

Примечание.

Если источник ссылается на инструкцию SQL, состоящую из строки, сцепленной с не целым числом, а системные параметры указывают не в США. десятичный символ, например запятая (например, strSQL = "PRICE > " & lngPrice и lngPrice = 125,50), ошибка возникает при попытке открыть набор записей. Это возникает по причине того, что при объединении число будет преобразовано в строку с помощью используемого по умолчанию в вашей системе десятичного символа, а SQL поддерживает только десятичные символы, используемые в США.

Ссылка, предоставляемая сообществом UtterAccess. UtterAccess — это премиальный вики-портал и форум, посвященный Microsoft Access.

Пример

В приведенном ниже примере показано, как открыть объект Recordset на основании запроса параметра.

Пример кода изсправочника программиста Microsoft Access 2010.

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset
    
    Set dbs = CurrentDb
    
    'Get the parameter query
    Set qdf = dbs.QueryDefs("qryMyParameterQuery")
    
    'Supply the parameter value
    qdf.Parameters("EnterStartDate") = Date
    qdf.Parameters("EnterEndDate") = Date + 7
    
    'Open a Recordset based on the parameter query
    Set rst = qdf.OpenRecordset()

В приведенном ниже примере показано, как открыть объект Recordset на основании таблицы или запроса.

    Dim dbs As DAO.Database
    Dim rsTable As DAO.Recordset
    Dim rsQuery As DAO.Recordset
    
    Set dbs = CurrentDb
    
    'Open a table-type Recordset
    Set rsTable = dbs.OpenRecordset("Table1", dbOpenTable)
    
    'Open a dynaset-type Recordset using a saved query
    Set rsQuery = dbs.OpenRecordset("qryMyQuery", dbOpenDynaset)

В приведенном ниже примере показано, как открыть объект Recordset на основании оператора SQL.

    Dim dbs As DAO.Database
    Dim rsSQL As DAO.Recordset
    Dim strSQL As String
    
    Set dbs = CurrentDb
    
    'Open a snapshot-type Recordset based on an SQL statement
    strSQL = "SELECT * FROM Table1 WHERE Field2 = 33"
    Set rsSQL = dbs.OpenRecordset(strSQL, dbOpenSnapshot)

В примере ниже показано, как использовать свойство Filter для определения записей, которые нужно включить в открываемый впоследствии объект Recordset.

    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim rstFiltered As DAO.Recordset
    Dim strCity As String
    
    Set dbs = CurrentDb
    
    'Create the first filtered Recordset, returning customer records
    'for those visited between 30-60 days ago.
    Set rst = dbs.OpenRecordset(_ 
        "SELECT * FROM Customers WHERE LastVisitDate BETWEEN Date()-60 " & _
        "AND Date()-30 ORDER BY LastVisitDate DESC")
    
    'Begin row processing
    Do While Not rst.EOF
        
        'Retrieve the name of the first city in the selected rows
        strCity = rst!City
    
        'Now filter the Recordset to return only the customers from that city
        rst.Filter = "City = '" & strCity & "'"
        Set rstFiltered = rst.OpenRecordset
    
        'Process the rows
        Do While Not rstFiltered.EOF
            rstFiltered.Edit
            rstFiltered!ToBeVisited = True
            rstFiltered.Update
            rstFiltered.MoveNext
        Loop
    
        'We've done what was needed. Now exit
        Exit Do
        rst.MoveNext
       
    Loop
    
    'Cleanup
    rstFiltered.Close
    rst.Close
    
    Set rstFiltered = Nothing
    Set rst = Nothing