Объект QueryDef (DAO)
Область применения: Access 2013 | Office 2013
Объект QueryDef — это сохраняемое определение запроса в базе данных ядра СУБД Microsoft Access.
Примечания
Объект QueryDef можно использовать для определения запроса. Например, вы можете:
Использовать свойство SQL, чтобы задать или вернуть определение запроса.
Использовать коллекцию Parameters объекта QueryDef, чтобы задать или вернуть параметры запроса.
Использовать свойство Type, чтобы вернуть значение, которое указывает действие запроса: выбор записей из существующей таблицы, создание таблицы, вставка записей из одной таблицы в другую, удаление записей или обновление записей.
Использовать свойство MaxRecords, чтобы ограничить число записей, возвращаемых запросом.
Использовать свойство ODBCTimeout, чтобы указать длительность ожидания перед возвращением запросом записей. Свойство ODBCTimeout применяется к любому запросу, обращающемуся к данным ODBC.
Использовать свойство ReturnsRecords, чтобы указать, что запрос возвращает записи. Применение свойства ReturnsRecords допустимо только для запросов SQL к серверу.
Использовать свойство Connect, чтобы создать запрос SQL к серверу для базы данных ODC.
Также можно создавать временные объекты QueryDef. В отличие от постоянных объектов QueryDef временные объекты QueryDef не сохраняются на диске и не добавляются в коллекцию QueryDefs. Временные объекты QueryDef удобно использовать для запросов, которые нужно неоднократно запускать во время выполнения, но не требуется сохранять на диск, в частности, если создаются их инструкции SQL во время выполнения.
Постоянный объект QueryDef в рабочей области Microsoft Access можно рассматривать как скомпилированную инструкцию SQL. Если запрос запускается из постоянного объекта QueryDef, он выполняется быстрее, чем при запуске эквивалентной инструкции SQL с помощью метода OpenRecordset. Это объясняется тем, что ядру СУБД Microsoft Access не нужно компилировать запрос перед его выполнением.
Предпочтительный способ использования диалекта SQL внешнего ядра СУБД с доступом через ядро СУБД Microsoft Access состоит в применении объектов QueryDef. Например, можно создать запрос Microsoft SQL Server и сохранить его в объекте QueryDef. Если нужно использовать запрос SQL не на основе ядра СУБД Microsoft Access, потребуется предоставить строку свойства Connect, указывающую на внешний источник данных. Запросы с допустимыми свойствами Connect обходят ядро СУБД Microsoft Access и передаются непосредственно к серверу внешней базы данных для обработки.
Чтобы создать новый объект QueryDef, используйте метод CreateQueryDef. В рабочей области Microsoft Access, если указать строку для аргумента имени или явно задать строку ненулевой длины в качестве значения свойства Name нового объекта QueryDef, будет создан постоянный объект QueryDef, который будет автоматически добавлен в коллекцию QueryDefs и сохранен на диске. Если указать строку ненулевой длины в качестве аргумента имени или явно задать строку нулевой длины в качестве значения свойства Name, будет создан временный объект QueryDef.
Чтобы сослаться на объект QueryDef в коллекции по его порядковому номеру или по его свойству Name, используйте любую из указанных ниже синтаксических форм.
QueryDefs(0)
QueryDefs("name")
QueryDefs! [ имя]
Ссылаться на временные объекты QueryDef можно только по назначенным им объектным переменным.
Ссылка, предоставляемая сообществом UtterAccess. UtterAccess — это премиальный вики-портал и форум, посвященный Microsoft Access.
Пример
В этом примере создается новый объект QueryDef, который добавляется в коллекцию QueryDefs объекта Database компании Northwind. Затем выполняется перечисление коллекции QueryDefs и коллекции Properties нового объекта QueryDef.
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