Método Database.Execute (DAO)
Aplica-se ao: Access 2013, Office 2013
Executa uma consulta de ação ou executa uma instrução SQL no objeto especificado.
Sintaxe
expressão . Execute(Consulta, Opções)
expressão Uma variável que representa um objeto do Banco de dados.
Parâmetros
Nome |
Necessária/opcional |
Tipo de dados |
Descrição |
---|---|---|---|
Query |
Obrigatório |
String |
|
Opções |
Opcional |
Variant |
Comentários
Você pode usar as seguintes constantes RecordsetOptionEnum para options.
Constante |
Descrição |
---|---|
dbDenyWrite |
Nega a permissão de gravação para outros usuários (somente espaços de trabalho do Microsoft Access). |
dbInconsistent |
(Padrão) Executa atualizações inconsistentes (somente espaços de trabalho do Microsoft Access). |
dbConsistent |
Executa atualizações consistentes (somente espaços de trabalho do Microsoft Access). |
dbSQLPassThrough |
Executa uma consulta de passagem SQL. A configuração dessa opção passa a instrução SQL para um banco de dados ODBC para processamento (somente espaços de trabalho do Microsoft Access). |
dbFailOnError |
Não reverterá as atualizações se ocorrer um erro (somente workspaces do Microsoft Access). |
dbSeeChanges |
Gera um erro de tempo de execução caso outro usuário esteja alterando dados que você esteja editando (somente espaços de trabalho do Microsoft Access). |
dbRunAsync |
Executa a consulta de forma assíncrona (somente objetos ODBCDirect Connection e QueryDef). |
dbExecDirect |
Executa a instrução sem chamar primeiro a função SQLPrepare ODBC API (somente objetos ODBCDirect Connection e QueryDef). |
Observação
[!OBSERVAçãO] O Microsoft Access 2013 não oferece suporte para espaços de trabalho ODBCDirect. Use o ADO para acessar fontes de dados externas sem usar o mecanismo de banco de dados do Microsoft Access.
Observação
[!OBSERVAçãO] As constantes dbConsistent e dbInconsistent são mutuamente exclusivas. Você pode usar uma ou a outra, mas não ambas, em uma determinada instância de OpenRecordset. Usar dbConsistent e dbInconsistent ao mesmo tempo causa um erro.
O método Execute é válido apenas para consultas ação. Se você usar Execute com outro tipo de consulta, ocorrerá um erro. Como uma consulta ação não retorna registros, Execute não retorna um Recordset. (A execução de uma consulta passagem SQL em um espaço de trabalho ODBCDirect não retornará um erro se um Recordset for retornado.)
Use a propriedade RecordsAffected do objeto Connection, Database ou QueryDef para determinar o número de registros afetados pelo método Execute mais recente. Por exemplo, RecordsAffected contém o número de registros excluídos, atualizados ou inseridos ao executar uma consulta ação. Quando você usa o método Execute para executar uma consulta, a propriedade RecordsAffected do objeto QueryDef é definida como o número de registros afetados.
Em um espaço de trabalho do Microsoft Access, se você fornecer uma instrução SQL sintaticamente correta e tiver as permissões apropriadas, o método Execute não falhará mesmo que uma única linha possa ser modificada ou excluída. Portanto, sempre use a opção dbFailOnError quando empregar o método Execute para executar uma consulta atualização ou exclusão. Essa opção gera um erro em tempo de execução e devolve todas as alterações bem-sucedidas se qualquer um dos registros afetados estiver protegido e não puder ser atualizado ou excluído.
Em versões anteriores do mecanismo de banco de dados do Microsoft Jet, instruções SQL foram automaticamente incorporadas a transações implícitas. Se parte de uma instrução executada com o dbFailOnError tiver falhado, a instrução inteira será devolvida. Para melhorar o desempenho, essas transações implícitas foram removidas a partir da versão 3.5. Se estiver atualizando código DAO antigo, considere o uso de transações explícitas envolvendo instruções Execute.
Para obter melhor desempenho em um espaço de trabalho do Microsoft Access, especialmente em um ambiente multiusuário, aninhe o método Execute em uma transação. Use o método BeginTrans no objeto Espaço de Trabalho atual, então use o método Execute e conclua a transação usando o método CommitTrans no Espaço de Trabalho. Isso salva alterações no disco e libera qualquer bloqueio gerado durante a execução da consulta.
Exemplo
Este Exemplo demonstra o método Execute quando executado tanto a partir de um objeto QueryDef como de um objeto Database. Os procedimentos ExecuteQueryDef e PrintOutput são exigidos para a execução deste procedimento.
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