Ошибка времени выполнения 2498 для запросов добавления и создания таблиц, созданных в VBA

Я получаю ошибку 2498 и действительно не понимаю, почему. Я строю строку в VBA и получаю ошибку со следующей строкой кода…

DoCmd.OpenQuery qdfNew, acNormal

Это произошло с очень длинной строкой, созданной для создания запроса, поэтому я максимально упростил код и все еще получаю ошибку.

Вот код…


Option Compare Database

Option Explicit
Dim dbsFootball As Database
Dim strInsertSQL, strSelectSQL, strIntoSQL, strFromSQL, strOrderSQL, strSQL As String
Dim qdfNew As QueryDef

Sub CreateFormattedData()

Set dbsFootball = CurrentDb()
strSelectSQL = ""
strIntoSQL = ""
strFromSQL = ""
strOrderSQL = ""
strSQL = ""

strSelectSQL = "SELECT [tbl_Raw_League_Data].[Season]"
strIntoSQL = "INTO [tbl_Manip Data]"
strFromSQL = "FROM [tbl_Raw_League_Data]" _
    + "LEFT JOIN Referees ON [tbl_Raw_League_Data].[Referee] = Referees.[Referee from Source Data]"
strSQL = strSelectSQL + " " + strIntoSQL + " " + strFromSQL + " " + strOrderSQL
On Error Resume Next                    ' If query doesn't exist, error won't stop execution
DoCmd.DeleteObject acQuery, "pgmqry_Create Table tbl_Manip"
On Error GoTo 0                         ' Reset error handler
Set qdfNew = dbsFootball.CreateQueryDef("pgmqry_Create Table tbl_Manip", strSQL)
DoCmd.OpenQuery qdfNew, acNormal

End Sub

Поле источника, [tbl_Raw_League_Data].[Сезон], является типом данных «короткий текст» (размер поля = 7).

Если я завершаю код VBA и запускаю запрос, который был создан кодом, он прекрасно работает без видимых ошибок. Однако он никогда не будет выполнять запрос из кода VBA.

Первоначально я получал ошибку 2498 при использовании «INSERT INTO» для запроса добавления, но понял, что таблицу можно так же легко воссоздать во время выполнения кода.

Я потерялся и, конечно, оценил бы некоторые идеи!

Спасибо заранее,
Джейсон

1 ответ

  1. Объект querydef передаетсяDoCmd.OpenQuery, когда он ожидает строку, ссылающуюся на имя сохраненного объекта запроса. Рассмотрите возможность использования свойства querydefName:

    DoCmd.OpenQuery qdfNew.Name, acNormal
    

    Также можно использовать .Executeкоманду из объекта базы данных с помощью строковой переменной SQL, минуя необходимость в querydef:

    dbsFootball.Execute strSQL, dbFailOnError
    

    Или с объектом querydef, как предлагает @HansUp, где вы просто выполняете непосредственно, так как это запрос действия:

    qdfNew.Execute dbFailOnError
    

    Обратите внимание, что выше двух вариантов вызывают регулярное обсуждение MS Access, использования сохраненного vs запроса строки VBA . В то время как первый предварительно скомпилирован и выполняется через кэширование оптимизатора запросов best plan, последний может динамически создавать sql (структурные компоненты , которые похожиSELECT, FROMи JOINпредложения, как оба могут использовать переданные в параметрах). Из фрагмента кода рассмотрите возможность сохранения SQL-запроса заранее, без необходимости строить его в VBA на лету ,и вызовите егоDoCmd.OpenQuery.