我正在使用SOCI 库通过 ODBC 以编程方式与 SQL Server DB 交互。我无法通过存储过程中的输出参数获取值。一些代码(仿照SOCI 文档)...
/*
* create procedure
* Dan.soci_proc @id int, @name varchar(32) output
* as begin
* set nocount on;
* select @name = name from Dan.soci_test where id = @id
* end
*/
std::string sql = "Dan.soci_proc :id, :name";
std::string name;
int proc_ndx = 1;
soci::procedure proc = (my_soci.get_session().prepare << sql, soci::use(proc_ndx),
soci::use(name));
std::cout << "\nAttempting to execute stored procedure " << size << " times."
<< std::endl;
for (; proc_ndx < adj_size; ++proc_ndx) {
try {
proc.execute();
while (proc.fetch())
std::cout << "Fetched: " << name << std::endl;
} catch (const soci::odbc_soci_error& e) {
std::cerr << "Error executing stored procedure." << std::endl;
std::cerr << e.what() << std::endl;
std::cerr << e.odbc_error_message() << std::endl;
return;
}
}
我的代码没有抛出任何错误或异常,但也没有获取任何内容。我尝试了很多不同的方式(普通exec
语法、ODBCcall
语法等),但似乎没有任何效果。我想知道错误是否从这里回到这个......
如果省略输入/输出参数,或者为参数提供了文字,则驱动程序会丢弃输出值。
不幸的是,SOCI 似乎并不真正支持参数标记,至少据我所知。
我通过使用这种语法使代码工作......
std::string sql = "declare @name varchar(32); "
"exec Dan.soci_proc :id, @name = @name output; select @name";
...
soci::procedure proc = (my_soci.get_session().prepare << sql, soci::use(proc_ndx),
soci::into(name));
但这并不理想,原因我认为是显而易见的。
有没有人使用过 SOCI 并且对我需要采取不同的措施来让它发挥作用有一些意见?
编辑:我收到了来自社会用户论坛/邮件列表的以下回复......
我已经有几年没有使用 SOCI 了,但我确实成功地让存储过程在 SQL Server 上与 ODBC 一起使用,2011 年底,soci 版本 2(我认为)。
我记得要做到这一点,我必须使用语句而不是过程。
我不得不修改后端以循环调用 SQLMoreResults。
我认为 SOCI 不支持输出参数,我直接使用 ODBC 处理它们,我也有一个 C++ 层。
但是,由于我是一名刚毕业的大学毕业生(本月才开始我的第一份工作!)并且相对缺乏 C++ 和数据库应用程序的经验,因此我非常感谢人们能够提供的尽可能多的帮助!例如,关于上述回应——我对最后两点并不十分清楚。