754
社区成员




给你一个我的方法,你可以试一下:
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