2013-06-21 35 views
7

我們最近創建了Access數據庫後端並將其遷移到SQL Server。我試圖使用VBA代碼創建一個到SQL Server後端的連接,並運行一個傳遞查詢,結果存儲在一個VB記錄集中。當我嘗試這個時,查詢不會通過。SQL Server直通查詢作爲Access中DAO記錄集的基礎

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim strConnect As String 

strConnect = "DRIVER=SQL Server;SERVER=55.55.55.55 SQLExpress;UID=UserName;PWD=Password" 

Set db = OpenDatabase("DBName", dbDriverNoPrompt, True, strConnect) 

Set rs = db.OpenRecordset("SELECT GetDate() AS qryTest", dbOpenDynaset) 

MsgBox rs!qryTest 

rs.Close 
db.Close 
Set rs = Nothing 
Set db = Nothing 

我得到的問題是完全適當的GetDate() SQL Server的功能「在表達用戶定義的函數‘GETDATE’」返回運行時錯誤3085。如果我在MS-Access查詢生成器中創建相同的查詢作爲MS-Access查詢生成器中的直通,那麼它將運行良好並返回服務器日期和時間,只有在代碼中沒有正確傳遞時纔會生效。

+1

「將我們的Access DB後端遷移到SQL Server」。我現在的建議是從DAO遷移到ADO記錄集,如果你需要在熟悉的視圖中查詢,那麼passthroughs很好,但如果只需要代碼,那麼ADO就是要走的路:) –

+0

這是最終的計劃。不幸的是,我處在一個環境中,我是4年前管理其他人創建的數據庫的唯一技術人員,並且隨着我的步伐逐漸增加。一次一步,但計劃是過渡到ADO ....最終! – Mike

回答

16

您需要使用QueryDef對象創建Pass-Through查詢,然後通過QueryDef的.OpenRecordset方法打開Recordset。下面的代碼適用於我:

Dim qdf As DAO.QueryDef, rst As DAO.Recordset 
Set qdf = CurrentDb.CreateQueryDef("") 
qdf.Connect = "ODBC;Driver=SQL Server;Server=.\SQLEXPRESS;Trusted_Connection=Yes;" 
qdf.SQL = "SELECT GetDate() AS qryTest" 
qdf.ReturnsRecords = True 
Set rst = qdf.OpenRecordset 
Debug.Print rst!qryTest 
rst.Close 
Set rst = Nothing 
Set qdf = Nothing 
+0

完美工作,謝謝!我錯過了一個QueryDef的需求,以此作爲傳遞工作! – Mike

0

Gord,你可以提供代碼的mods來執行proc與傳遞參數和插入語句?我一直在與它合作,但一直未能擊敗它。我有基本代碼工作,所以我正確地與服務器交談,我只是沒有得到正確的OpenRecordset。基本上,我做了三個步驟:記錄執行SP的開始,執行SP,記錄結束。這些是我的SQL字符串:

beginsql = " INSERT INTO [dbo_zSprocExecuteLog]" _ 
     & " values (sysdatetime(), 'uspGradePromotionDistrict', " _ 
     & [SeekerUserID] & ", 'B', '(" & [ReportDistrict] & ")';" 

    sqlstring = " EXEC uspGradePromotionDistrict" _ 
     & " @District = '" & [ReportDistrict] & "';" 

    endsql = " INSERT INTO [dbo_zSprocExecuteLog]" _ 
     & " values (sysdatetime(), 'uspGradePromotionDistrict', " _ 
     & [SeekerUserID] & ", 'E', '(" & [ReportDistrict] & ")';" 

我很感激你的意見,這一直在推動着我的瘋狂。你能推薦一本關於Access/SQL編程的好書嗎?我在SQL Server端有豐富的經驗,我的Access Fu有點弱。

+0

對於簡單的輸入,那麼你不需要傳遞。對於exec示例,請參閱我的帖子:http://stackoverflow.com/questions/28727560/use-function-call-in-passthrough-query/28735619#28735619 –

0

您不能使用直通查詢對本地表執行INSERT INTO。使用生成的查詢(使用Querydef生成的查詢)作爲INSERT的源。