QueryDef 对象 (DAO)

适用于 Access 2013 | Office 2013

QueryDef 对象是 Microsoft Access 数据库引擎数据库中的查询的存储定义。

说明

可以使用 QueryDef 对象定义查询。 例如,您可以进行下列操作:

  • 使用 SQL 属性设置或返回查询定义。

  • 使用 QueryDef 对象的 Parameters 集合设置或返回查询参数。

  • 使用 Type 属性返回一个值,该值指示查询是从现有表中选择记录、制作一个新表、将记录从一个表插入到另一个表、删除记录还是更新记录。

  • 使用 MaxRecords 属性限制从查询返回的记录数。

  • 使用 ODBCTimeout 属性指示查询返回记录之前需要等待的时间长短。 ODBCTimeout 属性可应用到访问开放式数据库连接 (ODBC) 数据的任何查询。

  • 使用 ReturnsRecords 属性指示查询返回记录。 ReturnsRecords 属性仅对 SQL 传递查询有效。

  • 使用 Connect 属性生成一个访问 ODC 数据库的 SQL 传递查询。

还可以创建临时 QueryDef 对象。 与永久 QueryDef 对象不同,临时 QueryDef 对象不会被保存到磁盘,也不会被追加到 QueryDefs 集合。 对于在运行时必须反复运行,但不需要在磁盘中保存的查询,使用临时 QueryDef 对象十分有用,对于在运行时需要创建其 SQL 字符串/语句的查询尤其如此。

可以将 Microsoft Access 工作区中的永久 QueryDef 对象视为编译的 SQL 语句。 如果从永久 QueryDef 对象执行查询,则查询的运行速度比通过 OpenRecordset 方法运行等效 SQL 语句的速度更快。 这是因为 Microsoft Access 数据库引擎在执行查询之前,不需要对其进行编译。

使用通过 Microsoft Access 数据库引擎访问的外部数据库引擎的本地 SQL 方言的首选方法是使用 QueryDef 对象。 例如,可以创建一个 Microsoft SQL Server 查询,并将其存储在 QueryDef 对象中。 如果需要使用非 Microsoft Access 数据库引擎 SQL 查询,必须提供一个指向外部数据源的 Connect 属性字符串。 具有有效 Connect 属性的查询将绕过 Microsoft Access 数据库引擎,并将查询直接传递给外部数据库服务器,以进行处理。

要新建 QueryDef 对象,请使用 CreateQueryDef 方法。 在 Microsoft Access 工作区中,如果为 name 参数提供了字符串,或者将新的 QueryDef 对象的 Name 属性显式设置为非零长度字符串,那么将创建一个会自动追加到 QueryDefs 集合并保存到磁盘的永久 QueryDef。 提供零长度字符串作为 name 参数或将 Name 属性显式设置为零长度字符串将导致生成临时的 QueryDef 对象。

若要按照序号或 Name 属性设置来引用集合中的 QueryDef 对象,可以使用下列任何一种语法形式:

QueryDefs(0)

QueryDefs("name")

QueryDefs![ name]

仅可以按照分配给临时 QueryDef 对象的对象变量来引用这些对象。

链接提供者:UtterAccess 社区。 UtterAccess 是主要的 Microsoft Access Wiki 和帮助论坛。

示例

