当前位置: 代码迷 >> WinCE >> 请问有关sqlite数据库操作
  详细解决方案

请问有关sqlite数据库操作

热度:186   发布时间:2016-04-28 13:49:08.0
请教有关sqlite数据库操作?
我在wince6.0的基础上嵌入sqlite3数据库,由于我在做一个工业实时监控系统,需要以2次/秒的速度保存数据,但是在操作sqlite3数据库的一小段代码存在一点点BUG,系统连续运行5小时左右就会崩溃,显示“系统出现严重错误,必须被关闭”,经过测试,下面的代码的屏蔽掉程序可连续运行十几天没问题,麻烦大家帮我找找问题,感激不尽,实在没办法了。。

SYSTEMTIME systime; //定义系统结构变量
GetLocalTime(&systime);//获取本地时间
char namev[21]; //这个21应该是个不确定值,怎么获取???
sprintf(namev,"%d/%d/%d %d:%d:%d",systime.wYear,systime.wMonth,
systime.wDay,systime.wHour,systime.wMinute,systime.wSecond); //日期转换

int rc;
sqlite3_stmt *stat;  
initDataBase(); //打开数据库
char exec[2048]="", insert_id[32]=""; 
sprintf(exec, "INSERT INTO [software] ([时间],[型号],[臂长],[倍率],[重量],"
"[重量M],[幅度],[高度],[力矩],[回转],[风速]) VALUES(?,?,?,?,?,?,?,?,?,?,?);");
rc = sqlite3_prepare(dbk, exec, -1, &stat, 0);
rc = sqlite3_bind_text(stat, 1, namev, -1, NULL);//数据写入
rc = sqlite3_bind_text(stat, 2, pChar8,-1, NULL);
rc = sqlite3_bind_text(stat, 3, pChar9,-1, NULL);
rc = sqlite3_bind_text(stat, 4, pChar10,-1,NULL);
rc = sqlite3_bind_text(stat, 5, pChar2,-1, NULL); 
rc = sqlite3_bind_text(stat, 6, pChar3,-1, NULL);
rc = sqlite3_bind_text(stat, 7, pChar4,-1, NULL);
rc = sqlite3_bind_text(stat, 8, pChar1,-1, NULL);
rc = sqlite3_bind_text(stat, 9, pChar5,-1, NULL);
rc = sqlite3_bind_text(stat, 10,pChar6,-1, NULL);
rc = sqlite3_bind_text(stat, 11,pChar7,-1, NULL);
rc = sqlite3_step(stat);  
rc = sqlite3_finalize(stat);
sprintf(insert_id, "%ld", sqlite3_last_insert_rowid(dbk));
closeDatabase();


------解决方案--------------------
char namev[21]; //这个21应该是个不确定值,怎么获取???
sprintf(namev,"%d/%d/%d %d:%d:%d",systime.wYear,systime.wMonth,
systime.wDay,systime.wHour,systime.wMinute,systime.wSecond); //日期转换

你把这个namev数组定义大一些试试,比如256,时间正常时刚好4+1+3*5=20字节,要是GetLocalTime(&systime)返回时间异常,就会数组越界。改大之后你可以在后面输出调试信息,把strlen(namev)打印出来。

另外,用到的字符串数组都初始化为0,如namev[21]={0},还有pChar8等等。
sqlite以字符串进行操作,这样更安全。

systime也初始化为0。


------解决方案--------------------
还看到一处,你也确认一下:

sqlite3_stmt *stat; 没有为stat声明空间,sqlite3_bind_text这些函数会对stat指针指向的内容赋值吧,

你应该改成这样
sqlite3_stmt st = {0};
sqlite3_stmt *stat = &st;

或者

sqlite3_stmt *stat = malloc(sizeof(sqlite3_stmt));
sqlite3_finalize(stat)之后在free掉。


------解决方案--------------------
rc = sqlite3_prepare(dbk, exec, -1, &stat, 0);已经对stat赋值了
需要对函数返回值rc做判断,如果失败了,输出错误日志
程序崩溃时,有没有提示错误发生的地址,串口输出有没有有用的信息?
楼主可以debug方式让程序长时间运行,出错时会停下来且有提示
  相关解决方案