这是我用来从我的数据库中选择一些记录的代码。我将两个日期绑定到我的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);
答案 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));
}
=)