Database.Execute 方法 (DAO)

适用于:Access 2013、Office 2013

运行一个操作查询或执行指定对象上的 SQL 语句。

语法

表达式 。执行 (查询选项)

表达式 一个表示 Database 对象的变量。

参数

名称

必需/可选

数据类型

说明

Query

必需

String

选项

可选

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

在不首先调用 SQLPrepare ODBC API 函数(仅 ODBCDirect Connection 和 QueryDef 对象)的情况下,执行该语句。

注意

Microsoft Access 2013 中不支持 ODBCDirect 工作区。 如果要在不使用 Microsoft Access 数据库引擎的情况下访问外部数据源,请使用 ADO。

注意

[!注释] 常量 dbConsistentdbInconsistent 是互斥的。 可以在 OpenRecordset 的给定实例中使用其中的某一个,但不能同时使用此两者。 同时使用 dbConsistentdbInconsistent 会导致出错。

Execute 方法仅对操作查询有效。 如果将 Execute 与其他类型的查询一起使用,则会发生错误。 由于操作查询不返回任何记录, 因此 Execute 不会返回 Recordset。 (如果未返回 Recordset ,则在 ODBCDirect 工作区中执行 SQL 传递查询不会返回错误。)

使用 ConnectionDatabaseQueryDef 对象的 RecordsAffected 属性确定受最近的 Execute 方法影响的记录数。 例如, RecordsAffected 包含执行某个动作查询时删除、更新或插入的记录数。 如果使用 Execute 方法运行查询,会将 QueryDef 对象的 RecordsAffected 属性设置为受影响的记录数。

在 Microsoft Access 工作区中,如果提供了一个在语法上正确的 SQL 语句,并且您具有相应的权限,则 Execute 方法不会失败 - 即使一行都不能修改或删除,也是如此。 因此,在使用 Execute 方法运行更新或删除查询时,请始终使用 dbFailOnError 选项。 如果锁定了任何受影响的记录,因而无法对其进行更新或删除,此选项将生成运行时错误,同时回滚所有成功的更改。

在早期版本的 Microsoft Jet 数据库引擎中,SQL 语句自动嵌入到隐式事务中。 如果使用 dbFailOnError 执行的语句的一部分失败,则整个语句都会回滚。 为了改善性能,从版本 3.5 开始,删除了这些隐式事务。 如果要更新早期的 DAO 代码,请务必考虑对 Execute 语句使用显式事务。

为了在 Microsoft Access 工作区中,特别是在多用户环境中获取最佳性能,请将 Execute 方法嵌套在事务中。 对当前的 Workspace 对象使用 BeginTrans 方法,然后使用 Execute 方法,再对 Workspace 使用 CommitTrans 方法完成事务。 这样可以保存磁盘上的更改,并且释放任何在运行查询时放置的锁定。

示例

以下示例演示同时从 QueryDef 对象和 Database 对象运行时的 Execute 方法。 若要使该过程运行,需要使用 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