近期需将原本跑在ARM上面的程序移植到MIPS上,该程序调用到SQLite3的API。其中使用sqlite3_open及sqlite3_close是可以的,但是使用sqlite3_get_table和sqlite3_exec去执行sql语句(比如"select * from devices")却总会报“database is locked”的错误。
从网络得知该错误是指不能同时对一个表进行写操作,但是我使用的测试用的程序(源码见末尾)里并没有使用多线程这样的可能引起错误的诱因。而使用官方源码包里的sqlite3命令行程序,去执行sql语句时同样会产生这样的错误,而使用里面.read命令则可以顺利将整个数据库的数据读出。
使用的SQLite3包是从SQLite官网下载的,版本为3.8.11.1。还望各位能给予指导,告知解决方法。谢谢。
P.S. :最终要移植的程序、这份测试用源码、实际使用的数据库,在ubuntu和ARM上都能正常运行,在MIPS上使用时也有给予读写权限,应该不是这方面的问题。
附测试用程序源码:
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK)\
{printf("%s error!/n",szInfo);\
printf("%s/n",szErrMsg);\
sqlite3_free(szErrMsg);\
sqlite3_close(db);\
return 0;}
int main(int argc, char * argv[])
{
sqlite3 *db;
char *dbPath="test.db";
char *szErrMsg = 0;
int rc= sqlite3_open(dbPath, &db);
//CHECK_RC(rc,"open database",db);
char *szSql="create table UserInfo(ID int primary key , UserName char, PassWord char);";
rc=sqlite3_exec(db,szSql,0,0,&szErrMsg);
CHECK_RC(rc,"create table",szErrMsg,db);
rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(1,'kfqcome','123456')",0,0,&szErrMsg);
CHECK_RC(rc,"insert info",szErrMsg,db);
rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(2,'miss wang','654321')",0,0,&szErrMsg);
CHECK_RC(rc,"insert info",szErrMsg,db);
szSql="select * from UserInfo";
rc = sqlite3_exec(db,szSql, callback, 0, &szErrMsg);
CHECK_RC(rc,"query values",szErrMsg,db);
sqlite3_close(db);
getchar();
return 0;
}
SQLite3::BusyException: database is locked:
解决django的sqlite3的database is locked
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。