VC+SQLite 使用笔记

首先我们要说的是建表和插入操作

首先关于利用sqlite建立数据库建立表我就不在此多说了,baidu,google可以很明确的告诉您,还可以通过sqlite官方网站进行查询,虽然都是english的,小弟也看的不是很懂。呵呵。不过很容易建立哦;
当然使用sqlite3需要的头文件及lib文件可以去官网下载,有很多demo可以参考建立新的数据库;

当一个新的数据库建立好后,我们就需要在数据库中建表了,就如我们买了房子要装修一样(个人感觉),装修完了是不是要为房间增加家具呢,那么此时我们就需要填充数据了。

我们主要针对的插入的数据类型的BLOB字段(BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。)
插入此类型数据与其他类型不一样的是,它需要先利用“?”占位,之后通过sqlite的sqlite3_prepare_v2,sqlite3_bind_blob,最后就是通过一个sqlite3_step来执行我们要通过sql的操作了。
举个例子:
本帖隐藏的内容
char sql1[50];
sqlite3_stmt *stat = NULL;                                        //定义一个sqlite3_stmt类型指针(baidu有说明)
sprintf(sql1, "insert into table values('%d',?)",key);     //?就代表你要插入的二进制对象
int result = sqlite3_prepare_v2 ( db,                          //准备好插入语句的绑定(个人理解)
                                sql1, 
                                -1,  
                                &stat, 
                                0  
                              );

if(result == SQLITE_OK)                                            //prepare成功
{
        sqlite3_bind_blob(stat, 1, pStr, nSize, NULL);  //pStr指向了你要插入的二进制数据的首地址,nSize表示你要插入的数据的大小
        sqlite3_step(stat);    //执行插入操作
        sqlite3_reset(stat);   //重置stat对象
}
else
{
        sqlite3_reset(stat);
        sqlite3_free(stat);  
        printf("开始出线错误位置:%d\t错误代码%d\n",i,result);    //错误代码可以在baidu、google查询相应说明
}


在我们插入数据的时候我们会遇到这样一个问题,那就是我们插入的数据量过大的时候要花费我们很长时间,

如我要插入的数据是600W条,我第一次进行这样插入的时候,我执行了24个小时,才插入了几十万,按照这样

来算的话,那么我要插入这些数据或者更多的话,这样的时间怎么承受的了,于是我就在网上查找了下解决方案,

不出所料,还真的存在,就是增加“ sqlite3_exec(db, "PRAGMA synchronous = OFF; ", 0,0,0); ”这么

一条语句,你的执行速度会增加大约50倍(当然是网上说的,不过个人使用发现是相当快了。)

注:小弟在插入操作的时候遇到了点问题,那就是插入操作正确执行,但是数据没有全插进去,这个问题我调试了很久

通过插入操作的返回值,在网上查询发现是sql语句的错误,当时怎么看sql语句都感觉没问题,当然,我对sql语句并不了解

但是感觉我前面的都成功插入了,为什么后面的就不行呢,最后还是试着对sql语句改了下,问题还真就解决了。
我的两个sql语句(小弟不是很明白,如果哪个大牛了解给小弟解释下,小弟感激不尽)
①         "insert into table values('%d',?)",key);           //正确
②         "insert into table(key,dat) values('%d',?)",key); //错误

还有说明就是在插入数据的时候添加事务可以增加效率,小弟也尝试了下,效率上也提升的相当大了,至少对于几百万条
数据来讲,我觉得两个方法是都可以的
插入事务为在插入的前后各增加条语句,
sqlite3_exec(db, "BEGIN;", 0, 0, &errmsg); //前
sqlite3_exec(db, "COMMIT;", 0, 0, &errmsg);//后

插入操作小弟暂时遇到的问题就大概是这样,当然有兄弟遇到问题也可以拿出来大家分享下,以便日后遇到问题可以快速解决

接下来我们来说说我在这一阶段遇到的查询问题,文章过长貌似影响浏览,好吧,那我就再开一章吧、


上回书说到,我们小编(也就是小弟,哈哈)买了小框架结构的房子,花了小钱给房子做了简单的装修(就是分出了卧室和厕所),买了点家具(床跟马桶),OK,现在家具齐全,我的小房子可以住人了哦。。忽忽



此章节,我们主要说说小弟关于数据查询遇到的问题,可能大牛们都没遇到过或者已经很容易的解决了,小弟不才,简单的问题

小弟整整花了小一周解决掉了。现在我们就来说说小弟查询遇到的问题吧

使用sqlite3查询时调用(_sql_callback)函数出错
在静态回调函数(_sql_callback)中,使用的vector变量定义遇到的问题

本帖隐藏的内容
回帖是一种美德,帮助别人就等于帮助自己。



其实,在使用建立一个测试工程中简单的测试的时候并没有发现这样的错误,并且建立的全局vector也可以正常的push_back进来数据,在main函数里也可以正常调用,但是问题在我的程序使用中就出现了跟demo使用的时候不一样的,那就是,我在demo中定义的为static的全局静态函数(_sql_callback),在我的程序中,我该如何来使用?
起初我是直接按照我的demo那样,在我的cpp文件中直接定义一个全局函数,同时定义一个全局的vector来存储(_sql_callback)返回的查询数据,后来给师傅看了,师傅说这样不行,说将这两个放到一个单独的类里,因为之前demo用的是静态的,我就照搬了,在单独的类里面我也人模狗样的模仿了下,按照想法应该是没问题的,就是从这个房间拿到另一个房间嘛,之后在调用(_sql_callback)的时候前面加上类(X::)不就成了么。结果出乎了我的意料,直接报错了,我以为是静态的事,我就取消了static,结果还是不成,当时报的错有点记不太清楚了,还请兄弟们见谅,总之就是没成,最后将(_sql_callback)函数在我起初定义的cpp的头文件中进行了声明,声明为static的,之后在cpp文件中进行了实现,此时,这个回调不出错了;出错的倒成了我要获得数据的vector,定义全局的可以(在cpp文件和h文件),我一拿到类中定义就不行了,提示在(_sql_callback)函数中,push_back的左边什么不是类或结构体什么了的。

后来小弟想了个办法,因为(_sql_callback)函数是静态的,我在h的类中定义个static的vector,我在cpp中进行了初始化,貌似也是个声明,不过没报重定义,那小弟应该就是弄对了吧(有点糊涂,反正是过了),OK,现在也可以回调了,也可以得到数据了,那么小弟就运行服务来试试吧,F5运行,哦了,服务可以正常启动了,启动了不是最终目的啊,要访问试试啊,ok,那么我们拿测试串来访问下试试吧,访问也正常,访问正常那效率怎么样呢,刚想到这里,就自己无聊的按住了F5,不停的通过这个串来刷服务,结果(哦买噶),服务宕掉了,弹出的错误都是vector奥塔什么range什么什么的,完了断在了vector的文件中,查询了下都说是内存没有处理好,导致的,可是每次使用都有释放,或者说原来的可以正常,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值