却发现:
The sqlITE_MISUSE error code is returned when you misuse the sqlitelibrary in some way. sqlite does not guarantee that it will detectmisuse,so you should not depend on this behavior in any way. ThesqlITE_MISUSE error code is intended to help you find the bugs inyour code.
Here are some possible causes of sqlITE_MISUSE:
- Calling any API routine with an sqlite3* pointer that was not obtained from sqlite3_open() or sqlite3_open16() or which has already been closed by sqlite3_close().
- Trying to use the same database connection at the same instant in time from two or more threads.
- Calling sqlite3_step() with a sqlite3_stmt* statement pointer that was not obtained from sqlite3_prepare() or sqlite3_prepare16() or that has already been destroyed by sqlite3_finalize().
- Trying to bind values to a statement (using sqlite3_bind_...()) while that statement is running.
这是sqlite官网上给出的问题解释。
1. 调用API所用到的指针,第一种情况是没有从sqlite3_open()或者是sqlite3_open16()获得,第二种情况是sqlite3_close()函数已经将数据库关闭了。我是第二种情况。
2. 两个或者更多的线程同时访问该数据库。对于这样的问题,可以通过加上锁进行解决。
3. sqlite3_step()所用到的变量statement指针,第一种情况是该指针不是从sqlite3_prepare()或者是sqlite3_open16()获得的,第二种情况是该指针已经被销毁或者被释放。这个和1中的情况是一样的,不同的是使用这种指针的函数,两者可以和为一种情况。
4.试图将values绑定到一个正在运行的statement上。该解释未遇到。(本人遇到:在statement绑定bind值后未reset就又重新对statement绑定bind值)
===================================================================
1个回答
<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal,li.MsoNormal,div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
在对sqlite3 insert into等操作时速度比较慢。
原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。
解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
接口:事务的操作没有特别的接口函数,就是一个普通的sql语句而已,分别如下:
intret; |
例程:在进行大量的操作前使用如下语句
ret); |
开发过程遇到这样的问题:
分别对两个数据库文件的不同表进行操作,执行顺序为:open db A->begin trasaction->open db B->select from db B->close db B->select from db A->rollbak or commit->close db A
测试发现,select from db B这一步会出错,错误信息为library routine called out of sequence,出错后执行rollback,这一步也会报错。
原来以为原因是:开始一个事务只能对一个数据库进行操作。
测试发现,即使不开始事务,执行顺序为:open db A->open db B->select from db B->close db B->select from db A->close db A,仍会出现ibrary routine called out of sequence的错误。
今天发现,以上出错原因可能是总控程序和子程序的全局变量一致(都是sqlite3 *db),导致总控程序的全局变量被修改。
具体还需进一步研究。
sql Error:library routine called out of sequence.
在Lazarus+ZEOSDBO连接数据库后,进行打开、修改操作sqlite数据库,本机运行正常,
可是在测试机上一跑,老是提示“sql Error:library routine called out of sequence.”
以为是动态库的问题,鼓捣了好长时间,才发现是自已把数据库路径设为绝对路径,
它当然找不到数据库了,设为相对路径后,运行OK!