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

前端之家收集整理的这篇文章主要介绍了SQLite3数据库Native C++封装类(Unicode)CppSQLite3U的初步认识与使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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”也有几十种,常见的如:easysqlitesqlite++、Cppsqlite、CppsqliteU等等。因为我通常是在Windows CE嵌入式操作系统上开发APP,而Windows CE操作系统只支持Unicode字符集,所以今天要学习和测试的是Unicode版“C++ Wrappers”:CppsqliteU

(2)

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

(3)

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

  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. @H_404_357@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字符串类型返回错误码。

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

通常用法如:

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

    @H_90_502@copy
    classCppsqlite3DB
  1. voidopen(LPCTSTRszFile);
  2. voidclose();
  3. @H_404_357@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用于销毁语句。

@H_90_502@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. 用法如:

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

        原文链接:https://www.f2er.com/sqlite/200840.html

        猜你在找的Sqlite相关文章