简体   繁体   English

为什么我会收到sqlite3error?

[英]Why I am getting sqlite3error?

I am trying to reuse an sqlite statement in my application in a method. 我试图以一种方法在我的应用程序中重用sqlite语句。 Here's the relevant code 这是相关的代码

if(getsets_statement == nil){
    const char *sql = "SELECT DISTINCT num,roll FROM mytable WHERE cls like ? and divname like ?";
    if(sqlite3_prepare_v2(database, sql, -1, &getsets_statement, NULL) != SQLITE_OK){
        NSAssert1(0, @"Error: Failed to prepare stmt with message '%s'", sqlite3_errmsg(database));
    }       
}

sqlite3_bind_text(getsets_statement, 1, [cls UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(getsets_statement, 2, [divname UTF8String], -1, SQLITE_TRANSIENT);

while(sqlite3_step(getsets_statement) == SQLITE_ROW){

    setNumber= sqlite3_column_int(getsets_statement, 0);        

    roll = sqlite3_column_int(getsets_statement, 1);

    [numArr addObject:[NSNumber numberWithInt:setNumber]];
    [rollArr addObject:[NSNumber numberWithInt:roll]];
}

sqlite3_reset(getsets_statement);

The statement executes perfectly the first time it is called. 该语句在首次调用时完美执行。 But the next time I call this method, I get a sqlite3error . 但是,下次我调用此方法时,将收到sqlite3error The values of divname and cls are present (did an NSLog and checked) but I don't understand why I am getting this error. 存在divnamecls的值(已检查并记录了NSLog ),但我不明白为什么会收到此错误。 I get the error at the first bind_text statement. 我在第一个bind_text语句中收到错误。

This is in the gdb console 这在gdb控制台中

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) where
#0  0x9041857f in sqlite3Error ()
#1  0x9041acea in vdbeUnbind ()
#2  0x9041b2c8 in bindText ()

Any help? 有什么帮助吗?

Make sure nothing else is actually the issue (is the database being closed somewhere else? Is the getsets_statement pointing to the same object? Has it been finalized?). 确保实际上没有其他问题(数据库是否在其他地方关闭了? getsets_statement是否指向同一对象?它是否已完成?)。 Then try using NULL or SQLITE___STATIC instead of SQLITE_TRANSIENT. 然后尝试使用NULL或SQLITE___STATIC代替SQLITE_TRANSIENT。 Since [NSString UTF8String] returns data that doesn't need to be freed (by you), it obviously doesn't need a destructor, and it will stay valid until after your function exits, at which time you're done running the statement anyway. 由于[NSString UTF8String]返回不需要释放的数据(您自己),因此它显然不需要析构函数,并且它将保持有效,直到函数退出后(此时您已完成运行语句)无论如何。

I believe you need to call sqlite3_reset and sqlite3_clear_bindings on the prepared statement before attempting to reuse it. 我相信您在尝试重用它之前, 需要在准备好的语句上调用sqlite3_resetsqlite3_clear_bindings Also, you should really check your return codes. 另外,您应该检查一下返回码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM