【问题标题】:ADO Failing Second time through a loopADO 失败第二次通过循环
【发布时间】: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


【解决方案1】:

我认为您在检查记录集时使用了错误的命令。我可能是错的,因为我没有尽可能多地使用 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

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2023-04-02
    • 2013-12-17
    • 2020-10-02
    相关资源
    最近更新 更多