SQLite3的绑定函数族使用与其注意事项详解

来源:脚本之家  责任编辑:小易  

在评价《金星秀》之前,不妨先梳理以下中文电视圈的脱口秀历史:《康熙来了》宣告停播的那一天,互联网上弥漫着一股怀念的情绪:这是台湾地区最好的综艺节目,也是话语电视圈最好的脱口秀节目,就此收官。随着蔡康永内地发展得风生水起、小S相夫教子不亦乐乎,这档曾经如日中天的节目只剩下了人们长久地怀念:人们怀念的综艺黄金时代的逝去,也感慨收视取向变更后引发的脱口秀节目形态的迭代:老牌脱口秀节目倒下的另一方面,是内地脱口秀雨后春笋般推出。《挥之不去的流行》的作者贝迪丝·白瑞认为:在过去的十五年里,有两种事物已经改变了我们传播的方式:计算机和talkshow。我们已渐渐意识到计算机所做的一切,但是对于talksh

前言

本文给大家展示的代码实际上就是如何利用Sqlite3的参数化机制做数据插入,也可以update操作,就看你怎么玩了,这里只列出代码,然后说一些注意事项。

见过,一位全职妈妈家,有了孩子后,她就在家全心全意照顾孩子,本身很注重读孩子的培养,就难免会给孩子买绘本,不过后来慢慢孩子长到2岁之后,孩子自己会要求听故事,看绘本(虽然还不认字,但他喜欢看画),家里的绘本越买越多。再后来,这位妈妈开始去绘本馆租绘本了。不过买的绘本也没浪费,这位全职妈妈现在在她儿子的幼儿园,免费给孩子们讲故事,我觉得倒也挺好的。她家儿子的话,刚上幼儿园就可以和妈妈一起给其他孩子讲故事了,也挺厉害的吧。

下面的代码,有一个问题,插入后的东西一定是:

电视剧《男人四十要出嫁》里的女一号,由沈春阳饰演!她是周六福的前妻,但她还是顾大局识大体的女人,可以说她是那种简单大方的女主,女主从小出生在一个贫穷的家庭,是一个农村女性!我觉得春燕这个很讨喜,并没有可恨之处!感觉她很暖心!为什么说她暖心。其实啊!春燕对周六福温柔体贴,对男主妹妹也关爱有加!可以说女主春燕在心机女二面前非常有教养!我特别喜欢她,她总是为别人着想,愿意站在别人的立场考虑问题,她很独立,每次春燕有危险时,都是男主(宋小宝饰)第一时间去救她!其实,她真的不愿意成为别人的拖累,春燕被人贩子拐卖时,还是她自己一个人逃了出来!再说说她和周六福,春燕和周六福,两个人是夫妻,自打第一次出镜的时

INSERT INTO "work" VALUES('铪','铪铪铪铪铪',NULL,NULL,NULL,NULL,'铪铪铪铪铪',NULL,NULL,110.0,1.0,108.9,NULL,NULL,'铪铪铪铪铪',NULL,NULL,NULL,'铪铪铪铪铪',NULL,NULL,NULL);

如果纯粹的对战论结果与双方实力,我认为火影的会强,毕竟海贼王里的自然系这样能力,在火影里属于家常便饭一样。论霸气这玩意,其实只是在海贼王里吹的比较牛,在火影里的对战,都不是一个次元的,比如佐助的大招,幻术,怎么破?我想90%的海贼王里的人物都是无法抵挡的!这仅仅只是佐助一个人,还不算宇智波斑这种级别!

看看有问题的代码:

sqlite3_stmt *stmt; CString sql = "insert into work values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; int rc = sqlite3_prepare_v2(db, sql.GetString(), -1, &stmt, NULL); if(rc != SQLITE_OK) { MessageBox("sqlite3_prepare_v2 Failed!"); return; } count = 0; p_wnd = PrevWnd; while(count++ < ID_TOTALCOUNT) { CString DbStr; p_wnd = CWnd::GetNextDlgTabItem(p_wnd, FALSE); if(p_wnd == NULL) { return; } p_wnd->GetWindowText(DbStr); do { if(!DbStr.GetLength()) { rc = sqlite3_bind_null(stmt, count); break; } //日期相关 if( count == ID_CHUDANRIQI || count == ID_CHUFARIQI || count == ID_HUANKUANRIQI || count == ID_HUOLIRIQI) { CDateTimeCtrl *TimeCtl = (CDateTimeCtrl *)p_wnd; CString time = DateTimeToString(*TimeCtl); rc = sqlite3_bind_text(stmt, count, time.GetString(), time.GetLength(), SQLITE_STATIC); break; } else { //金钱相关的处理real类型 if( count == ID_BAOXIANJINE || count == ID_YONGJINBILV || count == ID_JINGBAOFEI || count == ID_HUANKUANJINE || count == ID_LIRUNBILV || count == ID_LIRUNJINE) { double tMoney = 0.0; int rtn = sscanf_s(DbStr.GetString(), "%lf", &tMoney); ASSERT(rtn == 1); rc = sqlite3_bind_double(stmt, count, tMoney); } else { char *str = (char *)DbStr.GetString(); int c = strlen(str); int c1 = DbStr.GetLength(); rc = sqlite3_bind_text(stmt, count, DbStr.GetString(), -1/*DbStr.GetLength()*/, SQLITE_STATIC); } } }while(0); if(rc != SQLITE_OK) { CString ErrStr = sqlite3_errstr(rc); MessageBox(ErrStr); return; } } rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) { if(rc == SQLITE_ERROR) { CString DbErr; DbErr.Format("Sql Insert failed, %s", sqlite3_errmsg(db)); MessageBox(DbErr); } else { MessageBox("sqlite3_step Failed!"); } } sqlite3_finalize(stmt);

