| 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 ?? 头大!! |
|
|
|
|
|
| Jimt |  |
|
 |
 |
等级: 三流高手 头衔:霸王 贴子:355 积分:368 金币:0 注册:2007-9-12 |
|
| 第 2 楼 |
|
|
对odbc不熟,自从用odbc导致mysql数据永久丢失后,发誓再也不碰odbc……
return_value 可能有个特殊标记的,标记为输出。
另外,fb里return_value 其实一般不这么干,直接 "select * from READBUS ?" 更爽快。
|
|
|
|
|
|
| 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])
|
|
|
|
|
|
| sanron |  |
|
 |
 |
等级: 三流高手 贴子:93 积分:121 金币:0 注册:2010-1-4 |
|
| 第 4 楼 |
|
回复:SQLPrepare()出错,为什么啊? |
用ODBC主要考虑万一以后换数据库。
确实, 无奈之下现在换成用SELECT语句, 并且用SQLBindCol()进行列绑定。 |
|
|
|
|
|
| sanron |  |
|
 |
 |
等级: 三流高手 贴子:93 积分:121 金币:0 注册:2010-1-4 |
|
| 第 5 楼 |
|
回复:SQLPrepare()出错,为什么啊? |
貌似我写的略有出入 执行存储过程的语句有RETURNING_valueS的。 我就返回一条记录也要用SUSPEND吗?? |
|
|
|
|
|
| Jimt |  |
|
 |
 |
等级: 三流高手 头衔:霸王 贴子:355 积分:368 金币:0 注册:2007-9-12 |
|
| 第 6 楼 |
|
|
一定要suspend,否则他不鸟你……
一般习惯即使没有输出也会加个suspend进去…… |
|
|
|
|
|
| sanron |  |
|
 |
 |
等级: 三流高手 贴子:93 积分:121 金币:0 注册:2010-1-4 |
|
| 第 7 楼 |
|
|
我执行SQLPrepare不成功是否与不加SUSPEND有关呢? strSQL = "EXECUTE PROCEDURE READBUS ? RETURNING_valueS ?, ?, ?, ?, ?, ?, ?"; 用这条语句执行一个带返回值的存储过程没错吧? |
|
|
|
|
|
| Jimt |  |
|
 |
 |
等级: 三流高手 头衔:霸王 贴子:355 积分:368 金币:0 注册:2007-9-12 |
|
| 第 8 楼 |
|
|
见3楼,有没有RETURNING_valueS 这个语法我不清楚,不过用select * from READBUS(?) 绝对比你那个写法要爽很多。
suspend的作用是让你在存储过程中区分“每一行”,毕竟返回多少行是你说了算的。 流程上而言,客户端执行了上面的语句后就在等返回,每个suspend被认为返回一次,客户端就取到了一条数据,并接着等下一条。当存储过程里suspend都用完了到了最后的end的时候,客户端就得到了一个“没有更多记录”的消息,并完成历史使命。
可能也是由于这个特性的缘故,RETURNING_valueS 显得很累赘,还不如不要的好。 |
|
|
|
|
|
| sanron |  |
|
 |
 |
等级: 三流高手 贴子:93 积分:121 金币:0 注册:2010-1-4 |
|
| 第 9 楼 |
|
回复:SQLPrepare()出错,为什么啊? |
我现在改成SELECT语句了 相应地 SQLBindParameter() 也改成了 SQLBindCol() 还没找到获取返回值时两者的区别。 |
|
|
|
|
|
| Jimt |  |
|
 |
 |
等级: 三流高手 头衔:霸王 贴子:355 积分:368 金币:0 注册:2007-9-12 |
|
| 第 10 楼 |
|
|
| 用out参数只能获取一次输出,而fb的方式可以获取n个,只要你愿意。比如要获取1,2,3,4....10000000000的数列,用fb的存储过程是易如反掌,用其他的sql语句,估计死的比较难看。 |
|
|
|
|
|