以下示例创建一个新的 QueryDef 对象,并将其追加到 Northwind Database 对象的 QueryDefs 集合。 然后,该示例枚举 QueryDefs 集合和新 QueryDefProperties 集合。

    Sub QueryDefX() 
     
       Dim dbsNorthwind As Database 
       Dim qdfNew As QueryDef 
       Dim qdfLoop As QueryDef 
       Dim prpLoop As Property 
     
       Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     
       ' Create new QueryDef object. Because it has a  
       ' name, it is automatically appended to the  
       ' QueryDefs collection. 
       Set qdfNew = dbsNorthwind.CreateQueryDef("NewQueryDef", _ 
             "SELECT * FROM Categories") 
     
       With dbsNorthwind 
          Debug.Print .QueryDefs.Count & _ 
             " QueryDefs in " & .Name 
     
          ' Enumerate QueryDefs collection. 
          For Each qdfLoop In .QueryDefs 
             Debug.Print "  " & qdfLoop.Name 
          Next qdfLoop 
     
          With qdfNew 
             Debug.Print "Properties of " & .Name 
     
             ' Enumerate Properties collection of new  
             ' QueryDef object. 
             For Each prpLoop In .Properties 
                On Error Resume Next 
                Debug.Print "  " & prpLoop.Name & " - " & _ 
                   IIf(prpLoop = "", "[empty]", prpLoop) 
                On Error Goto 0 
             Next prpLoop 
          End With 
     
          ' Delete new QueryDef because this is a  
          ' demonstration. 
          .QueryDefs.Delete qdfNew.Name 
          .Close 
       End With 
     
    End Sub 

以下示例使用 CreateQueryDef 方法创建并执行临时和永久的 QueryDef。 若要使该过程运行,需要使用 GetrstTemp 函数。

    Sub CreateQueryDefX() 
     
       Dim dbsNorthwind As Database 
       Dim qdfTemp As QueryDef 
       Dim qdfNew As QueryDef 
     
       Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     
       With dbsNorthwind 
          ' Create temporary QueryDef. 
          Set qdfTemp = .CreateQueryDef("", _ 
             "SELECT * FROM Employees") 
          ' Open Recordset and print report. 
          GetrstTemp qdfTemp 
          ' Create permanent QueryDef. 
          Set qdfNew = .CreateQueryDef("NewQueryDef", _ 
             "SELECT * FROM Categories") 
          ' Open Recordset and print report. 
          GetrstTemp qdfNew 
          ' Delete new QueryDef because this is a demonstration. 
          .QueryDefs.Delete qdfNew.Name 
          .Close 
       End With 
     
    End Sub 
     
    Function GetrstTemp(qdfTemp As QueryDef) 
     
       Dim rstTemp As Recordset 
     
       With qdfTemp 
          Debug.Print .Name 
          Debug.Print "  " & .SQL 
          ' Open Recordset from QueryDef. 
          Set rstTemp = .OpenRecordset(dbOpenSnapshot) 
     
          With rstTemp 
             ' Populate Recordset and print number of records. 
             .MoveLast 
             Debug.Print "  Number of records = " & _ 
                .RecordCount 
             Debug.Print 
             .Close 
          End With 
     
       End With 
     
    End Function 

以下示例演示如何替换保存的查询中的结构化查询语言 (SQL) 语句。

示例代码提供方:Microsoft Access 2010 程序员参考

    ‘To change the Where clause in a saved query  
    Dim qdf as QueryDef
    Dim db as Database
    Set db = CurrentDB
    Set qdf = db.QueryDefs("YourQueryName")
    qdf.SQL = ReplaceWhereClause(qdf.SQL, strYourNewWhereClause)
    set qdf = Nothing
    set db = Nothing
    
    Public Function ReplaceWhereClause(strSQL As Variant, strNewWHERE As Variant)
    On Error GoTo Error_Handler
    
    ‘This subroutine accepts a valid SQL string and Where clause, and
    ‘returns the same SQL statement with the original Where clause (if any)
    ‘replaced by the passed in Where clause.
    ‘
    ‘INPUT:
    ‘ strSQL valid SQL string to change
    ‘OUTPUT:
    ‘ strNewWHERE New WHERE clause to insert into SQL statement
    ‘
        Dim strSELECT As String, strWhere As String
        Dim strOrderBy As String, strGROUPBY As String, strHAVING As String
    
        Call ParseSQL(strSQL, strSELECT, strWhere, strOrderBy, _
            strGROUPBY, strHAVING)
    
        ReplaceWhereClause = strSELECT &""& strNewWHERE &""_
            & strGROUPBY &""& strHAVING &""& strOrderBy
    
        Exit_Procedure:
            Exit Function
    
        Error_Handler:
            MsgBox (Err.Number & ": " & Err.Description)
            Resume Exit_Procedure
    
    End Function