Метод QueryDef.Execute (DAO)
Область применения: Access 2013, Office 2013
Выполняет инструкцию SQL для указанного объекта.
Синтаксис
expression . Execute(Options)
выражение: переменная, представляющая объект QueryDef.
Параметры
Имя |
Обязательный/необязательный |
Тип данных |
Описание |
---|---|---|---|
Options |
Необязательно |
Variant |
Примечания
В параметре Options можно использовать перечисленные ниже константы 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 вызывает ошибку.
Свойство 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
В приведенном ниже примере показано, как выполнить запрос параметра. Коллекция Parameters используется, чтобы задать параметр Organization запроса myActionQuery перед его выполнением.
Пример кода изсправочника программиста Microsoft Access 2010.
Public Sub ExecParameterQuery()
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("myActionQuery")
'Set the value of the QueryDef's parameter
qdf.Parameters("Organization").Value = "Microsoft"
'Execute the query
qdf.Execute dbFailOnError
'Clean up
qdf.Close
Set qdf = Nothing
Set dbs = Nothing
End Sub