久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    嵌入式數據庫比較(SQLite Birkeley DB Firebird)

     9loong 2011-03-21
    http://blog.csdn.net/love_study/archive/2009/04/07/4053644.aspx

    嵌入式數據庫與非嵌入式數據庫的差別,在于運行模式的差別。并不是運行在嵌入式手持設備上的數據庫就是嵌入式數據庫,那種數據庫我們通常稱做嵌入式移動數據庫。理論上講,嵌入式設備一樣可以運行網絡數據庫的服務端程序。
          嵌入式數據庫是指運行在本機上、不用啟動服務端的輕型數據庫,它與應用程序緊密集成,被應用程序所啟動,并伴隨應用程序的退出而終止。
          從這個意義上講,似乎所有單機數據庫都可以算嵌入式數據庫,比如Access,Paradox,DBF等等,因為它們都不用啟動數據庫服務器即可使用。然 而,我們通常不將上述數據庫歸入嵌入式數據庫,而只將它們歸入“桌面數據庫”,甚至“文件型數據庫”,因為這些數據庫的完備性、存儲容量及性能方面存在較 大的缺陷。
          嵌入式數據庫支持的數據都是TB文件級別,更由于嵌入式數據庫具備高性能的特點,可以預測,單機數據庫的未來將是嵌入式數據庫的天下。

    嵌入式數據庫三雄
         目前,嵌入式數據庫市場主要由三個產品分割:SQLite,Birkeley DB,Firebird嵌入服務器版,巧的是,這三個數據庫產品都是開源軟件。

    SQLite    主頁:http://www.

    SQLite誕生于2000年5月,這幾年增長勢頭迅猛無比,目前版本是3.3.8。

    SQLite的特點如下:

    1、無需安裝配置,應用程序只需攜帶一個動態鏈接庫。

    2、非常小巧,For Windows 3.3.8版本的DLL文件才374KB。

    3、ACID事務支持,ACID即原子性、一致性、隔離性、和持久性(Atomic、Consistent、Isolated、和 Durable)。

    4、數據庫文件可以在不同字節順序的機器間自由的共享,比如可以直接從Windows移植到Linux或MAC。

    5、支持數據庫大小至2TB。


    Berkeley DB    主頁:http://www.oracle.com/database/berkeley-db/index.html

    Berkeley DB是由美國Sleepycat Software公司開發的一套開放源碼的嵌入式數據庫的程序庫,它于1991年發布,號稱“為應用程序開發者提供工業級強度的數據庫服務”,可謂是老牌悍將。Sleepycat現已被甲骨文(ORACLE)公司收購。

    Berkeley DB的特點如下:

    1、嵌入式,無需安裝配置。
    2、為多種編程語言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP等等。
    3、輕便靈活。它可以運行于幾乎所有的UNIX和Linux系統及其變種系統、Windows操作系統以及多種嵌入式實時操作系統之下。
    4、可伸縮。它的Database library才幾百KB大小,但它能夠管理規模高達256TB的數據庫。它支持高并發度,成千上萬個用戶可同時操縱同一個數據庫。


    Firebird 嵌入服務器版(Embedded Server)   主頁:http://www.
    從Interbase開源衍生出的Firebird,充滿了勃勃生機。雖然它的體積比前輩Interbase縮小了幾十倍,但功能并無閹割。為了體現Firebird短小精悍的特色,開發小組在增加了超級服務器版本之后,又增加了嵌入版本,最新版本為2.0。

    Firebird的嵌入版有如下特色:

    1、數據庫文件與Firebird網絡版本完全兼容,差別僅在于連接方式不同,可以實現零成本遷移。
    2、數據庫文件僅受操作系統的限制,且支持將一個數據庫分割成不同文件,突破了操作系統最大文件的限制,提高了IO吞吐量。
    3、完全支持SQL92標準,支持大部分SQL-99標準功能。
    4、豐富的開發工具支持,絕大部分基于Interbase的組件,可以直接使用于Firebird。
    5、支持事務、存儲過程、觸發器等關系數據庫的所有特性。
    6、可自己編寫擴展函數(UDF)。


    嵌入式數據庫特性對比

    產品名稱 SQLite   Berkeley DB   Firebird嵌入服務器版

    當前版本: 3.3.8、4.5.20、2.0
    速度:最快、快、快
    穩定性:好、好、好
    數據庫容量:2TB、256TB、64TB
    SQL支持:大部份SQL- 92、不支持、完全SQL-92與大部份SQL-99
    Win32平臺下最小體積:374KB、840KB、3.68MB
    數據操縱:SQL、僅應用程序接口、SQL

    開發接口:C, C++, PHP, Java, Delphi, Python .net(有些是第三方廠商開發的)

    從 以上對比中,我們可以看到,最短小精悍的是SQLite,它的性能也是最高的,Berkeley DB比較特殊,因為它不是用SQL語言來操縱數據的,Firebird嵌入版的體積對比之下顯得稍大了些,但它對關系數據庫特性的支持是最好的,如果要考 慮到今后或許要將數據庫升級成網絡版本,就要選Firebird了。


    嵌入式數據庫開發布署舉例
    例1、用Delphi開發基于SQLite的單機版應用程序

    因為SQLite自帶C、C++、Java接口,所以我這里舉用Delphi開發的例子。

    使用組件:第三方組件ASQLite。

    下載地址:http://www./cen/download.php?list.2

    選擇后邊是.D的,就是for Delphi的組件。

    下載解壓之后,即可開始用Delphi打開dpk組件包編譯安裝。

    如果您的Delphi版本比較高,比如是Delphi 2006,那么就編譯asqlite3.dpk與asqlite3pkg.dpk,之后再安裝asqlite3pkg.dpk包即可。

    然后在Delphi組件面板里可以看得到ASQLite組件,如圖:



    現在就可以用它開發你的程序了,基于SQLite小巧的原因,特別推薦你在布署遠程應用時用它,比如監控啊,木馬啊什么的。

    OK,為了使我們的例子更詳細,下面講講怎么用ASQLite組件創建、連接數據庫,并建立一個數據表。

    新 建一個窗體,放一個TASQLite3DB,命名為DB1,將它的Database(數據庫)設為test.sqb,放一個 TASQLite3Query,命名為Query1,將它的Connection指向DB1,然后放入兩個按鈕,第一個按鈕的作用是創建或連接數據庫,第 二個按鈕的作用是建立數據表。

    如下圖:


    “連接”按鈕事件的代碼如下:

    DB1.Open;

    執行完這條語句之后,如果應用程序當前目錄下不存在test.sqb文件,則自動創建并連接它。

    “建表”按鈕事件的代碼如下:

       Query1.StartTransaction;

       try

    Query1.Close;

    Query1.SQL.Text:='create table student(sname vchar(30),age integer)';

    Query1.ExecSQL;

    Query1.Commit;

       except

    Query1.RollBack;

       end;

    執行完這些語句之后,在Test.sqb數據庫里將創建數據表student。

    現在,請將您下載的SQLite的動態鏈接庫sqlite3.dll文件復制到應用程序目錄下。

    之后,可正常運行。

    布署時,也應將sqlite3.dll文件一起打包。

    例2、使用C++語言開發基于Firebird嵌入版的應用程序。

    由于Firebird衍生于Interbase,所以Delphi對它的支持最好,IBX,DBX,Fibplus等都可以直接使用它,只要注意將接口文件改為fbembed.dll即可。在此不再多言。

    對于C++這種最通用的語言,我們有一個更好的組件可以選擇:IBPP。

    IBPP主頁:http://www./

    IBPP是用C++封裝的Firebird接口,最新版本2.5.2.2。

    只要在C++里引用all_in_one.cpp文件,就可以使用它的功能。

    可 以用IBPP:database類連接數據庫,用IBPP::Transaction類控制事務,IBPP::Statement類可以獲取數據集。下面 展示一段代碼,功能為:先連接d:\demo.fdb文件,然后從student表里選擇所有記錄,遍歷所有記錄之后,顯示最后一條記錄的sn與 sname字段。為了使演示更直觀,省去了異常處理。

    示例代碼:

    #define IBPP_WINDOWS   //運行于Windows平臺的預先聲明

    #include "ibpp/all_in_one.cpp"

    ……

    IBPP:database db1;

    db1=IBPP:databaseFactory("","d:/demo.fdb","sysdba","masterkey");

    db1->Connect();

    IBPP::Transaction tr1=IBPP::TransactionFactory(db1,IBPP::amWrite,

    IBPP::ilConcurrency,IBPP::lrWait, IBPP::tfNoAutoUndo);

    tr1->Start();

    IBPP::Statement st1=IBPP::StatementFactory(db1,tr1);

    st1->Prepare("select * from student");

    st1->Execute();

    std::string sn,sname;

    st1->Fetch();

    st1->Get(1,sn);

    st1->Get(2,sname);

    tr1->Commit();

    Label1->Caption=sn.c_str();

    Label2->Caption=sname.c_str();

    最后2行語句為顯示結果的,不同開發平臺應該使用不同的方法演示,請勿直接復制源代碼。

    布署時,還應該帶上如下文件:fbembed.dll,ib_util.dll,icudt30.dll,icuin30.dll,icuuc30.dll,為了更通用,還可以帶上VC++ 7.1的運行庫msvcp71.dll,msvcr71.dll兩個文件。


    工程實例
    http://hi.baidu.com/cokee/blog/item/7ac5bc013a5cb50a1d9583da.html

    2010年05月25日 星期二 13:07
    因 為項目中要用到嵌入式數據庫,現在網上找了一些資料了解了一下嵌入式數據。在http://blog.csdn.net/love_study /archive/2009/04/07/4053644.aspx中講得蠻清楚。綜合各自特點,最后決定選用SQLite。借鑒http: //www.codeproject.com/KB/database/CppSQLite.aspx,自己寫了一個小例子,實現了創建數據庫,創建表, 添加記錄,刪除記錄,查詢記錄,修改記錄等功能。
    #include "sqlite3.h"
    #include <iostream>
    #include <time.h>
    #pragma comment(lib, "sqlite3.lib")

    const char* g_caDBName = "C:\\sqliteDB.db";
    const char* g_caTabeName = "TB_Test";
    sqlite3* g_pDB = NULL;
    FILE* g_pFile = stdout;
    char* g_caErrorMsg = NULL;

    #define GROUP_NUM 100
    char g_groupSqlStr[GROUP_NUM][256] = {0};

    int Test1();   //測試創建一個新數據庫,并向此數據庫添加表,對表中的記錄進行增,刪,改,查。

    int main(int argc, char* argv[])
    {
    Test1();
    system("pause");
    return 0;
    }

    int Test1()
    {
    int ret = SQLITE_ERROR;
    //創建數據庫
    remove(g_caDBName);
    ret = sqlite3_open(g_caDBName, &g_pDB);
    if (!g_pDB)
    {
    fprintf(g_pFile, "創建數據庫失敗: %d\n", ret);;
    return -1;
    }
    else
    {
    fprintf(g_pFile, "創建數據庫: %s 成功\n", g_caDBName);
    }

    char sqlStr[512];

    //創建表
    sprintf(sqlStr, "Create Table %s(fd_id int, fd_name char(20))", g_caTabeName);
    ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
    if (ret != SQLITE_OK)
    {
    fprintf(g_pFile, "創建表失敗:%d\n", ret);
    return -1;
    }
    else
    {
    fprintf(g_pFile, "創建表: %s 成功%\n", g_caTabeName);
    }

    //插入數據
    int i = 0;
    for(; i < GROUP_NUM; ++i)
    {
    sprintf(g_groupSqlStr[i], "Insert into %s values(%d, '%d')", g_caTabeName, i, i);
    }
    clock_t startTime = clock();
    sqlite3_exec(g_pDB, "Begin Transaction;", NULL, NULL, &g_caErrorMsg);
    for(i = 0; i < GROUP_NUM; ++i)
    {
    sqlite3_exec(g_pDB, g_groupSqlStr[i], NULL, NULL, &g_caErrorMsg);
    }
    sqlite3_exec(g_pDB, "Commit Trans;", NULL, NULL, &g_caErrorMsg);
    clock_t endTime = clock();
    fprintf(g_pFile, "插入%d條數據,花費%d毫秒\n", GROUP_NUM, endTime - startTime);

    //查詢數據條數
    const char* pTail;
    sqlite3_stmt* stmt;
    sprintf(sqlStr, "select count(*) from %s", g_caTabeName);
    ret = sqlite3_prepare(g_pDB, sqlStr, strlen(sqlStr), &stmt, &pTail);
    if (ret != SQLITE_OK)
    {
    fprintf(g_pFile, "查詢記錄條數失敗");
    return -1;
    }
    else
    {
    int recordCount = 0;
    ret = sqlite3_step(stmt);
    if (ret != SQLITE_ROW)
    {
    fprintf(g_pFile, "查詢記錄失敗: %d", ret);
    return -1;
    }

    recordCount = sqlite3_column_int(stmt, 0);

    fprintf(g_pFile, "共有%d條記錄\n", recordCount);
    }

    sqlite3_finalize(stmt);

    //列出表中所有的數據
    fprintf(g_pFile, "%10s%10s\n", "ID", "Name");
    sprintf(sqlStr, "select FD_ID, FD_Name from %s", g_caTabeName);
    ret = sqlite3_prepare(g_pDB, sqlStr, strlen(sqlStr), &stmt, &pTail);
    if (ret != SQLITE_OK)
    {
    fprintf(g_pFile, "查詢記錄條數失敗");
    return -1;
    }
    else
    {
    int id;
    char name[256];

    do
    {
    ret = sqlite3_step(stmt);
    if (ret == SQLITE_DONE)
    {
    break;
    }
    else if(ret != SQLITE_ROW)
    {   
    fprintf(g_pFile, "查詢記錄失敗: %d", ret);
    return -1;
    }
    id = sqlite3_column_int(stmt, 0);
    strcpy(name, (const char*)sqlite3_column_text(stmt, 1));
    fprintf(g_pFile, "%10d%10s\n", id, name);
    } while(true);
    }
    sqlite3_finalize(stmt);

    //修改數據
    startTime = clock_t();
    sprintf(sqlStr, "Update TB_Test Set FD_Name = 'New Name' where FD_ID > 40 and FD_ID < 80");
    endTime = clock_t();
    ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
    if (ret != SQLITE_OK)
    {
    fprintf(g_pFile, "修改失敗:%d\n", ret);
    return -1;
    }
    int rowsEffect = sqlite3_changes(g_pDB);
    fprintf(g_pFile, "修改了%d條數據, 消耗%d毫秒\n", rowsEffect, endTime - startTime);

    //刪除數據
    startTime = clock_t();
    sprintf(sqlStr, "Delete from TB_Test where FD_ID > 40 and FD_ID < 80");
    endTime = clock_t();
    ret = sqlite3_exec(g_pDB, sqlStr, NULL, NULL, &g_caErrorMsg);
    if (ret != SQLITE_OK)
    {
    fprintf(g_pFile, "刪除失敗:%d\n", ret);
    return -1;
    }
    rowsEffect = sqlite3_changes(g_pDB);
    fprintf(g_pFile, "刪除了%d條數據, 消耗%d毫秒\n", rowsEffect, endTime - startTime);


    sqlite3_close(g_pDB);

    return 0;
    }

    (#)


      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 12裸体自慰免费观看网站| 亚洲天堂在线观看完整版| 国产精成人品日日拍夜夜| 国产精品美脚玉足脚交欧美| 色欲AV伊人久久大香线蕉影院| 亚洲精品成人福利网站 | 強壮公弄得我次次高潮A片| 国产精品久久久久AV福利动漫| 亚洲a∨国产av综合av| 亚洲AV无码午夜嘿嘿嘿| 清一区二区国产好的精华液| 无码专区 人妻系列 在线| 西西人体44WWW高清大胆| 3d无码纯肉动漫在线观看| 久久精品岛国AV一区二区无码| A级毛片不卡在线播放| 熟妇啊轻点灬大JI巴太粗| 久久久久香蕉国产线看观看伊| 欧美巨大极度另类| 亚洲综合色在线视频WWW| 美日韩在线视频一区二区三区 | VA在线看国产免费| 久久精品娱乐亚洲领先| 国产精品久久久天天影视香蕉| 国产精品剧情亚洲二区| 国内精品久久久久久久小说| 亚洲国产成人久久精品软件| 国产丰满乱子伦无码专区| 久久精品国产亚洲不AV麻豆| 亚洲人成小说网站色在线| 狠狠综合久久AV一区二区| 国产初高中生在线视频| 东京热人妻丝袜无码AV一二三区观| 成A人片亚洲日本久久| 亚洲欧洲精品专线| 中文字幕人妻不卡精品| 国产成人亚洲精品无码青APP| 午夜福利片1000无码免费| 午夜福利高清在线观看| 免费在线黄色电影| 狠狠躁夜夜躁人人爽天天天天|