当前位置:  开发笔记 > 编程语言 > 正文

如何将文字文本绑定到SQLite查询?

如何解决《如何将文字文本绑定到SQLite查询?》经验,为你挑选了1个好方法。

我正在尝试在我的iPhone应用程序中使用SQLite C API.我正在尝试查询SQLite数据库以查找在特定日期之后已完成的记录数.数据库将完成的日期保存为文本

YYYY-MM-dd
格式.例如文本
2009-04-10
可能会显示为完成日期.

当我从命令行查询数据库时,我的查询有效,但是当从应用程序运行时,它不会.这是我正在做的事情:

从命令行,我运行此查询:

sqlite> SELECT COUNT(*) FROM tasks WHERE completed > '2009-04-09'
...> go
1

如您所见,有一条记录可以找到.

在我的应用程序中,我执行此代码(显然是用Objective-C编写的):

static sqlite3_stmt *count_tasks_statement = nil;
if(count_tasks_statement == nil) {
    const char *sql = "SELECT COUNT(*) FROM tasks WHERE completed > '?'";

    if (sqlite3_prepare_v2(database, sql, -1, &count_tasks_statement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }
}

NSString *today = @"2009-04-09";
sqlite3_bind_text(count_tasks_statement, 1, [today UTF8String], -1, SQLITE_TRANSIENT);

// Get the row count from the query
NSInteger taskCount = 0;
if(sqlite3_step(count_tasks_statement) == SQLITE_ROW) {

    // The second parameter indicates the column index into the result set.
    taskCount = sqlite3_column_int(count_tasks_statement, 0);
}

// Reset the statement for future reuse.
sqlite3_reset(count_tasks_statement);

当我在此代码上使用调试器并检查taskCount变量时,它被设置为0,表示没有找到任何记录.(如果我更改代码以返回找到的行的主键,它仍然不返回任何内容.)

因为它可以从命令行工作,但不在我的代码中,我假设我在SQL中引用问号或者将文字文本日期绑定到查询时做错了.但是,我尝试了许多不同的方法,没有运气.救命!



1> Bill Karwin..:

不要将参数占位符放在引号内,即使该值是字符串或日期文字.

const char *sql = "SELECT COUNT(*) FROM tasks WHERE completed > ?";

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有