1

ここでの提案の後、クエリに渡される値をバインドしようとしましたが、構文エラーが発生し続けます:error: near "?":誰かが理由を説明できますか?

NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"banklist" ofType:@"sqlite3"];
    if(sqlite3_open([sqLiteDb UTF8String], &_database) == SQLITE_OK)
    {
        {
            // prep statement
            sqlite3_stmt    *statement;
            NSString *querySQL = @"UPDATE ? SET recipe_name=? WHERE cell_id=?";
            NSLog(@"query: %@", querySQL);
            const char *query_stmt = [querySQL UTF8String];

        // preparing a query compiles the query so it can be re-used.
        sqlite3_prepare_v2(_database, query_stmt, -1, &statement, NULL);
        sqlite3_bind_text(statement, 1, [del.dayName UTF8String], -1, SQLITE_STATIC);
        sqlite3_bind_text(statement, 2, [info.name UTF8String], -1, SQLITE_STATIC);
        sqlite3_bind_int(statement, 1, del.tableRowNumber);

        // process result
        if (sqlite3_step(statement) != SQLITE_DONE)
        {
            NSLog(@"error: %s", sqlite3_errmsg(_database));
        }

        sqlite3_finalize(statement);
    }

    {
        // prep statement
        sqlite3_stmt    *statement;
        NSString *querySQL = @"UPDATE ? SET recipe_id = (SELECT key FROM recipes WHERE name = ?.recipe_name)";
        NSLog(@"query: %@", querySQL);
        const char *query_stmt = [querySQL UTF8String];

        // preparing a query compiles the query so it can be re-used.
        sqlite3_prepare_v2(_database, query_stmt, -1, &statement, NULL);
        sqlite3_bind_text(statement, 1, [del.dayName UTF8String], -1, SQLITE_STATIC);
        sqlite3_bind_text(statement, 2, [del.dayName UTF8String], -1, SQLITE_STATIC);

        // process result
        if (sqlite3_step(statement) != SQLITE_DONE)
        {
            NSLog(@"error: %s", sqlite3_errmsg(_database));
        }

        sqlite3_finalize(statement);
    }
}

sqlite3_close(_database);
4

2 に答える 2

2

SQL の値には使用sqlite3_bind_xxxしますが、テーブル名には使用しません。stringWithFormatテーブル名と値に使用する必要がsqlite3_bind_xxxあります。

于 2013-09-04T22:46:48.400 に答える
1

?クエリのそれぞれに値をバインドする必要があります。関数の 2 番目のパラメーターsqlite3_bind_xxxはインデックス番号です。これらは 1 ベースのインデックスです。

?最初のクエリでは、最初の 2 回に値をバインドします。おそらく、呼び出しをの代わりにインデックスとしてsqlite3_bind_int渡すように変更する必要があります。31

sqlite3_bind_int(statement, 3, del.tableRowNumber);

もう 1 つの考えられる問題はsqlite3_bind_text、テーブル名に を使用することです。これにより、テーブル名が引用符で囲まれます。Rob が提案したように、文字列形式を使用してテーブル名を適用するsqlite3_bind_xxx必要がありますが、クエリで必要な実際の値には使用してください。

于 2013-09-04T22:46:49.957 に答える