2011-10-10 7 views
0

私は、カラムの1つに複数のカンマ区切りの値があるSQLテーブルを持っています。以下のコードは、すべての値を調べ、特定の値がリストにある場合はtrueを返しますが、エントリの最初の値以外の値でしか機能しないようです。私がどこで悩んだのかについてのアイデアは?クエリは、sqlite3を使用してデータベースファイル上で直接実行するとうまく動作するので、問題はこの関数にあると確信しています。CプログラムからのSQLiteクエリのデバッグ

bool group_exists(char *group) 
{ 
    int retv; 
    char *param_1, *param_2; 
    bool exists = false; 
    sqlite3_stmt *p_stmn; 

    param_1 = malloc(BUFFER_SIZE); 
    param_2 = malloc(BUFFER_SIZE); 

    sprintf(param_1, "%s,%%", group); 
    sprintf(param_2, "%%,%s,%%", group); 

    sqlite3_prepare_v2(db, "SELECT groups FROM users WHERE groups LIKE ? OR groups LIKE ?", -1, &p_stmn, NULL); 
    sqlite3_bind_text(p_stmn, 1, param_1, -1, NULL); 
    sqlite3_bind_text(p_stmn, 1, param_2, -1, NULL); 
    retv = sqlite3_step(p_stmn); 

    if (retv == SQLITE_ROW) { 
     exists = true; 
    } else if (retv != SQLITE_DONE) { 
     retval_crash(); 
    } 

    free(param_1); 
    free(param_2); 
    sqlite3_finalize(p_stmn); 

    return exists; 
} 
+0

コンマは必要ですか? '?' 'なしでsqlite3で使用した期待された/働いているクエリを表示して、達成しようとしているような文を理解できます。 SQLite_OK](http://www.sqlite.org/c3ref/c_abort.html)の 'sqlite3_prepare_v2'を確認してください。 – Joe

+0

クエリは"グループが好きなグループからのSELECTを選択します '、foobar 、% 'OR groups LIKE' foobar、% '"foobarは私がチェックしているグループです。問題は、フィールドに値のコンマ区切りのリストが含まれており、 'foobar'が 'foo、foobarba'と一致しないようにすることです。私はSQLiteから文字列全体を取得してC言語でマッチングするのはおそらくもっと控え目だが、それはコードの他の部分を複雑にするので、代わりにこれを修正したいと思っている。 – befuddled

+0

*問題は、フィールドにカンマで区切られた値のリストが含まれていることです。*すぐそこに停止し、*値*の後にピリオドを入れます。即座に 'sqlite3_bind_text'インデックスの問題を乗り越えたら、あなたのスキーマを見直したいかもしれません。 –

答えて

0

インデックスを正しいsqlパラメータにバインドしてください。また

sqlite3_bind_text(p_stmn, 1, param_1, -1, NULL); 
sqlite3_bind_text(p_stmn, 2, param_2, -1, NULL); 

すべてが成功していることを確認するresult codesを確認してくださいデバッグのsqliteにしようとしています。

+0

ありがとう!私はこのコードをあまりにも長く注視した後で気付かなかったとは思えません。 – befuddled

+0

上記のコメントで私の質問で分かるように、私はそれを逃しました。各メソッドのドキュメントを見て、「2番目の引数は設定するSQLパラメータのインデックスです。最も左のSQLパラメータのインデックスは1です。 – Joe