高手急救!!!

zhoufenghubei 2010-03-09 08:14:54
如何判断pb调用存储过程执行是否成功!!
...全文
245 35 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
miss_chen106 2010-03-13
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 wag_enu 的回复:]
问题解决没得呢?
可以加我QQ :370801979
远程给看看.
[/Quote]
高手啊!!!!!!11
fuxiaoyang13 2010-03-12
  • 打赏
  • 举报
回复
学习!!!!!!!!!!!!!!!!!!!!!1
wag_enu 2010-03-12
  • 打赏
  • 举报
回复
问题解决没得呢?
可以加我QQ :370801979
远程给看看.
flashixj61 2010-03-12
  • 打赏
  • 举报
回复
恩,没有从根本上解决问题,貌似数据库事务挺乱的。
pb8 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 zhoufenghubei 的回复:]
问题解决!在调用存储过程之前先commit Using sqlcasw;或RollBack using sqlcasw,请问谁能告诉我这是为什么?
[/Quote]
这个的作用就是让你的存储过程在执行前开始一个新的事务,不会受到之前一些数据库交互的影响,情况比较复杂,要看你的数据再看~~
zhoufenghubei 2010-03-12
  • 打赏
  • 举报
回复
问题解决!在调用存储过程之前先commit Using sqlcasw;或RollBack using sqlcasw,请问谁能告诉我这是为什么?
zhoufenghubei 2010-03-11
  • 打赏
  • 举报
回复
这是什么答案
wag_enu 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zhoufenghubei 的回复:]
  简单的存储过程直接抛出错误,前面只要有select查询语句,sqlcasw就返回为0,没有select查询语句,返回为-1!请问这是为什么??
[/Quote]

不管什么方法,试一下吧先...
zhoufenghubei 2010-03-11
  • 打赏
  • 举报
回复
请问为什么要先调用存储过程之前commit Using sqlcasw;或RollBack using sqlcasw;一次??不解!!
hchjjun 2010-03-11
  • 打赏
  • 举报
回复
判断sqlcode值不就行了!
leiguo1985 2010-03-10
  • 打赏
  • 举报
回复
这个不能怪PB,是你的过程写的不够强状
!多看看异常处理机制吧/1
agx2003 2010-03-10
  • 打赏
  • 举报
回复
wag_enu 2010-03-10
  • 打赏
  • 举报
回复
引用 7 楼 zhoufenghubei 的回复:
存储过程没有问题!在查询器里面执行失败!提示'主关键字重复',在pb里面就执行存储过程后,sqlca.sqlcode 照样为0,直接获取sqlca.sqlerrtext为空!

给你一个我的方法,你可以试一下:
1,存储过程中大至这么处理:

CREATE PROCEDURE P_SetJob
(@stdate char(1),
@stypeid char(10),
@.......
)
AS
............
begin tran InsE

insert into [setjob]([stdate],[stypeid],[job],[etypeid],[tzyn],[tzto],[wgrp])
values (@stdate,@stypeid,@job,@etypeid,'N',0,@wgrp)
if @@error<>0 goto error_1

...........
succee:
commit tran InsE
select 0,'数据存储完毕! '
Return 0

error_1:
rollback tran InsE
select error,[description],0 from [master].[dbo].[sysmessages] where error = @@error
return @@error

2, 在PB 中这么做:

a. 定义全局结构:

global type str_out from structure
any anyvar[]
end type

b. 用dynamic SQL4 写个通用的调用存储过程的函数:

global type gf_dynamic_sql4 from function_object
end type

forward prototypes
global function integer gf_dynamic_sql4 (string as_sql, any as_arg[], ref str_out ast_out[])
end prototypes

global function integer gf_dynamic_sql4 (string as_sql, any as_arg[], ref str_out ast_out[]);int i
sqlca.autocommit = true
PREPARE SQLSA FROM :as_sql using sqlca ;
if SQLCA.SQLCode <> 0 then
MessageBox("提示", "在执行动态SQL时出错。~n~n提示:~n" + sqlca.sqlerrtext, stopsign!)
goto lb_ret
end if

