2009-09-09 11 views
6

C++アプリケーション(標準C APIを使用)からSQLite(3.6.4)を使用しています。私の質問です:sqlite3_prepare_v2()を使用してクエリを準備し、sqlite3_bind_xyz()を使用してパラメータでバインドされている - 元のSQLクエリを含む文字列を取得する方法はありますか?SQLiteのプリペイドドステートメントから元のSQLクエリを取得

何かがうまくいかない場合は、クエリを印刷したいと思います(デバッグ用 - これは社内の開発者専用テストアプリです)。

例:

sqlite3_prepare_v2(db, "SELECT * FROM xyz WHERE something = ? AND somethingelse = ?", -1, &myQuery, NULL); 
sqlite3_bind_text(myQuery, 1, mySomething); 
sqlite3_bind_text(myQuery, 2, mySomethingElse); 
// .... 

// somewhere else, in another function perhaps 
if (sqlite3_step(myQuery) != SQLITE_OK) 
{ 
    // Here i'd like to print the actual query that failed - but I 
    // only have the myQuery variable 
    exit(-1); 
} 

ボーナスポイント、それはまた、バインドされた実際のパラメータをプリントアウトすることができれば。 :)

答えて

3

sqlite3.c(合併)のコメントに従って、sqlite3_sql(myQuery)は元のSQLテキストを返します。

特定のインデックスで値の境界を見つける機能がありませんが、SQLite関数の標準セットに簡単に追加できます。

const char* sqlite3_bound_value(sqlite3_stmt* pStmt, int index) 
{ 
    Vdbe *p = (Vdbe *)pStmt; 

    // check if &p->aVar[index - 1] points to a valid location. 
    return (char*)sqlite3ValueText(&p->aVar[index - 1], SQLITE_UTF8); 
} 

さて、上記のコードsqlite3_bound_value()が実装されることができる唯一の可能な方法を示しています。それは次のようになります。私はそれをテストしていない、それは間違っている可能性がありますが、それはどのように/開始するための特定のヒントを提供します。文書の引用

+0

返事ありがとう、私はそれを試してみます –

+0

これはあまりにも多くのハッキングをせずに行くことが可能だった限りでした。私が元々望んでいたことをする適切な方法ではないように私は受け入れています。 –

1

:「V2」のインターフェイスで

は、返されるプリペアドステートメント(sqlite_stmtオブジェクト)は、元のSQLテキストのコピーが含まれています。おそらく、これは(あなたが定義する)コールバック関数を呼び出し、パラメータの上に結合したパラメータを含む準備された文(のSQLののchar *であるだろうsqlite3_trace

を使用したい

http://www.sqlite.org/c3ref/prepare.html

関連する問題