我使用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 !!), - 没有任何反应。
但有时我可以在数据库的开发环境中看到,查询在第一次运行时消失,代码当然崩溃了。
任何想法,为什么会发生这种情况以及如何避免它?似乎删除和附件一直无法正常工作。
由于 迈克尔
答案 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。
迈克尔