【问题标题】:SQL Server Passthrough query as basis for a DAO recordset in AccessSQL Server Passthrough 查询作为 Access 中 DAO 记录集的基础
【发布时间】:2013-06-18 23:28:08
【问题描述】:

我们最近创建了 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 Query Builder 中创建与传递相同的查询,在 VBA 代码之外,它运行良好并返回服务器日期和时间,只有在代码中它没有正确传递。

【问题讨论】:

  • “将我们的 Access DB 后端迁移到 SQL Server”。我现在的建议是从 DAO 迁移到 ADO 记录集,如果您需要在熟悉的视图中进行查询,那么直通非常好,但如果只需要在代码中,那么 ADO 就是要走的路:)
  • 这是最终的计划。不幸的是,我所处的环境中,我是唯一的技术人员,负责管理 4 年前由其他人构建的数据库,并且随着我的进展不断增加。一步一步,但计划是过渡到 ADO.... 最终!

标签: sql-server ms-access vba


【解决方案1】:

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

【讨论】:

  • 完美运行,谢谢!我错过了对 QueryDef 的需求,以便将其作为传递来工作!
【解决方案2】:

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 有点弱。

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多