2009-02-24 7 views
9

私はsqlite3ライブラリを使用するいくつかのC++コードを書いています。実行時に変数をバインドするプリペアドステートメントを使用しています。sqlite prepared statements - デバッグ方法

バインド後に文のSQLクエリを調べるにはどうすればよいですか?

たとえば、次のコードは行を返しません。 premade文字列とsqlite3_execを使用するとき、私は期待した結果を得ます。

sqlite3_stmt *statement; 
const char *query = "SELECT * FROM foo WHERE (name='?');"; 
sqlite3_prepare_v2(db, query, strlen(query), &statemtnt, NULL); 
sqlite3_bind_text(statement, 1, "bar", -1, SQLITE3_STATIC); 
int result = sqlite3_step(statement); 
// expected: result = SQLITE_ROW 
// actual: result = SQLITE_DONE 

編集:上記のクエリの問題は?の前後の引用符です。しかし、将来は、実行される実際のクエリに対してsqlite3_stmtを調べる方法を知りたいと思っています。

答えて

1

sqlite3_bind_textの3番目のパラメータは、バインドしたい値になっています。コード内で、クエリをバインドしようとしています。

また、SELECTの最後にセミコロンをなくしてください。

+0

申し訳ありませんが、タイプミスがありました質問を書くときに。 それは本当の問題ではありません、ごめんなさい –

+0

私はセミコロンが必要と信じています –

6

バインド後にSQLクエリが変更されない - 変数がSQL文字列などに挿入されない。

ニールが言ったことに加えて、?プレースホルダ:

"SELECT * FROM foo WHERE name = ?" 

それ以外の場合は、SQLiteは疑問符を置き換えず、文字列 "?"として扱います。

+1

ありがとう、問題は確かに周りの引用符でしたか? –

+0

私はSQLの文字列が変わらないことを知っています(私はそれをconst宣言しました)。しかし、その声明は変更されます。ステートメントを見てバインディングの後にどのようなクエリがDBに行くのか確認する方法はありますか? –

+0

あなたは、SQLiteによって生成された解析木を検査することを意味しますか?私はあなたがSQLiteのソースコードを掘り下げることなくそれを行うことができるとは思わない... –

-1

実際のクエリはログに記録されているかもしれませんが、スイッチを入れてログに記録できるかもしれません。

1

はい、あなたはこのようにプロファイル関数を定義することによってそれを行うことができます。

static void profile(void *context, const char *sql, sqlite3_uint64 ns) { 
fprintf(stderr, "Query: %s\n", sql); 
fprintf(stderr, "Execution Time: %llu ms\n", ns/1000000);} 

を次にあなたがsqlite3_open使用してデータベースを開いた直後に、この呼び出しを行います。

sqlite3_profile(fDBLink, &profile, NULL); 
+0

私はこれを試した。 opが望むように、バインディングの結果は表示されません。 – kasterma

+0

良い提案ですが、バインドされた引数は表示されません – inversus

関連する問題