为什么呢?

因为,sqlite3_bind_text绑定的text,需要在做:

rc = sqlite3_step(stmt);

的时候统一提交,而上面的代码使用的临时变量,rc = sqlite3_step(stmt);的时候,早就不存在了。因此乱码也是正常的。

修改如下:

sqlite3_stmt *stmt; CString sql = "insert into work values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; int rc = sqlite3_prepare_v2(db, sql.GetString(), -1, &stmt, NULL); if(rc != SQLITE_OK) { MessageBox("sqlite3_prepare_v2 Failed!"); return; } count = 0; p_wnd = PrevWnd; CString DbStr[ID_TOTALCOUNT + 1]; while(count++ < ID_TOTALCOUNT) { DbStr[count].Empty(); p_wnd = CWnd::GetNextDlgTabItem(p_wnd, FALSE); if(p_wnd == NULL) { return; } p_wnd->GetWindowText(DbStr[count]); do { if(!DbStr[count].GetLength()) { rc = sqlite3_bind_null(stmt, count); break; } //日期相关 if( count == ID_CHUDANRIQI || count == ID_CHUFARIQI || count == ID_HUANKUANRIQI || count == ID_HUOLIRIQI) { CDateTimeCtrl *TimeCtl = (CDateTimeCtrl *)p_wnd; CString time = DateTimeToString(*TimeCtl); DbStr[count] = time; rc = sqlite3_bind_text(stmt, count, time.GetString(), time.GetLength(), SQLITE_STATIC); } else { //金钱相关的处理real类型 if( count == ID_BAOXIANJINE || count == ID_YONGJINBILV || count == ID_JINGBAOFEI || count == ID_HUANKUANJINE || count == ID_LIRUNBILV || count == ID_LIRUNJINE) { double tMoney = 0.0; int rtn = sscanf_s(DbStr[count].GetString(), "%lf", &tMoney); ASSERT(rtn == 1); rc = sqlite3_bind_double(stmt, count, tMoney); } else { rc = sqlite3_bind_text(stmt, count, DbStr[count].GetString(), DbStr[count].GetLength(), SQLITE_STATIC); } } }while(0); if(rc != SQLITE_OK) { CString ErrStr = sqlite3_errstr(rc); MessageBox(ErrStr); return; } } rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) { if(rc == SQLITE_ERROR) { CString DbErr; DbErr.Format("Sql Insert failed, %s", sqlite3_errmsg(db)); MessageBox(DbErr); } else { MessageBox("sqlite3_step Failed!"); } } sqlite3_finalize(stmt);

附上数据库创建的sql语法:

sqlite> .dump work PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE work (baodanhao text unique primary key , chudanriqi text,qudao text,lianxiren text,xiaoshou text,beibaorenxingming text,chufar iqi text,baoxianpinpai text,baoxianjihua text,baoxianjine real,yongjinbilv real,jingbaofei real,huankuanfangshi text,haikuanjine real,huanku anriqi text,shifouquane text,lirunbilv real,lirunjine real,huoliriqi text,fapiaojisong text,shifubaoxiangongsi text,beizhu text);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

Excel中,数个同样内容的单元格合并后会影响到用函数与其关联的其它单元格的结果,怎么解决?

一般用这个方法来操作,以合并A1:A5来示例:

1. 合并C1:C5(如果是空格的话)

2. 在合并的单元格上点一下“格式刷”

3. 在A1单元格上点一下

如此一来,表面单元格是合并了,但是,你用公式调用A2单元格的值,还是原来的, 这样你的公式不受影响。

----------PS----------

实质就是先制作好一个合并好的单元格格式,然后复制这个格式,到你的数据区中粘贴格式,这样可保证内部的数据不变(可用公式查询)。而你直接合并单元格,则只保留最左上角的一个单元格的数值,其余数据均删除。追问你的办法我刚才试了下,可以,但是函数要改成index+match,这还好,主要是合并后的单元格中要插入新的一行时,调用新行的其它单元格却不能返回A列的内容,按你的说明来理解就是因为新行的无内容,难道只能再取消合并,重新用一遍你的方法?追答-------PS2-------

只能这样了。就连用VBA直接给单元格赋值也不行。

所以我们一般不推荐在需要经常改动的工作表上使用该方法。

另:要做规范的数据表,尽量不要用合并单元格,以后处理起来相当不方便。

  • 本文相关:
  • sqlite3中的日期时间函数使用小结
  • 为sqlite3提供一个ansi到utf8的互转函数
  • 初识sqlite3数据库
  • 保护你的sqlite数据库(sqlite数据库安全秘籍)
  • sqlite数据库管理系统-我所认识的数据库引擎
  • 一些很有用的sqlite命令总结
  • sqlite教程(十四):c语言编程实例代码(2)
  • sqlite教程(五):数据库和事务
  • sqlite 入门教程三 好多约束 constraints
  • sqlite 常用函数 推荐
  • sqlite 入门教程二 sqlite的创建、修改、删除表
  • sqlite3 top的查询及limit语法介绍
  • Excel中,数个同样内容的单元格合并后会影响到用函...
  • 误差加权函数w与其调用参数rip之间有何联系
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved