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-users フォーラム/メーリング リストから次の応答を受け取りました...
私はSOCIを数年間使用していませんが、2011年末のsociバージョン2のSQL Serverでストアドプロシージャを正常にODBCで動作させることができました(私はそう思います)。
それを行うには、プロシージャではなくステートメントを使用する必要があったことを覚えています。
ループで SQLMoreResults を呼び出すようにバックエンドを修正する必要がありました。
SOCI ではサポートされていないと思われる出力パラメーターを ODBC で直接処理しましたが、その上に C++ レイヤーもありました。
しかし、私は最近大学を卒業したばかりで (今月最初の仕事を始めたばかりです!)、C++ とデータベース アプリケーションの経験が比較的少ないため、できるだけ多くの支援を提供していただければ幸いです。たとえば、上記の回答に関しては、最後の 2 点がはっきりとわかりません。