繁体   English   中英

通过C ++中的SOCI / ODBC实现SQL Server存储过程

[英]SQL Server Stored Procedure via SOCI/ODBC in C++

我正在使用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语法,ODBC call语法等)调用它,但是似乎没有任何效果。 我想知道错误是否从这里回到了这个 ...

如果省略了输入/输出参数,或者为该参数提供了文字,则驱动程序将放弃输出值。

不幸的是,至少就我所知,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来处理它们,而ODBC也具有C ++层。

但是,由于我是应届大学毕业生(本月才刚开始我的第一份工作!)并且相对缺乏C ++和数据库应用程序的经验,所以我将非常感谢人们能够提供的最大帮助! 例如,关于上述答复,我对后两点并不十分清楚。

问题是我使用的是SOCI ODBC,它显然不支持存储过程。

自从我最初问这个问题以来的几个月中,我已经实现了自己的SOCI后端,为此存储过程可以完美地工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM