我得到一个错误代码(3146:odbc呼叫失败-无效光标状态(#0)在我的本地机器上使用Microsoft Access 365,但它在我们的远程桌面环境中使用2016 Access Professional Plus工作。
阅读这篇文章后,我将我的ODBC超时设置为2000在查询的属性表,但仍然得到相同的错误,它只需要大约10秒抛出。
我还读到在Access 2016的早期版本中光标状态存在问题,不确定这是否是Office 365的问题?
这个子程序已经工作多年没有任何问题。它看起来是和Office 365绑定的。
任何想法?
这一行的代码错误
DoCmd.OpenQuery "qryImportGMSData" 'Creates tempTable with Weekly Import from GMS
下面是我的子程序
Sub GMSImport(StartDate As Date, EndDate As Date)
Dim SqlStr As String
Dim db As DAO.Database
Set db = CurrentDb()
'Builds query string for stored procedure maintained by SWDev from GMS to show Weekly Deals for report.
SqlStr = "EXEC dbo.upRpt_WeeklyDealsReport @BeginDate = '" & Format(StartDate, "yyyy-mm-dd") & "' ," & _
" @EndDate = '" & Format(EndDate, "yyyy-mm-dd") & "' ," & _
" @RegionType_Short_List = 'CA~GC~MC~MW~SW~WE~NE' ," & _
" @IncludeBulletDeals = 0 ," & _
" @FormatType = 'spgexporttype'"
db.QueryDefs("ptqry_DataExport").sql = SqlStr 'sets the parameters for the stored procedure
DoCmd.SetWarnings False
DoCmd.OpenQuery "qryImportGMSData" 'Creates tempTable with Weekly Import from GMS
DoCmd.RunSQL "ALTER TABLE temp_GMSImport ADD COLUMN Selected BIT" 'Add Selected Column to temp table
DoCmd.RunSQL "ALTER TABLE temp_GMSImport ADD COLUMN dvsValuationDef_ID INT" 'Adds Valuation Def Column to temp table
DoCmd.RunSQL "UPDATE temp_GMSImport SET temp_GMSImport.Selected = -1;" 'Sets all Selected field to TRUE
DoCmd.SetWarnings True
End Sub
这一行出现错误:
DoCmd.OpenQuery "qryImportGMSData" 'Creates tempTable with Weekly Import from GMS
我能够在SMSS中执行存储过程,没有任何问题:
"EXEC dbo.upRpt_WeeklyDealsReport @BeginDate = '" & Format(StartDate, "yyyy-mm-dd") & "' ," & _
" @EndDate = '" & Format(EndDate, "yyyy-mm-dd") & "' ," & _
" @RegionType_Short_List = 'CA~GC~MC~MW~SW~WE~NE' ," & _
" @IncludeBulletDeals = 0 ," & _
" @FormatType = 'spgexporttype'"
当我测试64位ODBC连接时,它测试成功。
更新-在Access内部进行更多测试:
我能够在Access中执行T-SQL代码而不使用VBA。
有3个查询涉及的序列和一个不工作是qryImportGMSData。这是一个问题,不使用VBA,所以缩小了一点。
qryImportGMSData
查询:Make Table Query (Replicated)这个导致错误
SELECT * INTO temp_GMSImport
FROM qryImportTransform;
qryImportTransform查询:Select Query (Replicated)Works
SELECT *
FROM ptqry_DataExport;
Ptqry_DataExport
SQL直通查询(复制)Works
EXEC dbo.upRpt_WeeklyDealsReport @BeginDate = '2021-02-22' , @EndDate = '2021-02-28' , @RegionType_Short_List = 'CA~GC~MC~MW~SW~WE~NE' , @IncludeBulletDeals = 0 , @FormatType = 'spgexporttype'
好的,所以我们缩小了PT查询可以在Access中工作的范围。
我们可能在处理两个不同的连接——所以有一个"小点"。异步(线程)在这里发生。
如果没有,使用相同的连接对象来运行所有3个查询。
所以,使用这个:
db.Execute "qryImportGMSData",dbFailOnError
db.Execute "ALTER TABLE temp_GMSImport ADD COLUMN Selected BIT", dbFailOnError
db.Execute "ALTER TABLE temp_GMSImport ADD COLUMN dvsValuationDef_ID INT"
db.Execute "UPDATE temp_GMSImport SET temp_GMSImport.Selected = -1;",dbFailOnError
上面的另一个大优点是更快,不会扰乱访问的"ui";设置,你不需要改变设置警告。
以上并没有强制访问并尝试使用"transaction "
问题是我们用了两个不同的连接,你用的是"db",然后用的是docmd "separate"连接——你不能控制这么多。
对于两个连接对象,它"几乎";类似于两个人运行代码的两个不同部分。
试一试上面的方法——坚持"一";连接对象,以便它们能够"行为"。作为一组类似的命令。如前所述,转储文档有几个缺点,并且更多地依附于Access"用户界面"。选项,则为纯代码。