Access поддерживает скрытую систему таблиц, называемых MSysObjects, которая включает в себя поле (Flags), которая хранит значение, указывающее тип запроса. Вы можете попробовать следующую функцию с каждым из имен запросов из своего списка и использовать возвращаемое значение, чтобы определить, следует ли использовать Database.Execute() или Database.OpenRecordset()
Функция требует разрешения на чтение для MSysObjects. Я слышал отчеты, чем некоторым пользователям Access 2007 было отказано в разрешении читать MSysObjects. Тем не менее, я не сталкивался с этой проблемой с Access 2007.
Я проверил несколько типов запросов, чтобы определить значения флагов. Если один из ваших запросов является типом, который я не тестировал, функция вернет значение Flags как непризнанное. Вы можете изменить функцию, чтобы включить этот тип флагов.
Единственный DDL-запрос, который я тестировал, был DROP TABLE (Flags = 96).
Кроме того, помните, что не все запросы «SELECT ... FROM ...» - это выбор запросов для вашей цели (возврат набора записей). Запрос, такой как «SELECT полей INTO newtable FROM oldtable;» не возвращает записи, а пользовательский интерфейс доступа классифицирует его как запрос Make Table.
Public Function QueryType(ByVal pQueryName As String) As String
Dim lngFlags As Long
Dim strType As String
Dim strCriteria As String
strCriteria = "[Name] = """ & pQueryName & """ And [Type] = 5"
lngFlags = DLookup("Flags", "MSysObjects", strCriteria)
Select Case lngFlags
Case 0
strType = "Select"
Case 16
strType = "Crosstab"
Case 32
strType = "Delete"
Case 48
strType = "Update"
Case 64
strType = "Append"
Case 80
strType = "Make Table"
Case 96
strType = "Drop Table"
Case 128
strType = "Union"
Case Else
strType = "Flags " & CStr(lngFlags) & " unrecognized"
End Select
QueryType = strType
End Function
Почему вы даже хотите выполнять запросы, которые являются SELECT, только если вы не собираетесь отображать их для пользователя? Что вы не должны делать в Access, если вы не используете форму или отчет. –
Вам действительно нужно объяснить, что вы пытаетесь выполнить, поскольку выполнение произвольной последовательности запросов SELECT и DML не имеет никакого смысла в реальном мире. –
Это имеет смысл для (единичных) целей тестирования, когда вы хотите проверить уровень доступа к данным: проверьте состояние до/после и, возможно, вернитесь в какое-то состояние. – MicSim