11

我们最近创建了 Access DB 后端并将其迁移到 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 代码之外,它运行良好并返回服务器日期和时间,只有在代码中它没有正确传递。

4

3 回答 3

23

You need to use a QueryDef object to create a Pass-Through query, then open the Recordset via the .OpenRecordset method of the QueryDef. The following code works for me:

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
于 2013-06-21T18:42:47.517 回答
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 有点弱。

于 2015-04-09T20:32:50.747 回答
0

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

于 2015-07-19T13:19:11.800 回答