来自 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 控制台中看到的输出。
我在 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 控制台中看到的输出。