乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      SQLite3數(shù)據(jù)庫(kù)Native C++封裝類(lèi)(Unicode)CppSQLite3U的初步認(rèn)識(shí)與使用

       c 資料收集 2014-07-17

      SQLite3數(shù)據(jù)庫(kù)Native C++封裝類(lèi)(Unicode)CppSQLite3U的初步認(rèn)識(shí)與使用  by斜風(fēng)細(xì)雨QQ:253786989    2012-02-12

      (1)

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

        從上面的網(wǎng)址可以找到對(duì)SQLite數(shù)據(jù)庫(kù)的C API的各種語(yǔ)言的封裝。包括c、c++、vb、c#.net、delphi、Lisp、D、Java、Javascript、Objective-C、Perl、PHP、Python、Ruby、Lua、Fortran等等。從這也可以看出SQLite數(shù)據(jù)庫(kù)作為本地?cái)?shù)據(jù)存儲(chǔ)工具而得到的廣泛應(yīng)用。單單是“C++ Wrappers”也有幾十種,常見(jiàn)的如:easySQLite、SQLite++、CppSQLite、CppSQLiteU等等。因?yàn)槲彝ǔJ窃?span style="font-family:Courier New">Windows CE嵌入式操作系統(tǒng)上開(kāi)發(fā)APP,而Windows CE操作系統(tǒng)只支持Unicode字符集,所以今天要學(xué)習(xí)和測(cè)試的是Unicode版“C++ Wrappers”:CppSQLiteU。

      (2)

        因?yàn)槭窃?span style="font-family:Courier New">Windows CE操作系統(tǒng)上使用SQLite,所以在使用CppSQLiteU之前,要先編譯針對(duì)Windows CE平臺(tái)的SQLite3 DLL。這一步省了,我直接借用了別人已經(jīng)編譯好的。

      (3)

        下面是一個(gè)簡(jiǎn)單測(cè)試示例,主要是利用class CppSQLite3DB新建數(shù)據(jù)庫(kù)、創(chuàng)建表、插入刪除更新記錄、使用事務(wù)、查詢記錄等等。

      1. #define SQLITE3_FILE_NAME TEXT("sqlite.db3")  
      2.   
      3. // 獲取程序當(dāng)前路徑  
      4. void GetCurrentDirectory(CString &szPath)  
      5. {  
      6.     TCHAR buf[256] = {0};  
      7.     GetModuleFileName(NULL, buf, sizeof(buf)/sizeof(TCHAR));  
      8.     szPath = buf;         
      9.     szPath = szPath.Left(szPath.ReverseFind('\\') + 1);  
      10. }  
      11.   
      12. CString strDbPath;  
      13. GetCurrentDirectory(strDbPath);  
      14. strDbPath += SQLITE3_FILE_NAME;  
      15.   
      16. CppSQLite3DB db;  
      17.   
      18. try  
      19. {  
      20.     // 打開(kāi)或新建一個(gè)數(shù)據(jù)庫(kù)  
      21.     db.open(strDbPath);   
      22.   
      23.     // 判斷表名是否已經(jīng)存在  
      24.     if(!db.tableExists(TEXT("Customers")))   
      25.     {  
      26.         // 不存在,新建表Customers  
      27.          db.execDML(TEXT("CREATE TABLE Customers(cust_name varchar(50) NOT NULL PRIMARY KEY, cust_address varchar(50));"));  
      28.     }  
      29.   
      30.     // 插入1條記錄  
      31.     db.execDML(TEXT("INSERT INTO Customers VALUES('Village Toys', '200 Maple Lane');"));  
      32.     // 插入1條記錄  
      33.     db.execDML(TEXT("INSERT INTO Customers VALUES('Kids Place', '333 South Lake Drive');"));  
      34.   
      35.     // 刪除1條記錄  
      36.     db.execDML(TEXT("DELETE FROM Customers WHERE cust_name = 'Village Toys';"));  
      37.   
      38.     // 使用顯示事務(wù)插入10條記錄  
      39.     TCHAR buf[256] = {0};  
      40.     db.execDML(TEXT("BEGIN TRANSACTION;"));  
      41.     for (int i = 0; i < 10; ++i)  
      42.     {  
      43.         memset(buf, 0, sizeof(buf));  
      44.         wsprintf(buf, TEXT("INSERT INTO Customers VALUES ('Fun%dALL', '%d Sunny Place');"), i, i);  
      45.         db.execDML(buf);  
      46.     }  
      47.     db.execDML(TEXT("COMMIT TRANSACTION;"));  
      48.   
      49.     // 更新1條記錄  
      50.     db.execDML(TEXT("UPDATE Customers SET cust_address = '4545 53rd Street' WHERE cust_name = 'Fun0ALL';"));  
      51.   
      52.     // 獲取總記錄條數(shù)  
      53.     int nCount = db.execScalar(TEXT("SELECT COUNT(*) FROM Customers;"));  
      54.     TCHAR szCount[50] = {0};  
      55.     memset(szCount, 0, sizeof(szCount));  
      56.     wsprintf(szCount, TEXT("Record count: %d."), nCount);  
      57.     AfxMessageBox(szCount);  
      58.   
      59.     // 獲取每一條記錄  
      60.     CppSQLite3Query q = db.execQuery(TEXT("SELECT * FROM Customers;"));  
      61.     while (!q.eof())  
      62.     {  
      63.         AfxMessageBox(q.fieldValue(0));  
      64.         q.nextRow();  
      65.     }  
      66.   
      67.     // 銷(xiāo)毀語(yǔ)句  
      68.     q.finalize();  
      69.   
      70.     // 關(guān)閉數(shù)據(jù)庫(kù)  
      71.     db.close();  
      72.     AfxMessageBox(TEXT("測(cè)試完成!"));  
      73. }  
      74. catch(CppSQLite3Exception ex)  
      75. {  
      76.     AfxMessageBox(ex.errorMessage());  
      77. }  

      (4)

        CppSQLite3U封裝了4個(gè)類(lèi):CppSQLite3Exception、CppSQLite3DB、CppSQLite3Statement、CppSQLite3Query

      a) CppSQLite3Exception用于捕捉異常,errorCode以整數(shù)類(lèi)形返回錯(cuò)誤碼,errorMessageUnicode字符串類(lèi)型返回錯(cuò)誤碼。

      1. class CppSQLite3Exception  
      2. {  
      3. public:  
      4.     … …  
      5.     const int errorCode() { return mnErrCode; }  
      6.     LPCTSTR errorMessage() { return mpszErrMess; }  
      7.     static LPCTSTR  errorCodeAsString(int nErrCode);  
      8.     … …  
      9. };  

      通常用法如:

      1. try  
      2. {  
      3.     … …      
      4. }  
      5. catch(CppSQLite3Exception ex)  
      6. {  
      7.   
      8.     AfxMessageBox(ex.errorMessage());  
      9. }  

      b) CppSQLite3DB用于新建數(shù)據(jù)庫(kù),打開(kāi)關(guān)閉數(shù)據(jù)庫(kù)連接,執(zhí)行DML、DDL,檢索數(shù)據(jù)等。如:open打開(kāi)數(shù)據(jù)庫(kù)連接,close關(guān)閉數(shù)據(jù)庫(kù)連接,tableExists檢查某表是否存在,execDML執(zhí)行SQL命令,execQuery檢索記錄,setBusyTimeout設(shè)置SQLite內(nèi)部的busy handler的超時(shí)時(shí)間,SQLiteVersion返回SQLite版本。

      1. class CppSQLite3DB   
      2. {  
      3. public:      
      4.     … …  
      5.     void open(LPCTSTR szFile);  
      6.     void close();  
      7.     bool tableExists(LPCTSTR szTable);  
      8.     int execDML(LPCTSTR szSQL);  
      9.     CppSQLite3Query execQuery(LPCTSTR szSQL);  
      10.     int execScalar(LPCTSTR szSQL);  
      11.     CString execScalarStr(LPCTSTR szSQL);  
      12.     CppSQLite3Statement compileStatement(LPCTSTR szSQL);  
      13.     sqlite_int64 lastRowId();  
      14.     void interrupt() { sqlite3_interrupt(mpDB); }      
      15.     void setBusyTimeout(int nMillisecs);  
      16.     static const char* SQLiteVersion() { return SQLITE_VERSION; }  
      17.     … …  
      18. };  

      c) CppSQLite3Statement也可以執(zhí)行SQL命令,它最大的特點(diǎn)是支持參數(shù)綁定。對(duì)于參數(shù)綁定的用處,參考“SQlite數(shù)據(jù)庫(kù)的C編程接口(四) 綁定參數(shù)(Bound Parameters) ——《Using SQlite》讀書(shū)筆記”學(xué)習(xí)。該類(lèi)導(dǎo)出的接口函數(shù)中,bind用于給SQL語(yǔ)句中的參數(shù)綁定指定的值,reset函數(shù)用于重置SQL語(yǔ)句,finalize用于銷(xiāo)毀語(yǔ)句。

      1. class CppSQLite3Statement  
      2. {  
      3. public:  
      4.     … …  
      5.     CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement);  
      6.     int execDML();  
      7.     CppSQLite3Query execQuery();  
      8.     void bind(int nParam, LPCTSTR szValue);  
      9.     void bind(int nParam, const int nValue);  
      10.     void bind(int nParam, const double dwValue);  
      11.     void bind(int nParam, const unsigned char* blobValue, int nLen);  
      12.     void bindNull(int nParam);  
      13.     void reset();  
      14.     void finalize();  
      15.     … …  
      16. };  

      用法如:

      1. try  
      2. {  
      3.     CppSQLite3DB db;  
      4.     db.execDML("CREATE TABLE emp(empno int, empname char(20));");  
      5.     db.execDML("BEGIN TRANSACTION;");  
      6.     CppSQLite3Statement stmt = db.compileStatement("INSERT INTO emp VALUES (:empno, : empname);");  
      7.     for (i = 0; i < nRowsToCreate; ++i)  
      8.     {  
      9.         char buf[16];  
      10.         sprintf(buf, "EmpName%06d", i);  
      11.         stmt.bind(":empno", i);  
      12.         stmt.bind(":empname ", buf);  
      13.         stmt.execDML();  
      14.         stmt.reset();  
      15.     }  
      16.     db.execDML("COMMIT TRANSACTION; ");  
      17. }  
      18. catch (CppSQLite3Exception& e)  
      19. {  
      20.     cerr << e.errorCode() << ":" << e.errorMessage() << endl;  
      21. }  

      d) CppSQLite3Query用于檢索記錄并讀出結(jié)果。它導(dǎo)出的public接口函數(shù)大多都是SQLite3C API _sqlite3_column_xxx函數(shù)的封裝,通過(guò)該API函數(shù)讀取結(jié)果集中某一行的某一列。nextRow函數(shù)用于檢索下一行,eof用于判斷是否到結(jié)果集的結(jié)尾。

      1. class CppSQLite3Query  
      2. {  
      3. public:  
      4.     … ….  
      5.     int numFields();  
      6.     int fieldIndex(LPCTSTR szField);  
      7.     LPCTSTR fieldName(int nCol);  
      8.     LPCTSTR fieldDeclType(int nCol);  
      9.     int fieldDataType(int nCol);  
      10.     LPCTSTR fieldValue(int nField);  
      11.     LPCTSTR fieldValue(LPCTSTR szField);  
      12.     int getIntField(int nField, int nNullValue=0);  
      13.     int getIntField(LPCTSTR szField, int nNullValue=0);  
      14.     double getFloatField(int nField, double fNullValue=0.0);  
      15.     double getFloatField(LPCTSTR szField, double fNullValue=0.0);  
      16.     LPCTSTR getStringField(int nField, LPCTSTR szNullValue=_T(""));  
      17.     LPCTSTR getStringField(LPCTSTR szField, LPCTSTR szNullValue=_T(""));  
      18.     const unsigned char* getBlobField(int nField, int& nLen);  
      19.     const unsigned char* getBlobField(LPCTSTR szField, int& nLen);  
      20.     bool fieldIsNull(int nField);  
      21.     bool fieldIsNull(LPCTSTR szField);  
      22.     bool eof();  
      23.     void nextRow();  
      24.     void finalize();  
      25.     … …   
      26. };  

      SQLite3數(shù)據(jù)庫(kù)Native C++封裝類(lèi)(Unicode)CppSQLite3U的初步認(rèn)識(shí)與使用  by斜風(fēng)細(xì)雨QQ:253786989    2012-02-12

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多