pb9和sqlserver 2000中游标的应用问题,附有源码和错误信息,请高手帮我看看,谢谢:)
pb9+sqlserver2000。
一、在函数里面定义游标为何不能打开。定义及出错信息如下。
DECLARE cur_noright CURSOR FOR
SELECT yldmenu.menuid
FROM yldmenu
WHERE (yldmenu.menuid not in (:gs_menuidall))
ORDER BY yldmenu.menuid ASC ; //('10300','10300','10000','10400','10500','10700','10800','10900','11100','11300','11600','11700','11800','12000','20000')
open cur_noright;
错误信息为:Bind parameter value for '?' is too big (119)
二、为数据窗口的列定义了有效性规则后,为什么当出现错误时会出现两次提示?如何只让它出现一次?
三、关于使用游标的又一怪事。编译不出错,运行时,sql有注释中的错误。
//我打算将syscolumns系统表中我所创建的表的字段抽出来放到自己的表中,然后再用其它办法加上中文说明,想通过下面的方式来做,结果出现一个错误***********
String ls_table,ls_column,ls_filter,ls_sql
Long ll_tableid,ll_c,ll_t
DECLARE cur_table CURSOR FOR
SELECT sysobjects.name,
sysobjects.id
FROM sysobjects
WHERE ( sysobjects.xtype = 'U' ) AND
( Left(sysobjects.Name,1) = 'c' ) ;
DECLARE cur_column DYNAMIC CURSOR FOR sqlsa;
DELETE FROM ctablecolumnname;
ls_sql = "SELECT syscolumns.name FROM syscolumns WHERE syscolumns.id=?"
PREPARE sqlsa FROM :ls_sql;
OPEN cur_table;
FETCH cur_table INTO :ls_table,:ll_tableid;
//出错行?????????????????????????
OPEN DYNAMIC cur_column USING :ll_tableid; //SQLSTATE = S1004[Microsoft][ODBC SQL Server Driver]无效的 SQL 数据类型
//sqlca.sqlcode=-1,sqldbcode=999.
//sql server中int为4byte,pb中long才为4型。而我将系统表sysobjects与syscolumns用id关联后采用表名时,同样也出类似的错误,怪哉,救救我。
IF sqlca.SQLCode = 0 THEN
DO UNTIL sqlca.SQLCode = 100
ll_t++
FETCH cur_column INTO :ls_column;
DO UNTIL sqlca.SQLCode = 100
ll_c++
INSERT INTO ctablecolumnname
( tablename,
columnname,
columnnamecn )
VALUES ( :ls_table,
:ls_column,
Null ) ;
FETCH cur_column INTO :ls_column;
LOOP
FETCH cur_table INTO :ls_table,:ll_tableid;
LOOP
END IF
IF sqlca.SQLCode = 100 THEN
COMMIT;
MessageBox('提示','信息生成'+String(ll_c)+'/'+String(ll_t)+'条记录,操作成功!')
ELSEIF sqlca.SQLCode < 0 THEN
MessageBox('提示','信息生成失败!~r~n错误信息为:'+sqlca.SQLErrText)
ROLLBACK;
END IF
CLOSE cur_table;
CLOSE cur_column;
四、而将上面出错的游标改用datastore来实现归却又有如下的错误:只有最后一条记录不会出错,而其它所有的记录在retrieve时,返回值均为-1,请问是为什么?附datastroe代码如下:
String ls_table,ls_column,ls_filter
Long ll_tableid,ll_rc,ll_cr,ll_c,ll_t
datastore lds_column
DECLARE cur_table CURSOR FOR
SELECT sysobjects.name,
sysobjects.id
FROM sysobjects
WHERE ( sysobjects.xtype = 'U' ) AND
( Left(sysobjects.Name,1) = 'c' ) ;
DELETE FROM ctablecolumnname;
lds_column = CREATE datastore
lds_column.DataObject = 'dw_systablecolumn'
ll_cr = lds_column.SetTransObject(sqlca)
ll_cr = lds_column.Retrieve(ll_tableid) //此时ll_tableid为0竟然不出错,返回值为0,是对的。
OPEN cur_table;
FETCH cur_table INTO :ls_table,:ll_tableid;
IF sqlca.SQLCode = 0 THEN
DO UNTIL sqlca.SQLCode = 100
ll_t++
ll_rc =lds_column.Retrieve(ll_tableid) //此行出错,只有所有记录中的最后一条是对的,其它前面的所有记录明明有内容,返回也是-1。注:此数据窗口对像需要一个number型的参数。
IF ll_rc < 1 THEN
MessageBox('提示','检索数据出错。')
return
ELSE
FOR ll_cr = 1 TO ll_rc
ls_column = Trim(lds_column.GetItemString(ll_cr,'name'))
if ls_column<>'' then ll_c++
INSERT INTO ctablecolumnname
( tablename,
columnname)
VALUES ( :ls_table,
:ls_column) ;
NEXT
END IF
FETCH cur_table INTO :ls_table,:ll_tableid;
LOOP
END IF
IF sqlca.SQLCode = 100 THEN
COMMIT;
MessageBox('提示','信息生成'+string(ll_c)+'/'+string(ll_t)+'条记录,操作成功!')
ELSEIF sqlca.SQLCode < 0 THEN
ROLLBACK;
MessageBox('提示','信息生成失败!~r~n错误信息为:'+sqlca.SQLErrText)
END IF
CLOSE cur_table;