-1

为了更新表,我写了::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);
    }
4

3 回答 3

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

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

于 2012-11-20T14:05:53.807 回答
0

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

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

此外,对于此类单行请求,您可以使用 sqlite3_exec() 函数:

sqlite3_exec(ipadSites, query_stmt, NULL,NULL, NULL);
于 2012-11-20T13:51:04.507 回答
0

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

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

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

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

于 2012-11-20T15:39:33.433 回答