sqlite3:用于更新表的SQL语句不起作用

时间:2012-11-20 13:32:38

标签: iphone objective-c ios ipad sqlite

为了更新表,我写:: update set = \“%@ \”WHERE = \“%@ \”“,col1Value,col2Value];

但是,这不起作用。请帮忙。

我的代码如下:

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    NSString *querySQL = [NSString stringWithFormat:@"UPDATE AssemblyAssessment SET countedunits=\"%@\" WHERE assemblyid=\"%@\"",self.SAcountedunits,self.asmbIdStr];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(ipadSites,query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {

            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                NSLog(@"done...");

            }
            else
            {
                NSLog(@"not done...");
            }


        sqlite3_finalize(statement);
        sqlite3_close(ipadSites);
    }

3 个答案:

答案 0 :(得分:1)

  1. 您应该在准备好的语句中使用"?"并使用sqlite3_bind_text然后绑定字符串值,而不是使用stringWithFormat%@。这样,您将阻止SQL注入以及SQL请求中的安全问题(例如,如果您的字符串包含引号或其他内容)。

  2. 对于您的问题,请比“它不起作用”更准确。它是否返回错误代码,在哪种情况下哪一个?它是否以OK状态返回,但您的数据库无法正常工作?你的变量有哪些类型?您的临时变量(如querySQL)的值是什么,您是否尝试在代码中放置断点以检查发生了什么?等等

答案 1 :(得分:0)

什么不能正常工作。您可以尝试打印如下错误消息:

NSLog(@"%s",sqlite3_errmsg(ipadSites));

另外,对于这样的单行请求,您可以使用sqlite3_exec()函数:

sqlite3_exec(ipadSites, query_stmt, NULL,NULL, NULL);

答案 2 :(得分:0)

您发布的代码显示您获取了数据库文件的路径,但没有用于打开数据库的代码。在尝试准备语句或执行查询之前,需要调用sqlite3_open_v2

使用字符串格式构建查询也是一个坏主意。您的查询应该是:

const char *query_stmt = "UPDATE AssemblyAssessment SET countedunits = ? WHERE assemblyid = ?";

准备该语句,然后使用适当的sqlite3_bind_xxx方法将两个值绑定到查询。这是一种更安全的方法。它负责正确引用和转义值。