【问题标题】:Calling stored procedure from MS Access results in error 3146从 MS Access 调用存储过程会导致错误 3146
【发布时间】:2018-09-08 19:07:02
【问题描述】:

当我使用下面显示的代码从 MS Access 前端调用 SQL Server 存储过程时,它停止运行并抛出运行时错误“3146”。

这个存储过程在 SQL Server 中运行正常,但是当我从 MS Access 运行时,它一开始可以运行,但突然停止并抛出运行时错误“3146”。

为了更清楚,这个存储过程用于在我从 MS Access 中插入空表中的记录时,它应该插入 1000 条记录,但它会插入 970 条记录然后停止。

我的存储过程有一个用于插入记录的选择查询,现在我已将这个简单的选择查询更改为联合查询,因为我在存储过程的设计中对此进行了更改,它在 SQL Server 中运行良好

Public Sub Command0_Click()
    Dim qdef As DAO.QueryDef
    Set qdef = CurrentDb.CreateQueryDef("")

    qdef.Connect = CurrentDb.TableDefs("[ASBUILT_LIST]").Connect
    qdef.SQL = "EXEC Update_Asbuilt2"
    qdef.ReturnsRecords = False  ''avoid 3065 error
    qdef.Execute
    qdef.Close

    Set qdef = Nothing
End Sub

【问题讨论】:

  • 当它运行但未到最后时,我假设存在权限问题。在错误 3146 上循环使用 For I = 0 To Errors.Count-1 Debug.Print Errors(I) Next I 的错误集合

标签: sql-server vba ms-access


【解决方案1】:

如果运行了,但没有到最后,那么很可能不是权限问题,而是超时问题

你可以做一个:

debug.print qdef.ODBCTimeout 

了解您当前的超时值是多少。

然后只需增加足够的秒数即可完成存储过程:

Public Sub Command0_Click()
    Dim qdef As DAO.QueryDef
    Set qdef = CurrentDb.CreateQueryDef("")

    qdef.Connect = CurrentDb.TableDefs("[ASBUILT_LIST]").Connect
    ' --------------- Define TimeOut in Seconds ----------------
    qdef.ODBCTimeout = 2000 
    ' ----------------------------------------------------------        
    qdef.SQL = "EXEC Update_Asbuilt2"
    qdef.ReturnsRecords = False  ''avoid 3065 error
    qdef.Execute
    qdef.Close

    Set qdef = Nothing
End Sub

【讨论】:

  • 感谢我的 qdef.ODBCTimeout 是 60,我不知道它是 60,我之前没有更改它的默认值。
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 2011-05-02
  • 2023-03-20
  • 2013-09-18
  • 1970-01-01
  • 2015-11-03
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多