在pb中如何执行存储过程

gyagp 2002-07-25 02:38:40
sql server中master数据库中的一些存储过程如何在pb中用脚本执行。比如sp_password,是一个修改登录口令的存储过程,我在pb中写了如下脚本:
连接数据库语句(这里省略。。。)
string ls_oldpass,ls_newpass,ls_username
ls_username = 'gy'
ls_oldpass = 'gyagp'
ls_newpass = 'gy'
DECLARE sp_changepassword PROCEDURE FOR sp_password @old = :ls_oldpass, @new = :ls_newpass, @loginame = :ls_username;
EXECUTE sp_changepassword ;
IF SQLCA.SQLCode = -1 THEN
MessageBox("SQL error", SQLCA.SQLErrText+string(sqlca.sqlcode))
END IF
disconnect;


返回的错误信息是:不能在事务内部执行'sp_password'.
请问为什么?
...全文
435 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
balloonman2002 2002-07-26
  • 打赏
  • 举报
回复
gyagp(gyagp) :
这可是喔从我们的系统里面COPY出来的喔,:)
海洋‘s 2002-07-25
  • 打赏
  • 举报
回复
asa 7 的语法,ms sql server以及oracle差不多的:
假定表单为:
sys_sequence (table_name varchar(40) not null,cur_sequence numeric(15) not null,attribute varchar(2));
存储过程:

create procedure dba.sys_get_sequence(@as_table_name varchar(40))
as
begin
declare @next_sequence numeric(15)
select @next_sequence=cur_sequence from sys_sequence where sys_sequence.table_name=@as_table_name
if @next_sequence is null
begin
insert into sys_sequence(table_name,cur_sequence,seq_type) values(@as_table_name,1,'A')
select @next_sequence=1
select @next_sequence
end
else
begin
select @next_sequence=@next_sequence+1
update sys_sequence set cur_sequence=@next_sequence where sys_sequence.table_name=@as_table_name
select @next_sequence
end
end

这个存储过程可以在PB或Sybase Central中创建,你也可以加入事务控制来保证唯一性。
创建完毕后,分配权限:grant execute on sys_get_sequence to public;然后就可以在程序中调用了:
PB中,创建一个全局函数:
long gf_get_sequence(string as_table_name)
Decimal ld_seq_id
DECLARE get_seq_id procedure for sys_get_sequence :as_seq_name;
EXECUTE get_seq_id;
FETCH get_seq_id INTO :ld_seq_id ;
Close get_seq_id ;
Return ld_seq_id



存储过程的语法你稍微改一下就可以了。
super_jack 2002-07-25
  • 打赏
  • 举报
回复
把SQLCA 的AUTOCOMMIT改成true即可!
super_jack 2002-07-25
  • 打赏
  • 举报
回复
把SQLCA 的AUTOCOMMIT改成true即可!
gyagp 2002-07-25
  • 打赏
  • 举报
回复
to : balloonman2002
你的方法我没有试成功,语法没错,不过sqlca.sqlcode总是不对。
to: zyunlin(我一直在努力)
你的方法不错,谢谢
zyunlin 2002-07-25
  • 打赏
  • 举报
回复
你用的系统的存储过程,调用是非常简单的,看下面这段代码,
string ls_pas
ls_pas="sp_password NULL, 'hello', 'czh'"
sqlca.autocommit=true
execute immediate:ls_pas;
if sqlca.sqlcode<>0 then
messagebox("",sqlca.sqlerrtext)
end if
sqlca.autocommit=false
///////////////////////////////////////////////////////////////////
sp_password的用法(mssql server)
sp_password [ [ @old = ] 'old_password' , ]
{ [ @new =] 'new_password' }
[ , [ @loginame = ] 'login' ]

参数
[@old =] 'old_password'

是旧密码。old_password 为 sysname 类型,其默认值为 NULL。

[@new =] 'new_password'

是新密码。new_password 为 sysname 类型,无默认值。如果没有使用命名参数,就必须指定 old_password。

[@loginame =] 'login'

是受密码更改影响的登录名。login 为 sysname 类型,其默认值为 NULL。login 必须已经存在,并且只能由 sysadmin 固定服务器角色的成员指定。


balloonman2002 2002-07-25
  • 打赏
  • 举报
回复
I SEE:
ls_sql = "sp_password ?,?,?"
PREPARE SQLSA FROM :ls_sql;
EXECUTE SQLSA USING :ls_oldpwd,:ls_pwd,:ls_id;
if sqlca.sqlcode <>0 then
rollback;
messagebox('Ìáʾ','¿ÚÁîÐÞ¸Äʧ°Ü£¡')
return -1
end if
balloonman2002 2002-07-25
  • 打赏
  • 举报
回复
supsuccess(口气不小)
那如果想在程序里面改变帐户口令怎么修改啊?
balloonman2002 2002-07-25
  • 打赏
  • 举报
回复
UP一下,没碰到过,:)
supsuccess 2002-07-25
  • 打赏
  • 举报
回复
sp_password 不能在用户定义的事务中执行。
supsuccess 2002-07-25
  • 打赏
  • 举报
回复
sp_password 不能在用户定义的事务中执行。
kimcz 2002-07-25
  • 打赏
  • 举报
回复
你的ls_username有数据库管理权限吗?

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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