Я использую PT-запросы для получения данных из SQL Server 2008R2. Запрос с использованием строки подключения ODBC хранится в Client Access MS и получает переменную SQL-строку из этой функции, которую я нашел Долгое время назад в Сети:MS Access 2010: Проходят через запросы удаляются
'If QueryName is not provided or is an empty string (= "") no query object will be created but the SQL statement or stored procedure will be executed (useful for DELETE, INSERT, UPDATE statements).
'If you provide the parameter QueryName a query will be created with the provided name (this is useful for a SELECT statement as you expect to retrieve the resulting data set).
Function SQL_PassThrough(ByVal SQL As String, Optional QueryName As String)
Dim qdf As QueryDef
On Error GoTo ErrHandler
Set qdf = CurrentDb.CreateQueryDef
With qdf
.Name = QueryName
.Connect = TempVars!ConnectionString
.SQL = SQL
.ReturnsRecords = (Len(QueryName) > 0)
If .ReturnsRecords = False Then
.Execute
Else
If Not IsNull(CurrentDb.QueryDefs(QueryName).Name) Then
CurrentDb.QueryDefs.Delete QueryName
End If
CurrentDb.QueryDefs.Append qdf
End If
.Close
End With
Set qdf = Nothing
ExitHere:
Exit Function
ErrHandler:
MsgBox Err.Description
Resume ExitHere
End Function
TempVars ConnectionString содержит строку соединения, которая хранится в таблице.
Все работает отлично, в то время как SQL-String (например, «EXEC dbo.spLookupSomething») возвращает 0 записей.
Время от времени - и я не могу узнать, когда и почему - запрос PT полностью удаляется из объектов Access и не добавляется больше. я заметил, что функция начинается с
Set qdf = CurrentDb.CreateQueryDef
хотя запрос с точным таким именем уже существует. Но в большинстве случаев он работает (кажется, переписывает существующий запрос), но иногда он вообще не работает.
Я начинаю все мои запросы PT из кода, как это:
strsql=""EXEC dbo.spLookupSomething"
call SQL_PassThrough(strsql, "PT_LookupSomething")
Это даже очень трудно воспроизвести это поведение. Я пытался запустить код еще раз (зная, что он возвращает 0!), - ничего не происходит.
Но иногда я вижу в среде разработчиков дату базы данных, что запрос исчезает при первом запуске, и, конечно, код разбился.
Любая идея, ПОЧЕМУ это происходит и как ее избежать? Кажется, что удаление и добавление не работают должным образом все время.
Благодаря Майкл
Когда код не выполнен, выполняется ли эта строка 'MsgBox Err.Description'? –
нет, потому что я отключил msgbox. Но без обработчика ошибок он указывает на «If Not IsNull» (CurrentDb.QueryDefs (QueryName) .Name) Затем «с ошибкой времени выполнения 3265 - элемент не найден в этой коллекции, и я не могу найти какой-либо неправильный код. Но я попробую с «On Error resume next», возможно, он пропустит ... – mak
Я добавил общий тег VBA, чтобы увеличить мнение по этому вопросу. –