收藏
  注册
  登陆
新闻 论坛 软件下载 用户中心
Firebird中文社区 今天是: 2010年9月10日 星期五   您现在位于: 首页 →  论坛 → 问题讨论区(浏览贴子)
   问题讨论区  -  浏览贴子 (回复:9 浏览:300  ufo2003 coaco cutebit   [ 本版精华 ]  [ 版面管理 ]
 主题:SQLPrepare()出错,为什么啊?
   
sanron 
等级: 三流高手
贴子:93
积分:121
金币:0
注册:2010-1-4
          1
 SQLPrepare()出错,为什么啊?
我写了一个存储过程
COMMIT;
SET TERM !! ;
CREATE PROCEDURE READBUS
(
keyUID INTEGER
)
RETURNS
(
vID INTEGER,
vName VARCHAR(64),
vAlias VARCHAR(64),
vStatus INTEGER,
vUID INTEGER,
vType INTEGER,
vOwner INTEGER
)
AS
BEGIN
SELECT FIRST 1 ID, Name, Alias, Status, UID,
Type, Owner
FROM PSDBUS WHERE UID = :keyUID
INTO :vID, :vName, :vAlias, :vStatus, :vUID,
:vType, :vOwner;
END !!
SET TERM ; !!
COMMIT;
然后用ODBC函数调用
strSQL = "EXECUTE PROCEDURE READBUS ? RETURNING_valueS ?, ?, ?, ?, ?, ?, ?";
retcode = SQLPrepare(hstmt, (SQLCHAR *)strSQL.c_str (), SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
////////
}

执行SQLPrepare总是不成功。
但如果用
strSQL = "EXECUTE PROCEDURE READBUS ?";
执行SQLPrepare成功。
难道不能带RETURNING_valueS ??
头大!!
 
 本贴发表时间:2010-2-4 15:28:40  
Jimt 
等级: 三流高手
头衔:霸王
贴子:355
积分:368
金币:0
注册:2007-9-12
          2
 
对odbc不熟,自从用odbc导致mysql数据永久丢失后,发誓再也不碰odbc……

return_value 可能有个特殊标记的,标记为输出。

另外,fb里return_value 其实一般不这么干,直接 "select * from READBUS ?" 更爽快。
 
彻头彻尾优化fb中……

力保前十??
 本贴发表时间:2010-2-4 16:58:08  
cutebit 
等级: 论坛版主
贴子:502
积分:516
金币:0
注册:2005-10-28
          3
 
呃。。。fb根本没 RETURNING_value 这个语法。
首先,你只是想用存储过程返回数据集,请用 SUSPEND 语法。
CREATE PROCEDURE READBUS
(
keyUID INTEGER
)
RETURNS
(
vID INTEGER,
vName VARCHAR(64),
vAlias VARCHAR(64),
vStatus INTEGER,
vUID INTEGER,
vType INTEGER,
vOwner INTEGER
)
AS
BEGIN
SELECT FIRST 1 ID, Name, Alias, Status, UID,
Type, Owner
FROM PSDBUS WHERE UID = :keyUID
INTO :vID, :vName, :vAlias, :vStatus, :vUID,
:vType, :vOwner;
SUSPEND;
END !!

----------------------------------------------------
执行时和执行普通的 select 语句一样就可以了
select * from READBUS([your id])
 
 本贴发表时间:2010-2-4 20:37:58  
sanron 
等级: 三流高手
贴子:93
积分:121
金币:0
注册:2010-1-4
          4
 回复:SQLPrepare()出错,为什么啊?
用ODBC主要考虑万一以后换数据库。

确实,
无奈之下现在换成用SELECT语句,
并且用SQLBindCol()进行列绑定。
 
 本贴发表时间:2010-2-5 8:58:00  
sanron 
等级: 三流高手
贴子:93
积分:121
金币:0
注册:2010-1-4
          5
 回复:SQLPrepare()出错,为什么啊?
貌似我写的略有出入
执行存储过程的语句有RETURNING_valueS的。
我就返回一条记录也要用SUSPEND吗??
 
 本贴发表时间:2010-2-5 9:02:36  
Jimt 
等级: 三流高手
头衔:霸王
贴子:355
积分:368
金币:0
注册:2007-9-12
          6
 
一定要suspend,否则他不鸟你……

一般习惯即使没有输出也会加个suspend进去……
 
彻头彻尾优化fb中……

力保前十??
 本贴发表时间:2010-2-5 20:01:37  
sanron 
等级: 三流高手
贴子:93
积分:121
金币:0
注册:2010-1-4
          7
 
我执行SQLPrepare不成功是否与不加SUSPEND有关呢?
strSQL = "EXECUTE PROCEDURE READBUS ? RETURNING_valueS ?, ?, ?, ?, ?, ?, ?";
用这条语句执行一个带返回值的存储过程没错吧?
 
 本贴发表时间:2010-2-8 9:12:05  
Jimt 
等级: 三流高手
头衔:霸王
贴子:355
积分:368
金币:0
注册:2007-9-12
          8
 
见3楼,有没有RETURNING_valueS 这个语法我不清楚,不过用select * from READBUS(?) 绝对比你那个写法要爽很多。

suspend的作用是让你在存储过程中区分“每一行”,毕竟返回多少行是你说了算的。
流程上而言,客户端执行了上面的语句后就在等返回,每个suspend被认为返回一次,客户端就取到了一条数据,并接着等下一条。当存储过程里suspend都用完了到了最后的end的时候,客户端就得到了一个“没有更多记录”的消息,并完成历史使命。

可能也是由于这个特性的缘故,RETURNING_valueS 显得很累赘,还不如不要的好。
 
彻头彻尾优化fb中……

力保前十??
 本贴发表时间:2010-2-8 17:38:17  
sanron 
等级: 三流高手
贴子:93
积分:121
金币:0
注册:2010-1-4
          9
 回复:SQLPrepare()出错,为什么啊?
我现在改成SELECT语句了
相应地
SQLBindParameter()
也改成了
SQLBindCol()
还没找到获取返回值时两者的区别。
 
 本贴发表时间:2010-2-8 18:29:29  
Jimt 
等级: 三流高手
头衔:霸王
贴子:355
积分:368
金币:0
注册:2007-9-12
          10
 
用out参数只能获取一次输出,而fb的方式可以获取n个,只要你愿意。比如要获取1,2,3,4....10000000000的数列,用fb的存储过程是易如反掌,用其他的sql语句,估计死的比较难看。
 
彻头彻尾优化fb中……

力保前十??
 本贴发表时间:2010-2-9 14:08:07  
 分页: [1]
主题贴类型:[ 正常 ] 
您是否还没有 注册 或还没有 登陆 本站?!