0

これは私の場合です。選択クエリで NSString 変数を使用したい:

NSString *arrayThemeList=@"element1, element2, element3";
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: 
                              @"SELECT * from table1 where type IN ?"];

        const char *query_stmt = [querySQL UTF8String];


        if (sqlite3_prepare_v2(contactDB, 
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            sqlite3_bind_text(statement, 1, [arrayThemeList UTF8String], -1, SQLITE_TRANSIENT);

            while (sqlite3_step(statement) == SQLITE_ROW)
            {

               //Do the rest work...

明らかに、ステートメントを使用arrayThemeListしてクエリに使用したいと思います。bind

しかし、これは望んだ結果を与えていないようです、私が間違っていることはありますか? 事前にサンクス:)

4

2 に答える 2

0

変数を IN リストの一部にバインドする場合、IN リストを括弧で囲む必要があり、個別の値ごとに 1 つのプレースホルダー (疑問符) が必要です。

SELECT * FROM table1 WHERE type IN (?, ?, ?);

次に、プレースホルダーごとに 1 つずつ、3 つの個別の値をバインドします。値のリストを単一のプレースホルダーにバインドする方法はありません (ほとんどの SQL DBMS にはありますが、SQLite にもないと思います)。

データを単一の文字列としてのみ取得する場合は、ステートメントを準備する前に SQL をフォーマットする必要があり、準備されたステートメントを異なる値で再利用する機能を放棄し、SQL インジェクションについて心配する必要があります。また、文字列値を扱う場合は、各文字列を一重引用符で囲む必要があります (さらに、埋め込まれた一重引用符を二重にすることでエスケープします)。

于 2012-05-20T15:00:30.123 に答える
0

IN 句には、括弧で囲まれたエントリが必要です。試す:

        NSString *querySQL = [NSString stringWithFormat: 
                          @"SELECT * from table1 where type IN ( ? )"];

また、文字列を囲む必要があるため、最初の行を次のように変更します。

NSString *arrayThemeList=@"'element1', 'element2', 'element3'";

結果のクエリは次のようになります。

SELECT * from table1 where type IN ( 'element1', 'element2', 'element3' )
于 2012-05-20T14:30:46.103 に答える