我们在SQLRPGLE程序中遇到了持续的间歇性问题,该程序无法将数据加载到屏幕上。一位同事刚刚想出如何可靠地重现它,所以我一直在调试器中进行调查。
程序打开一个SQL游标到远程系统来填充子文件,如果用户按下F5,它会关闭游标并重新打开它。在某些情况下,这会以一种有趣的方式失败。
发现的可重复过程是首先运行函数,退出,然后发出STRSQL(显示远程连接仍处于活动状态)和CONNECT RESET。然后退回命令行并重新启动该功能。这是第一次显示和按F5 ONCE后的工作。但是在第二次按F5时,光标变得奇怪,程序无法加载数据。
这是我在调试器中运行的事件序列以及每个键SQL函数之后的SQLSTATE值。我检查了每个显示器的第一个FETCH,只是作为一个健全性检查。连接每次都会重新连接(可能不必要)到远程系统。
Action SQLSTATE Meaning
Initial connect 0 OK
Open cursor 0 OK
First fetch 0 OK
F5 pressed
Close cursor 0 OK
Reconnect 8002 Already connected
Open cursor 0 OK
First fetch 0 OK
F5 pressed
Close cursor 0 OK
Reconnect 8002 Already connected
Open cursor 0 OK
First fetch 0 OK
Exit program
Close cursor 0 OK
STRSQL CONNECT
Reconnect 8002 Already connected
Open cursor 0 OK
First fetch 0 OK
F5 pressed
Close cursor 0 OK
Reconnect 8002 Already connected
Open cursor 0 OK
First fetch 0 OK
F5 pressed
Close cursor 0 OK
Reconnect 8002 Already connected
Open cursor 24502 Already open
First fetch 24501 Cursor not open
在运行CONNECT RESET之前,按下F5循环无限期地工作。
退出该功能后,返回该功能仍然显示空列表(即光标问题仍然存在)但是如果程序的激活组被回收,则第一个显示和第一个F5再次工作,但是第二个F5会导致光标问题再一次。
我尝试运行RUNSQL SQL('CONNECT RESET'),但未能说明未达到承诺边界。它不会更新任何文件,因此不确定这是怎么回事。我们确实发现在CONNECT重置之前在STRSQL中运行COMMIT可以解决问题,但只是暂时像回收激活组一样。
我们还尝试将承诺控制设置为模块上的* NONE,并将Close SQL Cursor设置为* ENDMOD,但似乎没有任何区别。
我们肯定会感谢任何有关其他内容的建议!
答案 0 :(得分:0)
光标打开表示模块从未结束并关闭光标 sqlrpgle程序不得不中止某事。
数据十进制错误,选择多行的结果,字段对于插入或更新来说太大。
只要sqlcode为负数,sql错误的最佳做法是转储命令。
close mycursor;
open mycursor;
在打开光标前关闭热修复。但请记住,您的程序退出仍有一个原因必须修复。
{{1}}
答案 1 :(得分:0)
虽然我仍然不明白最后两个事件如何在序列中有效,但我找到了一种方法来阻止CONNECT(外部或其他)成为一个问题。
在CRTSQLRPGI命令中有一个参数:
RDB connect method . . . . . . . *DUW *DUW, *RUW
* RUW的帮助文本让我觉得值得一试:
*RUW
CONNECT (Type 1) semantics are used to support remote unit of work.
Consecutive CONNECT statements result in the previous connection
being disconnected before a new connection is established.
我发现RDBCNNMTH(*RUW)
与COMMIT(*NONE)
结合可以解决问题。
我认为这是一种解决方法,但却是一种坚固的方法。
答案 2 :(得分:0)
这听起来很简单......当您按F5时,* IN05应该关闭,按键将其打开*。该行动应激活您正在做的任何事情。 -WHAT IF-过程循环中的某些东西正在踩踏* IN05,现在让它开启(假设你在功能关闭时将其关闭),所以当它回滚时,连接已经建立。只是添加一个想法,因为它听起来像你的SQL是可靠的。