来自 Lotusscript 的循环 ADODB 记录集未完成或它以随机顺序 return 行

Looping ADODB recordset from Lotusscript do not finish or it return rows in random order

我在 IBM Domino 的预定代理中使用来自 Lotusscript 的 ADODB 运行宁 SQL 存储过程并得到非常奇怪的结果。

这是我的脚本运行

Sub test

    On Error GoTo e 
    Dim sqluser As String,sqlpw As String
    Dim srv As String, database As String, username As String, pw As String, sqlquery As String
    Dim tmp As String,t As Long

    sqlsrv = "..."
    sqldb = "..."
    sqluser = "..."
    sqlpw = "..."

    strConn = |Provider=SQLOLEDB.1;Server=| + sqlsrv + |;Database=| + sqldb + |;UID=| + sqluser + |;PWD=| + sqlpw
    Set adoConn = CreateObject("ADODB.Connection")
    Call adoConn.Open(strConn)
    Set rs = createobject("ADODB.Recordset")
    tmp = |Select ArtGr,KA,Sum(Belopp) Belopp, Sum(Kvantitet) Kvantitet From CrmStatTmp Where Len(KA)>0 Group By ArtGr,KA Order By KA,ArtGr|
    rs.open tmp,adoConn
    rs.MoveFirst
    Do Until rs.eof
        Print "Processing " + CStr(t)
        t = t + 1
        rs.movenext
    Loop

    Set rs = Nothing
    adoConn.close
    Set adoConn = Nothing
    Print "Ready"
    Exit sub
e:

    Print "Error"
    Print Error,Erl
    Set rs = Nothing
    adoConn.close
    Set adoConn = Nothing


End Sub

似乎没有任何错误,脚本似乎在大约 345 后停止执行,(数字可能不同,我更改了 SQL 查询)。

我不认为 SQL 查询有任何问题,因为当我们在其他工具中尝试时它工作正常。

下图显示了计数器如何计数到 344,然后突然又从 326 开始计数。此外,脚本似乎没有完成,因为最后一行 "Ready" 从未打印出来,而且似乎没有错误,因为错误处理程序中的打印语句永远不会打印出来。

我试图限制 return 从 SQL 查询中编辑的行数,但这并没有多大帮助,有一次我将它设置为仅 return 顶部20 条记录,然后计数器达到 15,似乎又 运行 整个脚本。所以输出是 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2...

我在Lotusscript 中使用过ADODB 很多次,这种脚本以前用过很多次。

我如何更改代码以使我的脚本以正确的顺序处理所有行

注意:某些对象在另一个模块中声明。

更新: 如果我将循环更改为此,它会变得更加奇怪,因为这次脚本 运行s 到最后,但数字仍然不按顺序

Do While Not rs.eof
        Print "Processing=" + CStr(t) + "/Value=" + CStr(rs.fields("ArtGr").value) + "/Status=" + CStr(rs.status) 
        t = t + 1
        rs.movenext
    Loop

我没有足够的代表来写评论,但如果这是一个预定的代理,它会在您对代码进行更改并保存时立即 运行 - 然后它就会开始也按计划进行,因此可能会 运行ning 两次。希望对您有所帮助。

我终于解决了,循环ADODB没有问题,问题是Domino Administrator中的控制台报告循环是按错误的顺序处理的。一旦我改为检查 "Domino Console" 中的循环,它就会报告正确的顺序。

不要相信您在 Domino Administrator 控制台中看到的输出。