2016-12-07 5 views
0

Я использую 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!), - ничего не происходит.

Но иногда я вижу в среде разработчиков дату базы данных, что запрос исчезает при первом запуске, и, конечно, код разбился.

Любая идея, ПОЧЕМУ это происходит и как ее избежать? Кажется, что удаление и добавление не работают должным образом все время.

Благодаря Майкл

+0

Когда код не выполнен, выполняется ли эта строка 'MsgBox Err.Description'? –

+0

нет, потому что я отключил msgbox. Но без обработчика ошибок он указывает на «If Not IsNull» (CurrentDb.QueryDefs (QueryName) .Name) Затем «с ошибкой времени выполнения 3265 - элемент не найден в этой коллекции, и я не могу найти какой-либо неправильный код. Но я попробую с «On Error resume next», возможно, он пропустит ... – mak

+0

Я добавил общий тег VBA, чтобы увеличить мнение по этому вопросу. –

ответ

0

Вы не можете проверить наличие объекта запроса, как это:

IsNull(CurrentDb.QueryDefs(QueryName).Name) 

Это вызовет ошибку сразу. Вам нужно будет зациклировать коллекцию QueryDefs, чтобы узнать, присутствует ли это имя.

Но зачем удалять и создавать запрос? Просто оставьте его после создания и отредактируйте SQL перед его запуском.

+0

Я не готов с моими изменениями, но думаю, что ваши мысли верны. Без обработчика ошибок я получаю точное значение в этом коде «IsNull (CurrentDb.QueryDefs (QueryName) .Name)», и я даже не могу пропустить его с помощью «Включение ошибки дальше». – mak

0

Если кому-то интересно, вот моя модифицированная функция, которая, надеюсь, избежать удалений постоянных сохраненных запросов в моей базе данных:

Function SQL_PT(ByVal SQL As String, Optional QueryName As String) Dim qdf As QueryDef 

On Error GoTo ErrHandler 

If Len(QueryName) = 0 Then 'temp query  
    Set qdf = CurrentDb.CreateQueryDef("") 
    With qdf 
     .Connect = TempVars!ConnectionString 
     .SQL = SQL 
     .ReturnsRecords = False 
     .Execute 
    End With 

Else 
    Set qdf = CurrentDb.QueryDefs(QueryName) 
    qdf.SQL = SQL 
End If 

qdf.Close 
Set qdf = Nothing 

ExitHere: 
    Exit Function 

ErrHandler: 
MsgBox Err.Description 

    Resume ExitHere 
End Function 

не удаляет и больше воссоздает запрос, но только модифицировать SQL запроса.

Michael

Смежные вопросы