问题描述
- 移植SQLite3至MIPS不成功:调用sql语句总是产生database is locked
-
近期需将原本跑在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 ", azColName[i], argv[i] ? argv[i] : "NULL"); } printf(" "); 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
解决方案二:
求帮助、解疑,拜托拜托,谢谢……
时间: 2024-09-17 04:39:15