hur.cn - 华软网

 热门搜索

高分请教游标检索问题

  作者:未知    来源:网络    更新时间:2017/12/5
pb9.0 sql2000 游标设置都正确但当运行或者debug时程序就无法响应。如果把程序中的          do while sqlca.sqlcode=0
fetch cur-user into :username
loop中sqlca.sqlcode=0写成sqlca.sqlca<>0运行就很正常。
------华软网友回答------
给你个游标的例子,你看看有什么发现。
下面的代码使用SQL 游标和FETCH 语句从数据库中读取数据并用这些数
据来填充product_col 列的代码表该列的编辑风格为下拉列表框
integer prod_code, i = 1
string prod_name
DECLARE prodcur CURSOR FOR
SELECT product.name, product.code
FROM product USING SQLCA;
CONNECT USING SQLCA;
IF SQLCA.SQLCode <> 0 THEN
MessageBox("状态","连接失败出错原因为" &
+ SQLCA.SQLErrText)
RETURN
END IF
OPEN prodcur;
IF SQLCA.SQLCode <> 0 THEN
MessageBox("状态","不能打开游标原因为" &
+ SQLCA.SQLErrText)
RETURN
END IF
FETCH prodcur INTO :prod_name, :prod_code;
DO WHILE SQLCA.SQLCode = 0
dw_products.SetValue("product_col", i, &
prod_name + "~t" + String(prod_code))
i = i + 1
FETCH prodcur INTO :prod_name, :prod_code;
LOOP
CLOSE prodcur ;
DISCONNECT USING SQLCA;

------华软网友回复------
你试试在open游标的时候会不会出错
------华软网友回复------
楼上的,怎么能知道open时是否出错呢,debug 吗。怎么才算出错。
------华软网友回复------
debug是一种非常好的查找问题的方式。你可以看到每次游标取值的过程,还有执行SQL语句是否成功。通过在全局变量sqlcode的返回值来看。
------华软网友回复------
你有多少条数据,可能是数据量太大,反应比较慢,或者是进入死循环了。
------华软网友回复------
怎么会在declare 之后connect阿,写法挺怪的!
------华软网友回复------
sqlca.sqlcode=0写成sqlca.sqlca<>0运行就很正常。
=================================================
上面这段话什么意思?是当<>0的时候会运行do while循环中的语句吗?如果是的话,你可不可以多贴一点代码出来。如果不是的话,你可以考滤一下 xyqiqi(琪琪) 的意见,你可以在do while 中加个messagebox,看看是否跳出对话框。

------华软网友回复------
楼上的你好,当<>0时不执行do while循环中的语句。我把do while sqlca.sqlcode改为do untile sqlca.sqlcode=100时也可以执行。各位能分析原因吗。另外还想问设计登录窗口时,在数据库中检索密码和人员名是否相符,用游标的方法好吗,还有其他更好的方法吗?
------华软网友回复------
1、少个分号fetch cur-user into :username;
do while sqlca.sqlcode=0
fetch cur-user into :username;
loop

2、应先FETCH 一下,如果为sqlcode = 0,说明有记录存在,再进入循环
fetch cur-user into :username;
do while sqlca.sqlcode=0
    //do sth
    fetch cur-user into :username;
loop
------华软网友回复------
楼上的那位和我说的是一样的,我在一楼就给了一个游标经典的例子。
FETCH prodcur INTO :prod_name, :prod_code;
DO WHILE SQLCA.SQLCode = 0
dw_products.SetValue("product_col", i, &
prod_name + "~t" + String(prod_code))
i = i + 1
FETCH prodcur INTO :prod_name, :prod_code;
LOOP
-------------------------
另外还想问设计登录窗口时,在数据库中检索密码和人员名是否相符,用游标的方法好吗,还有其他更好的方法吗?
答:一般不需要用游标来处理这样的小问题,一般的SQL语句就可以解决了。
select name,password from System
where (name = sle_name) and (password = sle_password)
using sqlca;
然后通过sqlca.sqlcode 的返回值来判断有无这个人。100没有,0有-1没有
------华软网友回复------
-1是执行的SQL语句有错误,比如没有连接到数据库。^_^补充一下。
------华软网友回复------
string a,b
 DECLARE aa CURSOR FOR  
  SELECT "VENDOR"."VEND_NUM",   
         "VENDOR"."VEND_NAME"  
    FROM "VENDOR"  ;
open aa;
do while sqlca.sqlcode=0 
   fetch aa into :a,:b;
   messagebox(a,b) 
loop
close aa;

messagebox()總是比我表裏的數據行數多一次!
http://community.csdn.net/Expert/topic/3976/3976565.xml?temp=.9054529

------华软网友回复------
HOHO...

确实应该在do while 前加fetch cur-user into :username;

------华软网友回复------
这应该是你在do while sqlca.sqlcode=0 没有用fetch aa into :a,:b;
你直接进入do while   
sqlca.sqlcode是判断你最进一次执行sql语句是的情况,就是说你的fetch aa into :a,:b;没有执行成功,你也要messagebox(a,b) 一次,所以会得到你说的,messagebox()總是比我表裏的數據行數多一次! 不知道我说得对不对,
------华软网友回复------
确实应该在do while 前加fetch cur-user into :username;
也是一樣的,在遊標中sqlca.sqlcode=0應該是表示這個遊標存在有數據。
相反我認爲放到外面反倒不對,因爲無論怎樣都必須執行一次!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。