【问题标题】:iPhone, sqlite3, how do I pass values into a select statement?iPhone,sqlite3,如何将值传递到选择语句中?
【发布时间】:2010-10-01 22:19:34
【问题描述】:

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

【问题讨论】:

    标签: iphone sqlite


    【解决方案1】:

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

    我强烈建议使用包装器来简化生活。 http://github.com/ccgus/fmdb 上的 FMDB 非常棒。

    【讨论】:

      【解决方案2】:
          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);
      

      【讨论】:

      • 这是正确的,因为他修复了位置参数。 Grr,我的类似答案首先出现:)
      • + 从我到您的评论和回答 ;)
      【解决方案3】:

      这是设计使然。

      sqlite3_step 为结果集中的每一行返回 SQLITE_ROW,SQLITE_DONE 表示没有更多的行。因此,如果结果集包含 N 行,则 N 次调用将返回 SQLITE_ROW 并且 (N+1)st 返回 SQLITE_DONE。空结果集没有任何特殊之处,它遵循与 N=0 相同的逻辑(因此第一次调用返回 SQLITE_DONE)。这允许客户端代码统一处理所有结果集。

      希望对您有所帮助。

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

      PK

      【讨论】:

        【解决方案4】:

        如果我没看错的话..你没有执行语句..你只是在准备..你必须同时做..

        这部分只是准备查询

        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));
        }
        

        =)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 1970-01-01
          相关资源
          最近更新 更多