DESCRIBE SQLSA INTO SQLDA ;

for i = 1 to upperbound(as_arg)
setdynamicparm(sqlda, i, as_arg[i])
next

DECLARE l_Proc DYNAMIC PROCEDURE FOR SQLSA ;
EXECUTE DYNAMIC l_Proc USING DESCRIPTOR SQLDA ;
FETCH l_Proc USING DESCRIPTOR SQLDA ;

long li_r
long li_c

DO WHILE TRUE
CHOOSE CASE SQLCA.SQLCode
CASE -1 //出错。
MessageBox("提示", "在执行动态SQL时出错。~n~n提示:~n" + sqlca.sqlerrtext, stopsign!)
goto lb_ret
exit
CASE 100 //没有读取到数据,已经到了游标的结尾。
EXIT
CASE 0 //成功读取一条记录。
li_r ++
for li_c = 1 to sqlda.numoutputs
choose case sqlda.outparmtype[li_c]
case typestring!
ast_out[li_r].anyvar[li_c]=GetDynamicString(sqlda,li_c)

case typedecimal!,typedouble!,typeinteger!,typelong!,typereal!,typeboolean!
ast_out[li_r].anyvar[li_c]=getdynamicnumber(sqlda,li_c)

case typedate!
ast_out[li_r].anyvar[li_c]=getdynamicdate(sqlda,li_c)

case typedatetime!
ast_out[li_r].anyvar[li_c]=getdynamicdatetime(sqlda,li_c)

case typetime!
ast_out[li_r].anyvar[li_c]=getdynamictime(sqlda,li_c)

case else
messagebox('动态SQL4','未知的数据类型!', Exclamation!)

end choose
next

FETCH l_Proc USING DESCRIPTOR SQLDA ;
END CHOOSE
LOOP

CLOSE l_Proc ;
sqlca.autocommit = false

lb_ret:

return sqlca.sqlcode
end function

c, 调用方法:

any ls_arg[]
str_out lst_out[]
string ls_sql

ls_sql = 'execute P_SetJob @stdate = ?,@stypeid = ? ....'
ls_arg[1] = '2010-03-01'
ls_arg[2] = ......
.................
ls_arg[n] = ... ///依次对过程中的参数赋值

if gf_dynamic_sql4(ls_sql,ls_arg,lst_out) = 0 then
if lst_out[1].anyvar[1] <> 0 then
messagebox('过程执行完毕', '有错误:'+string(lst_out[1].anyvar[2]),stopsign!)
return
else
messagebox('过程执行完毕', string(lst_out[1].anyvar[2]),stopsign!)
end if
else
messagebox('过程执行错误',sqlca.sqlerrtext)
end if


永生天地 2010-03-10
  • 打赏
  • 举报
回复
本文拟以sybase ase 10.x和11.x数据库为例,说明如何在pb脚本当中获取存储过程的返回值。作为一个存储过程,其输出的结果数据可能包括三类:select结果集、return结果、output参数。尽管输出方式众多,但pb脚本仅仅借助简单的fetch…into…语句即可全部获取这些输出数据,具体方式如下:
(一)在sybase ase 10.x和11.x数据库当中创建一个存储过程deptroster,其有一个输入参数@deptno、两个输出参数@totsal 和 @avgsal、一个return值@number_of_emps以及包含职员姓名和工资的select结果集,可见除了输入参数@deptno外,其他均为输出数据,我们需要在pb脚本中获取,具体代码如下:

create procedure deptroster @deptno integer,
@totsal double precision output,
@avgsal double precision output
as
declare @number_of_emps integer
select emp_fname, emp_lname, salary from employee
where dept_id = @deptno
select @totsal = sum(salary),
@avgsal = avg(salary),
@number_of_emps = count(*) from employee
where dept_id = @deptno
return @number_of_emps;

