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

sqlite3_bind_xxx在 SQL 中使用值,但不用于表名。您必须使用stringWithFormat表名和sqlite3_bind_xxx值。

于 2013-09-04T22:46:48.400 回答
1

您需要为?查询中的每个绑定一个值。该sqlite3_bind_xxx函数的第二个参数是索引号。这些是基于 1 的索引。

在您的第一个查询中,您将一个值绑定到第一个?两次。您可能需要更改sqlite3_bind_int调用以3作为索引而不是1.

sqlite3_bind_int(statement, 3, del.tableRowNumber);

另一个可能的问题是您sqlite3_bind_text对表名的使用。这会将表名放在引号中。正如 Rob 所建议的,您应该使用字符串格式来应用表名,但使用sqlite3_bind_xxx查询中需要的实际值。

于 2013-09-04T22:46:49.957 回答