我使用PT查詢從SQL Server 2008R2獲取數據。 與ODBC連接字符串的查詢存儲在MS Access Client,從這個功能,我發現很久以前在網上獲取變量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字符串(例如「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。但沒有錯誤處理程序它指向「如果不是IsNull(CurrentDb.QueryDefs(QueryName).Name)然後」與運行時錯誤3265 - 在此集合中找不到項目,我找不到任何不正確的代碼。但我會嘗試使用「On Error resume next」,也許它會跳過... – mak
我已經添加了一般VBA標籤,以增加對此問題的意見。 –