加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认

发布时间:2020-12-12 20:08:13 所属栏目:百科 来源:网络整理
导读:SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认识与使用 (1) http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers 从上面的网址可以找到对 SQLite 数据库的 C API 的各种语言的封装。包括 c、c++、vb、c#.net、delphi、Lisp、D、Java、Java

SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认识与使用

(1)

http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers

从上面的网址可以找到对SQLite数据库的C API的各种语言的封装。包括c、c++、vb、c#.net、delphi、Lisp、D、Java、Javascript、Objective-C、Perl、PHP、Python、Ruby、Lua、Fortran等等。从这也可以看出SQLite数据库作为本地数据存储工具而得到的广泛应用。单单是“C++ Wrappers”也有几十种,常见的如:easySQLite、SQLite++、CppSQLite、CppSQLiteU等等。因为我通常是在Windows CE嵌入式操作系统上开发APP,而Windows CE操作系统只支持Unicode字符集,所以今天要学习和测试的是Unicode版“C++ Wrappers”:CppSQLiteU

(2)

因为是在Windows CE操作系统上使用SQLite,所以在使用CppSQLiteU之前,要先编译针对Windows CE平台的SQLite3 DLL。这一步省了,我直接借用了别人已经编译好的。

(3)

下面是一个简单测试示例,主要是利用class CppSQLite3DB新建数据库、创建表、插入删除更新记录、使用事务、查询记录等等。

[cpp] view plain copy
  1. #defineSQLITE3_FILE_NAMETEXT("sqlite.db3")
  2. //获取程序当前路径
  3. voidGetCurrentDirectory(CString&szPath)
  4. {
  5. TCHARbuf[256]={0};
  6. GetModuleFileName(NULL,buf,sizeof(buf)/sizeof(TCHAR));
  7. szPath=buf;
  8. szPath=szPath.Left(szPath.ReverseFind('')+1);
  9. }
  10. CStringstrDbPath;
  11. GetCurrentDirectory(strDbPath);
  12. strDbPath+=SQLITE3_FILE_NAME;
  13. CppSQLite3DBdb;
  14. try
  15. //打开或新建一个数据库
  16. db.open(strDbPath);
  17. //判断表名是否已经存在
  18. if(!db.tableExists(TEXT("Customers")))
  19. //不存在,新建表Customers
  20. db.execDML(TEXT("CREATETABLECustomers(cust_namevarchar(50)NOTNULLPRIMARYKEY,cust_addressvarchar(50));"));
  21. //插入1条记录
  22. db.execDML(TEXT("INSERTINTOCustomersVALUES('VillageToys','200MapleLane');"));
  23. db.execDML(TEXT("INSERTINTOCustomersVALUES('KidsPlace','333SouthLakeDrive');"));
  24. //删除1条记录
  25. db.execDML(TEXT("DELETEFROMCustomersWHEREcust_name='VillageToys';"));
  26. //使用显示事务插入10条记录
  27. TCHARbuf[256]={0};
  28. db.execDML(TEXT("BEGINTRANSACTION;"));
  29. for(inti=0;i<10;++i)
  30. {
  31. memset(buf,153); background-color:inherit; font-weight:bold">sizeof(buf));
  32. wsprintf(buf,TEXT("INSERTINTOCustomersVALUES('Fun%dALL','%dSunnyPlace');"),i,i);
  33. db.execDML(buf);
  34. db.execDML(TEXT("COMMITTRANSACTION;"));
  35. //更新1条记录
  36. db.execDML(TEXT("UPDATECustomersSETcust_address='454553rdStreet'WHEREcust_name='Fun0ALL';"));
  37. //获取总记录条数
  38. intnCount=db.execScalar(TEXT("SELECTCOUNT(*)FROMCustomers;"));
  39. TCHARszCount[50]={0};
  40. memset(szCount,153); background-color:inherit; font-weight:bold">sizeof(szCount));
  41. wsprintf(szCount,TEXT("Recordcount:%d."),nCount);
  42. AfxMessageBox(szCount);
  43. //获取每一条记录
  44. CppSQLite3Queryq=db.execQuery(TEXT("SELECT*FROMCustomers;"));
  45. while(!q.eof())
  46. AfxMessageBox(q.fieldValue(0));
  47. q.nextRow();
  48. }
  49. //销毁语句
  50. q.finalize();
  51. //关闭数据库
  52. db.close();
  53. AfxMessageBox(TEXT("测试完成!"));
  54. catch(CppSQLite3Exceptionex)
  55. AfxMessageBox(ex.errorMessage());
  56. }

(4)

CppSQLite3U封装了4个类:CppSQLite3Exception、CppSQLite3DB、CppSQLite3Statement、CppSQLite3Query

