高手急救!!!

zhoufenghubei 2010-03-09 08:14:54
如何判断pb调用存储过程执行是否成功!!
...全文
232 35 打赏 收藏 转发到动态 举报
写回复
用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)
第 2 章 日期处理 23 2.1 日期类型概述 23 2.2 日期处理函数 25 2.2.1 日期增减函数 25 2.2.2 日期信息获取函数 26 2.2.3 日期差值计算函数 27 2.2.4 其他日期处理相关函数 27 2.3 日期选项设置 29 2.3.1 default language选项 30 2.3.2 SET DATEFIRST 31 2.3.3 SET DATEFORMAT 31 2.3.4 SET LANGUAGE 33 2.4 日期格式化与日期推算处理 34 2.4.1 日期格式化处理 34 2.4.2 日期推算处理 35 2.4.3 日期加减处理 38 2.5 日期处理实例 40 2.5.1 生日处理 40 2.5.2 生成日期列表 42 2.5.3 工作日处理 46 2.5.4 工作时间计算 49 2.6 日期处理疑难解答 51 2.6.1 日期处理中常犯的错误 51 2.6.2 常见的低效率日期处理方法 52 2.6.3 日期与数字 53 第 3 章 字符处理 55 3.1 字符类型概述 55 3.2 字符串分拆 56 3.2.1 循环截取法 57 3.2.2 动态Transact-SQL语句法 57 3.2.3 辅助表法 59 3.2.4 分拆数据到列 61 3.2.5 分拆数字数据 62 3.2.6 分拆短信数据 63 3.3 字符串合并 64 3.3.1 游标合并法 65 3.3.2 SELECT语句合并法 66 3.3.3 临时表合并法 68 3.3.4 固定行合并法 69 3.4 其他字符串处理要求 70 3.4.1 分段截取 70 3.4.2 分段更新 72 3.4.3 IP地址处理 72 3.5 字符串分拆与合并处理应用实例 74 3.5.1 字符串比较 74 3.5.2 字符串交集/并集 75 3.5.3 分拆字符串并统计 78 3.5.4 借用字符串实现无规律排序 82 3.5.5 列车车次查询 82 3.6 字符串在动态Transact-SQL语句中的应用 85 3.6.1 动态Transact-SQL语句概述 85 3.6.2 字符串在编号查询中的使用 87 3.6.3 动态参数存储过程 90 3.6.4 动态Transact-SQL语句中常见问题 92 3.7 text与ntext字段处理 96 3.7.1 text与ntext数据的存储 96 3.7.2 管理text与ntext数据 97 3.7.3 text与ntext字段的复制和合并 99 3.7.4 text与image字段转换 101 3.7.5 ntext字段的REPLACE处理 103 第 4 章 排序规则 107 4.1 字符存储编码与排序规则 107 4.1.1 字符数据的存储编码 107 4.1.2 UNICODE 108 4.1.3 排序规则 109 4.1.4 排序规则比较和排列规则 111 4.1.5 使用排序规则 112 4.1.6 如何选择字符字段类型 116 4.2 排序规则应用 117 4.2.1 拼音处理 117 4.2.2 全角与半角字符处理 120 第 5 章 编号处理 123 5.1 自动编号 123 5.1.1 IDENTITY 123 5.1.2 ROWGUIDCOL 129 5.2 手工编号 131 5.2.1 查表法 131 5.2.2 独立编号表法 135 5.2.3 随机编号 139 5.3 缺号与补号 143 5.3.1 检查缺号 143 5.3.2 补号处理 143 5.3.3 编号重排 146 5.4 编号查询 150 5.4.1 已用编号分布查询 150 5.4.2 缺号分布查询 151 5.4.3 生成已用编号和缺号分布字符串 152 5.4.4 缺勤天数统计 155 第 6 章 数据统计与汇总 159 6.1 基本查询 159 6.1.1 空(NULL)值对查询的影响 159 6.1.2 联接 161 6.1.3 UNION与UNION ALL 165 6.1.4 数据填充查询 167 6.1.5 上限与下限区间统计 169 6.1.6 随机记录查询 170 6.2 分级汇总 173 6.2.1 实现分级汇总处理 173 6.2.2 分级汇总结果的过滤 176 6.2.3 分级汇总结果显示格式处理 177 6.2.4 分级汇总结果的排序处理 179 6.3 交叉数据报表 181 6.3.1 实现原理 181 6.3.2 多列转置 184 6.3.3 动态列 185 6.3.4 动态列中的字符溢出处理 188 6.3.5 特殊的交叉报表 191 6.4 典型数据统计案例 193 6.4.1 库存明细账查询 193 6.4.2 同期及上期数据对比 197 6.4.3 动态分组统计 199 6.4.4 销售排行榜 200 第 7 章 分页处理 205 7.1 应用程序中的分页处理 205 7.2 数据库中的分页处理 207 7.2.1 使用TOP N实现分页 207 7.2.2 使用字符串 211 7.2.3 使用临时表 213 7.2.4 使用SQL Server的系统存储过程处理分页 216 7.3 特殊要求的分页处理 217 7.3.1 随机显示的分页处理 217 7.3.2 分类数据的分页处理 221 第 8 章 树形数据处理 223 8.1 单编号处理法 223 8.1.1 方法概述 223 8.1.2 逐级汇总 225 8.1.3 编码重排 226 8.1.4 调整编码规则 229 8.1.5 调整编码隶属关系 233 8.2 双编号处理法 238 8.2.1 方法概述 239 8.2.2 树形数据排序 240 8.2.3 查找子节点 244 8.2.4 查找父节点 245 8.2.5 编码校验 246 8.2.6 节点复制 249 8.2.7 节点删除 251 8.2.8 逐级汇总 253 8.3 树形数据的扩展形式 256 8.3.1 产品配件清单 256 8.3.2 公交车乘车线路查询 258 第 9 章 数据导入与导出 261 9.1 访问外部数据 261 9.1.1 链接服务器 261 9.1.2 OPENROWSET与OPENDATASOURCE 268 9.1.3 外部数据访问方法总结 270 9.2 文本文件的导入与导出 274 9.2.1 查询文本文件内容 274 9.2.2 BCP与BULK INSERT 277 9.3 导入与导出中的常见问题 285 9.3.1 访问外部数据的注意事项 285 9.3.2 使用BCP或者BULK INSERT时的注意事项 286 9.3.3 外部数据文件位置及文件访问权限问题 287 9.4 在客户端实现SQL Server数据导入与导出处理 288 9.4.1 在Access数据库中实现与SQL Server之间的数据交换 288 9.4.2 实现客户端其他OLE DB数据源与SQL Server之间的数据交换 289 9.4.3 在客户端实现SQL Server数据导入与导出处理的一些说明 289 9.5 在数据库中存取文件 290 9.5.1 SQL Server中的文件存取方法 290 9.5.2 程序中的文件存取处理方法 292 第 10 章 作业 295 10.1 作业概述 295 10.1.1 定义作业 295 10.1.2 使用系统存储过程定义作业的常用模板 300 10.2 作业的应用 303 10.2.1 定时启用(或者停用)数据库 303 10.2.2 执行耗时的存储过程 304 10.2.3 秒级作业 305 10.3 使用作业的疑难解答 309 第 11 章 数据备份与还原 315 11.1 数据库备份与还原方法介绍 315 11.1.1 完全备份与还原 315 11.1.2 差异备份与还原 317 11.1.3 日志备份与还原 319 11.1.4 数据文件或文件组备份与还原 320 11.1.5 备份设备 321 11.1.6 数据库恢复模型对数据库备份和还原的影响 322 11.2 制订数据库备份方案 326 11.2.1 备份方案制订原则 326 11.2.2 建立数据备份方案 327 11.3 数据库备份与还原的实践应用 332 11.3.1 系统数据库的备份与还原 332 11.3.2 数据库迁移 336 11.3.3 部分数据库还原 339 11.3.4 抢救损坏数据库中的数据 341 11.3.5 将数据还原到指定时间点 343 11.3.6 将数据还原到指定标记点 345 11.3.7 同步备用服务器 346 11.4 数据备份与还原疑难解答 349 11.4.1 数据备份与还原中的常见问题 349 11.4.2 使用媒体集备份时的常见问题 354 11.4.3 数据库还原中的孤立用户问题 356 11.4.4 查询备份文件中的信息 360 第 12 章 用户定义数据类型 361 12.1 用户定义数据类型概述 361 12.1.1 创建和删除用户定义数据类型 361 12.1.2 为用户定义的数据类型绑定规则 365 12.1.3 为用户定义的数据类型绑定默认值 370 12.2 修改用户定义数据类型 373 12.2.1 修改被表引用的用户定义数据类型 373 12.2.2 修改被存储过程引用的用户定义数据类型 379 第 13 章 数据库安全 383 13.1 SQL Server的存取构架 383 13.1.1 表格格式数据流(TDS) 383 13.1.2 Net-Library与网络协议 384 13.1.3 Net-Library加密 387 13.2 用户管理 388 13.2.1 身份验证模式 388 13.2.2 登录、用户、角色和组 390 13.2.3 管理用户 395 13.3 数据文件安全 403 13.4 SQL Server安全配置 405 13.4.1 安全配置建议 405 13.4.2 使用安全套接字层(SSL)加密 408 13.5 应用程序上的安全 417 13.5.1 防止SQL注入式攻击 417 13.5.2 限制应用程序访问 418 13.5.3 不安全的扩展存储过程 419 第 14 章 系统表应用实例 423 14.1 系统对象概述 423 14.1.1 每个数据库中都存在的系统表 424 14.1.2 仅在系统数据库中存在的系统表 424 14.1.3 系统表应用中三个重要的系统存储过程 426 14.2 系统表在对象信息检索中的应用 429 14.2.1 搜索指定的对象所处的数据库 429 14.2.2 获取存储过程参数定义 432 14.2.3 搜索指定字符在哪个表的哪个字段中 435 14.2.4 非UNICODE字段改为UNICODE字段的可行性查询 438 14.2.5 字段相关对象查询 439 14.2.6 生成数据库字典 443 14.3 系统对象在处理中的应用 444 14.3.1 批量处理数据库中的对象 444 14.3.2 将所有的char、varchar改为nchar、nvarchar 445 14.3.3 标识列与普通列的相互转换 447 14.3.4 把列添加指定位置 450 14.3.5 在两个SQL Server数据库之间复制对象 451 第 15 章 SQL Server应用疑难解答 455 15.1 访问SQL Server实例的常见问题 455 15.1.1 连接失败 455 15.1.2 用户登录失败 458 15.1.3 测试连接到SQL Server实例的方法总结 458 15.1.4 超时 459 15.1.5 单用户的问题 460 15.1.6 默认数据库问题 461 15.2 索引中的疑难解答 462 15.2.1 索引对查询条件的影响 462 15.2.2 索引对查询结果顺序的影响 465 15.2.3 索引对数据操作的影响 469 15.3 数据库日志疑难解答 470 15.3.1 影响日志文件增长的因素 471 15.3.2 从事务日志中删除日志记录 472 15.3.3 日志文件处理中的误区 472 15.3.4 合理解决日志文件增长 473 15.4 错误处理疑难解答 474 15.4.1 错误处理概述 474 15.4.2 错误处理严重程度 475 15.4.3 使用@@ERROR的疑难解答 476 15.4.4 XACT_ABORT与RAISERROR的疑难解答 477 15.5 游标处理疑难解答 479 15.5.1 全局游标与本地游标 479 15.5.2 检查指定的游标是否存在 480 15.5.3 事务提交或者回滚对游标的影响 482 15.5.4 可更新的游标 483 15.6 SQL Server处理中的其他疑难解答 484 15.6.1 并发工作负荷调控器 484 15.6.2 存储过程中的疑难解答 486 15.6.3 标识值疑难解答 488 15.6.4 全文检索疑难解答 491 15.6.5 发布与订阅中的常见问题 494 15.6.6 其他疑难解答 496

752

社区成员

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

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