MS Access 2010:删除传递查询

时间:2016-12-07 12:30:44

标签: sql-server vba access-vba

我使用PT查询从SQL Server 2008R2获取数据。 使用ODBC连接字符串的查询存储在MS Access Client中,并从此函数中获取变量SQL-string,这是我很久以前在Web中找到的:

'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条记录。

有时 - 我无法找出何时或为何 - 根据Access对象完全删除PT查询,而不再追加。 我注意到,该功能以

开头
Set qdf = CurrentDb.CreateQueryDef

虽然具有此名称的查询已经存在。但是在大多数情况下它都有效(似乎覆盖了现有的查询),但有时根本不起作用。

我从这样的代码开始我的所有PT查询:

strsql=""EXEC dbo.spLookupSomething"
call SQL_PassThrough(strsql, "PT_LookupSomething")

重现此行为甚至非常困难。我尝试多次运行代码(知道它返回0 !!), - 没有任何反应。

但有时我可以在数据库的开发环境中看到,查询在第一次运行时消失,代码当然崩溃了。

任何想法,为什么会发生这种情况以及如何避免它?似乎删除和附件一直无法正常工作。

由于 迈克尔

2 个答案:

答案 0 :(得分:0)

您无法检查是否存在这样的查询对象:

IsNull(CurrentDb.QueryDefs(QueryName).Name)

它会立即引发错误。您必须循环QueryDefs集合以查看名称是否存在。

但为什么删除并创建查询?只需在创建后保留它并在运行之前调整SQL。

答案 1 :(得分: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。

迈克尔