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


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