之前为了使用sqlite找了好多资料,最后发现都不尽人意,起初为了让能够把select * from table所有数据显示在list上,结果费了好大的功夫,最开始用回掉函数,但是它必须用static声明,这就产生了非常大的麻烦。花了一下午结果就是未果。放弃了,换了第二种方法,sqlite3_get_table;
这种方法虽然很麻烦,但是当时确实是实实在在的解决了我的问题。
昨天在想一个问题,为什么我每操作一次数据库都要有打开关闭的操作,我在想是不是应该在程序启动时打开,结束时关闭呢?
然后把自己写好风装好的MysqLite类给大改了一番,f5调试的时候是一点问题都没有的,一切正常,但是在生成后在dubug目录下双击运行时却出现了莫名其妙的错误,我把代码一段段注释掉,最后发现问题出在m_list.SetItemText(i,j,sql.m_data[(i+1)*(sql.m_col)+j+1]);这句话上
这句话还是敏思苦想了好久才想到的办法,因为表中第一列是id,我觉得没用,就想了各种方法去把他屏蔽掉。无奈知识面有限,不知道有没有更简单的办法。
说多了,总之就是上面这句代码出的问题,把它屏蔽掉之后再试就正常。不知道这是什么情况,如果说是下标越界的话早在f5的时候应该就暴漏出来了才对,但是这问题,,我还是不知道怎么回事。
sqlite3 *db = NULL; sqlite3_stmt *stmt; sqlite3_open("xx.db",&db); char * errMsg = NULL; sqlite3_prepare(db,"select * from table;",-1,&stmt,0); int rc = sqlite3_step(stmt); while(rc == sqlITE_ROW){ CString type = sqlite3_column_text(stmt,0); CString name = sqlite3_column_text(stmt,1); rc = sqlite3_step(stmt); } sqlite3_finalize(stmt); sqlite3_close(db);
这段代码就是刚查资料后找到的,原来相应的借口函数sqlite3也是有提供的,使用这个更好些。
sqlite3_step执行后返回的结果,如果是update,delete,insert等语句,正常应该返回 sqlITE_DONE ;如果是select语句,且有还有记录,则应该返回sqlITE_ROW;
sqlite3_prepare,它用来准备一条语句,存放在sqlite3_stmt上,step可以理解为单步执行,sqlite3_exec其实就是对sqlite3_prepare_v2,sqlite3_step()和sqlite3_finalize()的封装
未完待续
参考资料:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html