为了更新表,我写:: 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);
}
答案 0 :(得分:1)
您应该在准备好的语句中使用"?"
并使用sqlite3_bind_text
然后绑定字符串值,而不是使用stringWithFormat
和%@
。这样,您将阻止SQL注入以及SQL请求中的安全问题(例如,如果您的字符串包含引号或其他内容)。
对于您的问题,请比“它不起作用”更准确。它是否返回错误代码,在哪种情况下哪一个?它是否以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
方法将两个值绑定到查询。这是一种更安全的方法。它负责正确引用和转义值。