iPhone,sqlite3,如何将值传递给select语句?

时间:2010-10-01 13:11:07

标签: iphone sqlite

这是我用来从我的数据库中选择一些记录的代码。我将两个日期绑定到我的sql中,但是,当我到sqlite3_step时,我得到SQLITE_DONE,我应该得到SQLITE_ROW。看起来它处理绑定而不是查询数据。

我做错了什么?

NSString *startDateRangeString = @"2000-05-01";
NSString *endDateRangeString = @"2011-05-01";

sqlite3 *database;
int result = sqlite3_open("mydb.db", &database);
if(result != SQLITE_OK)
{
    NSLog(@"Could not open db.");
}

const char *sql = "select pid from tmp where due >= '%@' and due < '%@' order by due, pid;";
sqlite3_stmt *statementTMP;

int error_code = sqlite3_prepare_v2(database, sql, -1, &statementTMP, NULL);
if(error_code == SQLITE_OK) {

    sqlite3_bind_text(statementTMP, 1, [startDateRangeString UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(statementTMP, 2, [endDateRangeString UTF8String], -1, SQLITE_TRANSIENT);

    int step_error_code = sqlite3_step(statementTMP);

    while(sqlite3_step(statementTMP) == SQLITE_ROW) // I get 101 aka SQLITE_DONE
    {
        NSLog(@"Found!!");
    }
}
sqlite3_finalize(statementTMP);
sqlite3_close(database);

4 个答案:

答案 0 :(得分:3)

我认为你的SQL很糟糕。而不是%@你应该使用?对于位置参数。

我强烈建议使用包装器来简化生活。 FMDB是一个很棒的http://github.com/ccgus/fmdb

答案 1 :(得分:1)

    char *statementTMP = "select pid from tmp where due >= '?1' and due < '?2' order by due, pid";
....
    sqlite3_bind_text(statementTMP, 1, [startDateRangeString UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(statementTMP, 2, [endDateRangeString UTF8String], -1, SQLITE_TRANSIENT);

答案 2 :(得分:0)

这是设计的。

sqlite3_step为结果集中的每一行返回SQLITE_ROW,并使用SQLITE_DONE指示不再有行。因此,如果结果集包含N行,则N次调用将返回SQLITE_ROW,而(N + 1)st返回SQLITE_DONE。空结果集在任何方面都不是特殊的,它遵循N = 0的相同逻辑(因此第一个调用返回SQLITE_DONE)。这允许客户端代码统一处理所有结果集。

希望有所帮助。

如果您需要帮助,请告诉我。

<强> PK

答案 3 :(得分:-1)

如果我读得正确..你没有执行声明..你只是在准备......你必须做两件事..

这部分只是准备查询

if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK) 
{
            NSLog(@"SQL Warning: failed to prepare statement 
with message '%s'.", sqlite3_errmsg(database));
}

这部分实际执行查询

if(sqlite3_exec(database, sql, nil, &stmt, &errmsg) == SQLITE_OK)
{
        NSLog(@"it means that you query executed correctly"); 
        if(sqlite3_step(stmt) == SQLITE_ROW)
        {
             NSLog(@"Found!!");
        }
}else 
{
        NSLog(@"SQL Warning: '%s'.", sqlite3_errmsg(database));
}

=)