sqlite3,使用递归select ,sqlite3_step会发生 Access violation

小笨象 2009-02-20 12:54:21

ELESQLiteFWTable *SQLFWTable = new ELESQLiteFWTable(DBName); //封装了一下sqlite3
AnsiString SQL = AnsiString().sprintf("SELECT * FROM %s "
" WHERE ParentID = %d and Deleted <> %d "
" ORDER BY SortID",
G_TABLENAME,iParentID,NTDF_DELETED);

if(SQLFWTable->IsOpened && SQLFWTable->ExecSelect(SQL))
{
do
{
iTid = SQLFWTable->FieldByNameAsInteger("TID");
m_TreeValueList->Add(NodeTitle);
MakeChTreeEx(DBName,iTid,iTreeLevel+1); //递归调用。
}while(SQLFWTable->Next());//这个NEXT函数就是调用sqlite3_step来取下一条数据。
}
SQLFWTable->CloseDB();
delete SQLFWTable;
SQLFWTable = NULL;


当递归进去一次,返回时,就会出错。而且可以定位到是sqlite3_step出错,而且用try无法捕获。
但如果不递归,则一点问题都没有。请教哪位遇到过这样的问题?是否有什么解决的方法?
谢谢了。
...全文
911 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小笨象 2009-03-03
  • 打赏
  • 举报
回复
不好意思,点错了。
请xdxiaofeng 和 ACMAIN_CHM 到这个贴子拿分。
http://topic.csdn.net/u/20090303/12/68454a05-abcf-4215-895c-4d3f2f00e1f2.html
小笨象 2009-02-27
  • 打赏
  • 举报
回复
还有这样的事。。。。
那也太郁闷了。。。。
只好变着法子来做了。
谢谢您了。
帖子不能编辑 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zxjrainbow 的回复:]
那我想请问一下,如果这样,那岂不是所谓的同时多个线程读取成了一句空话?
那有什么办法可以处理这种情况呢。
而且我在编译sqlite3.dll的时候,已经加上#define SQLITE_THREADSAFE  1 了。
按理应该是可以同时读取的吧?
谢谢。
[/Quote]
可以同时读取不同的表格阿.
SQLITE_THREADSAFE只是保证有多个线程同时访问数据库文件的时候,它们
不会破坏数据库文件.比如说,一个线程正在写,另外一个线程又插进来写,
这样数据库文件中的数据不就被破坏了?
小笨象 2009-02-25
  • 打赏
  • 举报
回复
现在,发现在同一个程序中,不同的窗体打开sqlite3_open同一个文件,然后最后一个关闭时,也会出现AV错误。。。
为何呢?
小笨象 2009-02-23
  • 打赏
  • 举报
回复
那我想请问一下,如果这样,那岂不是所谓的同时多个线程读取成了一句空话?
那有什么办法可以处理这种情况呢。
而且我在编译sqlite3.dll的时候,已经加上#define SQLITE_THREADSAFE 1 了。
按理应该是可以同时读取的吧?
谢谢。
帖子不能编辑 2009-02-23
  • 打赏
  • 举报
回复
我来告诉你原因:
sqlite数据库中锁有两种,一种是事务级的,用来同步多个句柄同时访问数据库的。
另一种是表上的。

当你用sqlite3_open,PrepareSQL,sqlite3_step打开一个表以后,在这个表上sqlite就加了一把锁,
因为sqlite在这个表上要保护打开状态的游标。
在你Finalize之前, 是不能再执行sqlite3_open,PrepareSQL,sqlite3_step打开这个数据库的。


小笨象 2009-02-20
  • 打赏
  • 举报
回复
我动态调用sqlite3.DLL,然后sqlite3_open,PrepareSQL,sqlite3_step,最后sqlite3_reset,然后Finalize。
ACMAIN_CHM 2009-02-20
  • 打赏
  • 举报
回复
要看你的这个类中具体用什么打开SQLITE了,否则很难猜为什么。
小笨象 2009-02-20
  • 打赏
  • 举报
回复
而且我只是select,期间绝对不会对数据库的内容进行修改。所以应该不存在锁的问题。
可是google了一遍,也没找到原因,更不要说解决的方法了。
小笨象 2009-02-20
  • 打赏
  • 举报
回复
当我查不到数据的时候,我就会使用m_Sqlite3Imp.sqlite3_finalize(Statement);来释放。并没有报错。
我不知道锁出问题的时候,会是什么情况。
您能说说吗?
ACMAIN_CHM 2009-02-20
  • 打赏
  • 举报
回复
会不会和锁有关?

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