SQL Server Passthrough查询作为Access中DAO记录集的基础

时间:2013-06-21 18:22:15

标签: sql-server vba ms-access access-vba

我们最近创建了Access数据库后端并将其迁移到SQL Server。我正在尝试使用VBA代码创建与SQL Server后端的连接,并运行存储在VB记录集中的结果的直通查询。当我尝试这个时,查询不会通过。

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函数返回运行时错误3085“表达式中的用户定义函数'GetDate'”。如果我在MS-Access查询生成器中创建相同的查询作为直通,在VBA代码之外,它运行正常并返回服务器日期和时间,只在代码中它没有正确传递。

3 个答案:

答案 0 :(得分:18)

您需要使用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

答案 1 :(得分:0)

戈德,你能提供代码的mod来执行带有传递参数和insert语句的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有点弱。

答案 2 :(得分:0)

您不能使用直通查询INSERT INTO本地表。使用生成的查询(使用Querydef生成)作为INSERT的源。