a)CppSQLite3Exception用于捕捉异常,errorCode以整数类形返回错误码,errorMessageUnicode字符串类型返回错误码。

copy
    classCppSQLite3Exception
  1. public:
  2. ……
  3. constinterrorCode(){returnmnErrCode;}
  4. LPCTSTRerrorMessage(){returnmpszErrMess;}
  5. staticLPCTSTRerrorCodeAsString(intnErrCode);
  6. };

通常用法如:

copy
    try
  1. ……
  2. catch(CppSQLite3Exceptionex)
  3. b)CppSQLite3DB用于新建数据库,打开关闭数据库连接,执行DML、DDL,检索数据等。如:open打开数据库连接,close关闭数据库连接,tableExists检查某表是否存在,execDML执行SQL命令,execQuery检索记录,setBusyTimeout设置SQLite内部的busy handler的超时时间,SQLiteVersion返回SQLite版本。

    copy
      classCppSQLite3DB
    1. voidopen(LPCTSTRszFile);
    2. voidclose();
    3. booltableExists(LPCTSTRszTable);
    4. intexecDML(LPCTSTRszSQL);
    5. CppSQLite3QueryexecQuery(LPCTSTRszSQL);
    6. intexecScalar( CStringexecScalarStr( CppSQLite3StatementcompileStatement( sqlite_int64lastRowId();
    7. voidinterrupt(){sqlite3_interrupt(mpDB);}
    8. voidsetBusyTimeout(intnMillisecs);
    9. staticchar*SQLiteVersion(){returnSQLITE_VERSION;}
    10. };

    c)CppSQLite3Statement也可以执行SQL命令,它最大的特点是支持参数绑定。对于参数绑定的用处,参考“SQlite数据库的C编程接口(四) 绑定参数(Bound Parameters) ——《Using SQlite》读书笔记”学习。该类导出的接口函数中,bind用于给SQL语句中的参数绑定指定的值,reset函数用于重置SQL语句,finalize用于销毁语句。

    copy
      classCppSQLite3Statement
    1. CppSQLite3Statement&operator=(constCppSQLite3Statement&rStatement);
    2. intexecDML();
    3. CppSQLite3QueryexecQuery();
    4. voidbind(intnParam,LPCTSTRszValue);
    5. intnValue);
    6. doubledwValue);
    7. constunsignedchar*blobValue,87); background-color:inherit; font-weight:bold">intnLen);
    8. voidbindNull(intnParam);
    9. voidreset();
    10. voidfinalize();
    11. 用法如:

      copy
        CppSQLite3DBdb;
      1. db.execDML("CREATETABLEemp(empnoint,empnamechar(20));");
      2. db.execDML("BEGINTRANSACTION;");
      3. CppSQLite3Statementstmt=db.compileStatement("INSERTINTOempVALUES(:empno,:empname);");
      4. for(i=0;i<nRowsToCreate;++i)
      5. charbuf[16];
      6. sprintf(buf,"EmpName%06d",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> stmt.bind(":empno",i);
      7. stmt.bind(":empname",buf);
      8. stmt.execDML();
      9. stmt.reset();
      10. db.execDML("COMMITTRANSACTION;");
      11. catch(CppSQLite3Exception&e)
      12. cerr<<e.errorCode()<<":"<<e.errorMessage()<<endl;
      13. d)CppSQLite3Query用于检索记录并读出结果。它导出的public接口函数大多都是SQLite3C API _sqlite3_column_xxx函数的封装,通过该API函数读取结果集中某一行的某一列。nextRow函数用于检索下一行,eof用于判断是否到结果集的结尾。

        copy
          classCppSQLite3Query
        1. …….
        2. intnumFields();
        3. intfieldIndex(LPCTSTRszField);
        4. LPCTSTRfieldName(intnCol);
        5. LPCTSTRfieldDeclType(intnCol);
        6. intfieldDataType(LPCTSTRfieldValue(intnField);
        7. LPCTSTRszField);
        8. intgetIntField(intnField,87); background-color:inherit; font-weight:bold">intnNullValue=0);
        9. LPCTSTRszField,87); background-color:inherit; font-weight:bold">intnNullValue=0);
        10. doublegetFloatField(doublefNullValue=0.0);
        11. doublefNullValue=0.0);
        12. LPCTSTRgetStringField(LPCTSTRszNullValue=_T(""));
        13. LPCTSTRszNullValue=_T(""));
        14. char*getBlobField(int&nLen);
        15. int&nLen);
        16. boolfieldIsNull(booleof();
        17. voidnextRow();
        18. SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认识与使用

          (编辑:李大同)

          【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读