C++ VS2013環境編譯使用sqlite數據庫全過程


轉載:http://www.cnblogs.com/imoon/archive/2012/11/30/2796726.html

轉載:https://blog.csdn.net/hjm4702192/article/details/8283018(缺點)

轉載:https://www.cnblogs.com/ccEmma/p/8308974.html (缺點)

知識補充:

      sqlite3.dll動態鏈接庫,它允許程序共享執行特殊任務所必需的代碼和其他資源。

      動態的sqlite3.lib相當於一個h文件,是對實現部分(.dll文件)的導出部分的聲明。編譯后只是將導出聲明部分編譯到宿主程序中,其生成的sqlite3.exe在運行時需要相應的dll文件支持 。

靜態的sqlite3.lib將導出聲明和實現都放在lib中。編譯后所有代碼都嵌入到宿主程序,其生成的sqlite3.exe可直接運行。


任務:

     一.使用VS2013編譯sqlite3,生成動態的sqlite3.lib和sqlite3.dll(sqlite3.dll在官網中也可下載到)。在VS2013中編寫簡單程序,使用動態的sqlite3.lib和sqlite3.dll。

     二.使用VS2013編譯sqlite3,生成靜態的sqlite3.lib。在VS2013中編寫簡單程序,使用靜態的sqlite3.lib。 

任務一:

1.在sqlite官網 http://www.sqlite.org/download.html 上下載sqlite-amalgamation-3270200.zip 和sqlite-dll-win32-x86-3270200.zip(我用的此版本)。

2.分別解壓上述兩個文件到各自文件夾下(sqlite3.def、sqlite3.dll在同一文件夾sqlite-dll下)。

3.從VS2013的安裝目錄下Microsoft Visual Studio 12.0\VC\bin找到lib.exe和link.exe,

   從VS2013的安裝目錄下G:\Microsoft Visual Studio 12.0\VC\bin找到mspdb120.dll。

    將lib.exe link.exe mspdb120.dll放到步驟2中的sqlite-dll文件夾下。

4.在D:\testdemo\sqlite-dll-win32-x86-3270200目錄下,打開cmd窗口

 

 


5.輸入命令:

LIB /DEF:sqlite3.def /machine:IX86

這時,在sqlite-dll-win32-x86-3270200文件夾下會出現sqlite3.lib。(這是動態的sqlite3.lib文件,只有896KB大小。)

 

6.在VS2013中編寫簡單程序。文件->新建->項目->Win32控制台應用程序,命名為Testsqlite 。

7.將main.cpp中的內容替換為以下代碼:

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#pragma  warning(disable:4996)

#pragma  comment(lib,"sqlite3.lib")
int main()
{
    int rc;
    int i, nrows, ncols, tr;
    char *errmsg = NULL;
    char **results;

    sqlite3 *db = NULL;
    rc = sqlite3_open("demodb", &db);
    if (rc)
    {
        fprintf(stderr, "can't open db!\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }
    else
    {
        printf("db open successfully!\n");
    }
    sqlite3_get_table(db, "select * from clients;", &results, &nrows, &ncols, &errmsg);
    printf("DB has %d rows and %d cols\n\n", nrows, ncols);
    tr = (nrows + 1)*ncols;
    for (i = 0; i < tr; ++i) //輸出查詢結果
    {
        printf("results[%d]= %s/n", i, results[i]); //此處可以自己定義輸出格式,
    }
    sqlite3_free_table(results); //free 
    sqlite3_close(db);

     getchar();
    return 0;
}

 

8.將sqlite3.h、sqlite3.lib、sqlite3.dll復制到工程所在文件目錄中

9.sqlite3.dll 和exe放到同一個目錄


10.按F5鍵,運行成功。

備注:

1:SQLITE不可儲存過多的數據庫,它的性能發揮最好只能在存放較小的數據量情況下。不要把它當做MYSQL甚至ORACLE來使用。它只是一個200K的數據庫。

2:sqlite3不像MYSQL那樣使用固定日志文件,所有使用insert、update、delete的運行效率只是一般,sqlite3的一個事務,需要調用4次fsync()操作,而一般的大型數據庫,如mysql只用到了2次。sqlite3對每個事務都創建一個臨時文件來記錄日志,這個日志創建、更新和刪除竟然使用了3次fsync()!為什么不用一個固定的日志文件呢?實在難以理解設計者的思路。可能他們把重點放在"Select" 性能上吧。通過閱讀sqlite3-3.5.1的源代碼,發現作者也試圖對這個問題進行修正,可能由於可靠性的原因,一直沒有正式公布。

SQLite是為中小規模的應用程序設計的一個嵌入式的數據庫

局限性一:

並發。SQLite的鎖機制是粗粒度的,它允許多個讀,但是一次只允許一個寫。

寫鎖會在寫期間排他地鎖定數據庫,其他人在此期間不能訪問數據庫。

SQLite已經采取措施以最小化排它鎖所占用的時間。

通常來講,SQLite中的鎖只保持幾毫秒。

但是按照一般經驗,如果您的應用程序有很高的寫並發(許多連接競爭向同一數據庫寫),並且是時間關鍵型,您可能需要其他數據庫。

需要實際測試您的應用程序才能知道能獲得怎樣的性能。

一個簡單的網絡應用程序中,SQLite用100個並發連接每秒處理500多個事務。

事務所修改的記錄數以及查詢所涉及的復雜性可能有所不同。

什么樣的並發性是可接受的,這取決於具體的應用程序,只能通過直接測試來判斷。

總之,對任何數據庫都是真理:直到您做了實際測試才能知道應用程序能獲得怎樣的性能。

 

 

 

 

 

 

 

 

 

局限性二:

網絡。

雖然SQLite數據庫可以通過網絡文件系統共享,但是與這種文件系統相關的潛在延時會導致性能受損。

更糟的是,網絡文件系統實現中的一些缺陷也使得打開和修改遠程文件--SQLite或其他--很容易出錯。

如果文件系統的鎖實現不當,可能允許兩個客戶端同時修改同一個數據庫文件,這樣必然會導致數據庫出錯。

實際上,並不是因為SQLite的實現導致SQLite不能在網絡文件系統上工作。

相反,SQLite在底層文件系統和有線協議下工作,但是這些技術有時並不完善。

例如,許多NFS使用有缺陷的fcntl(),這意味着鎖可能並不像設想的那樣工作。

一些較新版本的NFS,如Solaris NFSV4就可以工作正常,SQLite需要的鎖機制也是相當可靠的。

然而,SQLite開發者既沒有時間,也沒有資源去驗證任何給定的網絡文件系統在所有的情況下都可以無缺陷工作。

 

 

 

 

 

 

 

 

 

局限說明:

絕大部分限制是有意設計的--它們是SQLite設計的結果。

例如,支持高度的寫並發會帶來很大的復雜性,這將使SQLite的簡單性無法保持。

同樣,作為嵌入式數據庫,SQLite是有意不支持網絡的。

這一點並不奇怪。總之,SQLite不能做的都是它所能做的直接結果。

它開始的設計就是一款模塊化、簡單、緊湊的以及易於使用的嵌入式關系數據庫,它的基礎代碼都在使用它的程序員的掌握范圍內。

從多方面看,它能完成許多其他數據庫不能做的事情,例如,運行在電力消耗實際上是一項制約因素的嵌入式環境中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM