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


Метод Database.Execute (DAO)

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

Выполняет запрос на изменение или запускает инструкцию SQL для указанного объекта.

Синтаксис

expression . Execute(Query, Options)

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

Параметры

Имя

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

Тип данных

Описание

Query

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

String

Options

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

Variant

Примечания

Можно использовать следующие константы RecordsetOptionEnum для параметров.

Константа

Описание

dbDenyWrite

Отказывает в разрешении на запись другим пользователям (только для рабочих областей Microsoft Access).

dbInconsistent

(По умолчанию) Выполняет несогласованные обновления (только для рабочих областей Microsoft Access).

dbConsistent

Выполняет согласованные обновления (только для рабочих областей Microsoft Access).

dbSQLPassThrough

Выполняет SQL-запрос к серверу. При установке этого параметра инструкция SQL передается в базу данных ODBC для обработки (только для рабочих областей Microsoft Access).

dbFailOnError

Не выполняет откат обновлений при возникновении ошибки (только для рабочих областей Microsoft Access).

dbSeeChanges

Создает ошибку во время выполнения, если другой пользователь пытается изменить данные, которые вы редактируете (только для рабочих областей Microsoft Access).

dbRunAsync

Выполняет запрос асинхронно (только для объектов ODBCDirect Connection и QueryDef).

dbExecDirect

Выполняет инструкцию, не вызывая перед этим функцию API ODBC SQLPrepare (только для объектов ODBCDirect Connection и QueryDef).

Примечание.

Рабочие области ODBCDirect не поддерживаются в Microsoft Access 2013. Если вам необходим доступ ко внешним источникам данных без использования ядра СУБД Microsoft Access, воспользуйтесь объектами ADO.

Примечание.

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

Метод Execute допустим только для запросов на изменение. Если вы используете метод Execute с другим типом запроса, возникает ошибка. Так как запрос на изменение не возвращает записи, метод Execute не возвращает объект Recordset. (Выполнение запроса SQL к серверу в рабочей области ODBCDirect не вызывает ошибку, если не возвращается объект Recordset.)

Свойство RecordsAffected объекта Connection, Database или QueryDef используется для определения числа записей, затронутых самым последним вызовом метода Execute. Например, RecordsAffected содержит число записей, удаленных, обновленных или вставленных при выполнении запроса на изменение. Если метод Execute используется для выполнения запроса, в качестве значения свойства RecordsAffected объекта QueryDef устанавливается число затронутых записей.

Когда в рабочей области Microsoft Access указана синтаксически правильная инструкция SQL и имеются соответствующие разрешения, метод Execute не приводит к сбою, даже если не удается изменить или удалить ни одну строку. Поэтому всегда используйте параметр dbFailOnError при применении метода Execute для обновления или удаления запроса. Этот параметр создает ошибку во время выполнения и откатывает все успешно выполненные изменения, если какие-либо затронутые записи заблокированы и не могут быть обновлены или удалены.

В более ранних версиях ядра СУБД Microsoft Jet инструкции SQL автоматически внедрялись в неявные транзакции. Если часть выполненной инструкции с параметром dbFailOnError приводила к сбою, выполнялся откат всей инструкции. Для повышения производительности эти неявные транзакции были удалены начиная с версии 3.5. При обновлении более ранних версий кода DAO рассмотрите возможность использования явных транзакций с инструкциями Execute.

Чтобы добиться оптимальной производительности в рабочей области Microsoft Access, особенно в многопользовательской среде, вложите метод Execute внутрь транзакции. Используйте метод BeginTrans для текущего объекта Workspace, затем примените метод Execute и завершите транзакцию с помощью метода CommitTrans для объекта Workspace. Это сохранит изменения на диске и освободит любые блокировки, установленные во время выполнения запроса.

Пример

В этом примере показан метод Execute, запускаемый из объекта QueryDef и объекта Database. Процедуры ExecuteQueryDef и PrintOutput являются обязательными для запуска этой процедуры.

    Sub ExecuteX() 
     
     Dim dbsNorthwind As Database 
     Dim strSQLChange As String 
     Dim strSQLRestore As String 
     Dim qdfChange As QueryDef 
     Dim rstEmployees As Recordset 
     Dim errLoop As Error 
     
     ' Define two SQL statements for action queries. 
     strSQLChange = "UPDATE Employees SET Country = " & _ 
     "'United States' WHERE Country = 'USA'" 
     strSQLRestore = "UPDATE Employees SET Country = " & _ 
     "'USA' WHERE Country = 'United States'" 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     ' Create temporary QueryDef object. 
     Set qdfChange = dbsNorthwind.CreateQueryDef("", _ 
     strSQLChange) 
     Set rstEmployees = dbsNorthwind.OpenRecordset( _ 
     "SELECT LastName, Country FROM Employees", _ 
     dbOpenForwardOnly) 
     
     ' Print report of original data. 
     Debug.Print _ 
     "Data in Employees table before executing the query" 
     PrintOutput rstEmployees 
     
     ' Run temporary QueryDef. 
     ExecuteQueryDef qdfChange, rstEmployees 
     
     ' Print report of new data. 
     Debug.Print _ 
     "Data in Employees table after executing the query" 
     PrintOutput rstEmployees 
     
     ' Run action query to restore data. Trap for errors, 
     ' checking the Errors collection if necessary. 
     On Error GoTo Err_Execute 
     dbsNorthwind.Execute strSQLRestore, dbFailOnError 
     On Error GoTo 0 
     
     ' Retrieve the current data by requerying the recordset. 
     rstEmployees.Requery 
     
     ' Print report of restored data. 
     Debug.Print "Data after executing the query " & _ 
     "to restore the original information" 
     PrintOutput rstEmployees 
     
     rstEmployees.Close 
     
     Exit Sub 
     
    Err_Execute: 
     
     ' Notify user of any errors that result from 
     ' executing the query. 
     If DBEngine.Errors.Count > 0 Then 
     For Each errLoop In DBEngine.Errors 
     MsgBox "Error number: " & errLoop.Number & vbCr & _ 
     errLoop.Description 
     Next errLoop 
     End If 
     
     Resume Next 
     
    End Sub 
     
    Sub ExecuteQueryDef(qdfTemp As QueryDef, _ 
     rstTemp As Recordset) 
     
     Dim errLoop As Error 
     
     ' Run the specified QueryDef object. Trap for errors, 
     ' checking the Errors collection if necessary. 
     On Error GoTo Err_Execute 
     qdfTemp.Execute dbFailOnError 
     On Error GoTo 0 
     
     ' Retrieve the current data by requerying the recordset. 
     rstTemp.Requery 
     
     Exit Sub 
     
    Err_Execute: 
     
     ' Notify user of any errors that result from 
     ' executing the query. 
     If DBEngine.Errors.Count > 0 Then 
     For Each errLoop In DBEngine.Errors 
     MsgBox "Error number: " & errLoop.Number & vbCr & _ 
     errLoop.Description 
     Next errLoop 
     End If 
     
     Resume Next 
     
    End Sub 
     
    Sub PrintOutput(rstTemp As Recordset) 
     
     ' Enumerate Recordset. 
     Do While Not rstTemp.EOF 
     Debug.Print " " & rstTemp!LastName & _ 
     ", " & rstTemp!Country 
     rstTemp.MoveNext 
     Loop 
     
    End Sub