最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLite3的綁定函數(shù)族使用與其注意事項(xiàng)詳解

 更新時(shí)間:2017年03月31日 10:06:12   作者:多客博圖  
這篇文章主要介紹了SQLite3的綁定函數(shù)族使用與其注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。

前言

本文給大家展示的代碼實(shí)際上就是如何利用Sqlite3的參數(shù)化機(jī)制做數(shù)據(jù)插入,也可以update操作,就看你怎么玩了,這里只列出代碼,然后說一些注意事項(xiàng)。

下面的代碼,有一個(gè)問題,插入后的東西一定是:

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

看看有問題的代碼:

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;
  }

  //日期相關(guān)
  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
  {
  //金錢相關(guān)的處理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);

為什么呢?

因?yàn)椋瑂qlite3_bind_text綁定的text,需要在做:

rc = sqlite3_step(stmt); 

的時(shí)候統(tǒng)一提交,而上面的代碼使用的臨時(shí)變量,rc = sqlite3_step(stmt);的時(shí)候,早就不存在了。因此亂碼也是正常的。

修改如下:

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;
  }

  //日期相關(guān)
  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
  {
  //金錢相關(guān)的處理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);

附上數(shù)據(jù)庫創(chuàng)建的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);

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • SQLite3中自增主鍵相關(guān)知識(shí)總結(jié)

    SQLite3中自增主鍵相關(guān)知識(shí)總結(jié)

    這篇文章主要介紹了SQLite3中自增主鍵相關(guān)知識(shí)總結(jié),清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以參考下
    2014-05-05
  • SQLite數(shù)據(jù)庫常用語句及MAC上的SQLite可視化工具M(jìn)easSQLlite使用方法

    SQLite數(shù)據(jù)庫常用語句及MAC上的SQLite可視化工具M(jìn)easSQLlite使用方法

    這篇文章主要介紹了SQLite數(shù)據(jù)庫常用語句及MAC上的SQLite可視化工具M(jìn)easSQLlite使用方法,需要的朋友可以參考下
    2016-01-01
  • SQLite教程(二):C/C++接口簡介

    SQLite教程(二):C/C++接口簡介

    這篇文章主要介紹了SQLite教程(二):C/C++接口簡介,本文講解了C/C++接口概述、核心對象和接口、參數(shù)綁定等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • SQLite教程(十二):鎖和并發(fā)控制詳解

    SQLite教程(十二):鎖和并發(fā)控制詳解

    這篇文章主要介紹了SQLite教程(十二):鎖和并發(fā)控制詳解,本文講解了鎖和并發(fā)控制機(jī)制概述、文件鎖、回滾日志、數(shù)據(jù)寫入、SQL級別的事務(wù)控制等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • SQLite優(yōu)化方法

    SQLite優(yōu)化方法

    SQLite的數(shù)據(jù)庫本質(zhì)上來講就是一個(gè)磁盤上的文件,所以一切的數(shù)據(jù)庫操作其實(shí)都會(huì)轉(zhuǎn)化為對文件的操作,而頻繁的文件操作將會(huì)是一個(gè)很好時(shí)的過程,會(huì)極大地影響數(shù)據(jù)庫存取的速度。
    2008-09-09
  • SQLite教程(十四):C語言編程實(shí)例代碼(2)

    SQLite教程(十四):C語言編程實(shí)例代碼(2)

    這篇文章主要介紹了SQLite教程(十四):C語言編程實(shí)例代碼(2),本文講解了高效的批量數(shù)據(jù)插入和數(shù)據(jù)查詢代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • SQLite教程(六):表達(dá)式詳解

    SQLite教程(六):表達(dá)式詳解

    這篇文章主要介紹了SQLite教程(六):表達(dá)式詳解,本文講解了常用表達(dá)式、條件表達(dá)式、轉(zhuǎn)換表達(dá)式等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • SQLite 入門教程四  增刪改查 有講究

    SQLite 入門教程四 增刪改查 有講究

    增刪改查操作,其中增刪改操作被稱為數(shù)據(jù)操作語言 DML,相對來說簡單一點(diǎn)。 查操作相對來說復(fù)雜一點(diǎn),涉及到很多子句,所以這篇先講增刪改操作,以例子為主,后面再講查操作
    2013-12-12
  • python之sqlalchemy創(chuàng)建表的實(shí)例詳解

    python之sqlalchemy創(chuàng)建表的實(shí)例詳解

    這篇文章主要介紹了數(shù)據(jù)庫之sqlalchemy創(chuàng)建表的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • SQLite 實(shí)現(xiàn)if not exist 類似功能的操作

    SQLite 實(shí)現(xiàn)if not exist 類似功能的操作

    這篇文章主要介紹了SQLite 實(shí)現(xiàn)if not exist 類似功能的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

开阳县| 伊宁县| 固始县| 新津县| 镇雄县| 保康县| 湖州市| 米脂县| 海阳市| 无为县| 宜黄县| 阳泉市| 启东市| 赞皇县| 奉新县| 朝阳县| 东乌珠穆沁旗| 蓬莱市| 灵台县| 宜宾县| 宁晋县| 五寨县| 新乡市| 金乡县| 北碚区| 贵定县| 原平市| 绩溪县| 孝昌县| 新泰市| 乾安县| 建阳市| 墨脱县| 阳西县| 碌曲县| 博客| 莒南县| 鹰潭市| 广安市| 景泰县| 和龙市|