(二)pb脚本当中我们需要捕获select结果集、return值和两个输出参数,其输出顺序也是按照“select结果集、return值、输出参数”顺序输出,具体代码如下:

integer fetchcount = 0
long ldeptno, rc
string fname, lname
double dsalary, dtotsal, davgsal
ldeptno = 100

//此处声明存储过程名称
declare deptproc procedure for
@rc = dbo.deptroster
@deptno = :ldeptno,
@totsal = 0 output,
@avgsal = 0 output
using sqlca;

//此处开始执行存储过程
execute deptproc;

//判断执行结果
choose case sqlca.sqlcode
case 0
//如果返回0则表示执行成功,至少存在一个select结果集
//借助loop循环开始捕获这个select结果集
do
fetch deptproc into :fname, :lname, :dsalary;
choose case sqlca.sqlcode
case 0
fetchcount++
case 100
messagebox ("end of result set", &
string (fetchcount) " rows fetched")
case -1
messagebox ("fetch failed", &
string (sqlca.sqldbcode) " = " &
sqlca.sqlerrtext)
end choose
loop while sqlca.sqlcode = 0

// 再单独执行一次fetch语句以获取return值和output参数
fetch deptproc into :rc, :dtotsal, :davgsal;
choose case sqlca.sqlcode
case 0
messagebox ("fetch return value and output" &
"parms successful", "return value is: " &
string (rc) &
"~r~ntotal salary: " string (dtotsal) &
"~r~naverage sal: " string (davgsal))
case 100
messagebox ("return value and output parms" &
"not found", "")
case else
messagebox ("fetch return value and output" &
"parms failed", "sqldbcode is " &
string (sqlca.sqldbcode) " = " &
sqlca.sqlerrtext)
end choose

//此处关闭存储过程
close deptproc;
case 100

// 如果返回100,则表示没有返回结果集.
// 此时不需要单独执行close语句.
messagebox ("execute successful", "no result set")

case else
//其他情况则表示存储过程执行失败,提示用户即可
messagebox ("execute failed", &
string (sqlca.sqldbcode) " = " &
sqlca.sqlerrtext)

end choose

至此本文结束。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
qzyuanmu 2010-03-10
  • 打赏
  • 举报
回复
if sqlcasw.sqlcode=-1 then

ls_err=sqlcasw.sqlerrtext
rollback using sqlcasw;
messagebox('提示','审核失败'+'~r~n'+ls_err)

else
commit using sqlcasw;
messagebox('提示','审核成功')
dw_1.object.c_status[1]='O'
this.event ub_billshow( )


end if


有可能返回100的吧?
pb8 2010-03-10
  • 打赏
  • 举报
回复
调用存储过程之前commit Using sqlcasw;或RollBack using sqlcasw;一次,~~
ahder 2010-03-10
  • 打赏
  • 举报
回复
学习了 .
zhoufenghubei 2010-03-10
  • 打赏
  • 举报
回复
简单的存储过程直接抛出错误,前面只要有select查询语句,sqlcasw就返回为0,没有select查询语句,返回为-1!请问这是为什么??
pb8 2010-03-10
  • 打赏
  • 举报
回复
还有种情况就是嵌套的存储过程或函数的调用,在查询分析器里面是能得到错误信息的,但在pb里面得不到,pb里面只能得到最外层的存储过程的处理情况,所以需要对调用其他存储过程的地方都要判断一下@@error的值,看处理情况~~
pb8 2010-03-10
  • 打赏
  • 举报
回复
三、写一个简单的存储过程,直接抛出错误试试,看SQL是否得到错误了;
这点提到的是你写一个简单的出错的存储过程,在PB里面调而不是查询分析器里面,看看sqlcasw返回的情况;
加载更多回复(15)

754

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