ADO通过循环第二次失败

时间:2020-04-21 13:50:59

标签: sql-server vba ms-access adodb

我有一个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我相信... Windows 10 64位 也可以在VPN上运行,并连接到VDI。

1 个答案:

答案 0 :(得分:0)

我认为您使用错误的命令来检查记录集。我可能会错,因为我没有尽可能多地使用ADO,但是如果您需要帮助,这是我的模板

'needs the MSO AtiveX Data Objects Library
Dim vbSql As String, cnnstr  as string
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset

vbSql = "SELECT ;"
Set cnn = New Connection
cnnstr = ""
cnn.Open cnnstr
rs.CursorLocation = adUseClient
rs.Open vbSql, cnn
cnn.Close
Set cnn = Nothing
相关问题