Метод 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