【发布时间】:2020-08-04 07:11:00
【问题描述】:
我有一个 Access 应用程序(Access 前端,使用链接表的 SQL 后端)并且我遇到了这个问题: 用户输入零件号。然后他们输入一个数量。新的业务逻辑说我必须对照表格检查这个零件号,看看我们是否在过去一年内向客户报价过。如果有,我们现在可以引用;如果不是,我们必须拒绝该部分。 最初编写程序时,他们使用数据表格式允许用户从 Excel 复制零件列表,将它们粘贴到数据表中,然后复制并粘贴到数量列表中。输入/粘贴行的数量后,将处理该行。 如果我手动输入一个零件号,然后数量,所需的代码检查零件号是否在去年被引用过,一切都很好。 但是,如果我复制并粘贴到零件列表中,第一次通过该过程就可以正常工作;但每隔一段时间都会失败。 这是基本代码:
Dim cn21 As ADODB.Connection
Set cn21 = New ADODB.Connection
Dim strsql21 As String
Dim cm21 As New ADODB.Command
Dim rs21 As New ADODB.Recordset
' gblODBCString = "ODBC;Description=PartsPortalsSql;DRIVER=SQL Server;SERVER=db-TEST-partsptl-primary;Trusted_Connection=Yes;APP=Microsoft Office 2010;DATABASE=PartsPortalSQL;"
cn21.Open gblODBCString
cm21.ActiveConnection = cn21
' All I want to know is how many records there are for this part within the last year...
strsql21 = "Select count(*) from tblQuoteDetail tqd INNER JOIN tblQuotes tq on tqd.quoteid = tq.quoteid WHERE " _
& " tqd.qdetailpartno = '" & Me.QDetailPartNo & "' AND tq.quotesentdate >= '" & OneYearAgo & "' AND tqd.qdetailunitprice > 0"
cm21.CommandText = strsql21
Set rs21 = New ADODB.Recordset
Set rs21 = cn21.Execute(strsql21, varparams, adCmdText)
If rs21(0) = 0 Then ' nothing found! can't be escalated...
blah blah blah...
end if
' done with this part... clean up
Set cm21 = Nothing
rs21.Close
Set rs21 = Nothing
Set cn21 = Nothing
然后它会在进入下一部分时返回这里...... 但如果我手动操作,它工作正常。但是当它通过部分循环运行时,它会到达: 设置 rs21 = cn21.Execute(strsql21, varparams, adcmdtext) 线 '处理/超时'大约需要 30 秒,然后 rs21(0) 返回“运行时错误'3265':在与请求的名称或序号对应的集合中找不到项目。”
我已验证 sql 查询中的每个字段都已正确填充。我以前从来没有遇到过这个问题。
我尝试过的其他事情 - 使用 DAO 而不是 ADODB...没有运气...
如果有人有任何建议,我会全力以赴...没有把它炸毁...我正处于替代版本的测试阶段,它不使用复制/粘贴功能。但距离生产还有一两个月的时间。
谢谢
Access 2016,链接表到 Microsoft SQL Server 2016 我相信... 视窗 10 64 位 也在 VPN 上运行,连接到 VDI。
【问题讨论】:
-
请使用合适的参数,不要编写SQL注入蜜罐。创建 ADODB.Command 会很麻烦,继续使用它的 .Parameters 代替草率和危险的字符串连接...
-
您确定您对记录集使用了正确的命令吗?
-
所以这“修复”了问题,在某种程度上......我更改了 sql 语句以提取它找到的记录的 detailid 字段,而不是试图让它计算它找到的记录数。我只关心去年是否至少有一个记录。所以我改变了 If 语句来寻找 EOF 条件,或者如果 detailid = 0,它工作正常......不知道为什么它不喜欢 count 命令......
标签: sql-server vba ms-access adodb