ADO通过循环第二次失败

问题描述 投票:0回答:1

我有一个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位也运行在连接到VDI的VPN上。

sql-server access-vba adodb
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.