久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

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

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

嵌入式數(shù)據(jù)庫三雄
     目前,,嵌入式數(shù)據(jù)庫市場主要由三個(gè)產(chǎn)品分割:SQLite,Birkeley DB,,F(xiàn)irebird嵌入服務(wù)器版,巧的是,,這三個(gè)數(shù)據(jù)庫產(chǎn)品都是開源軟件,。

SQLite    主頁:http://www.

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

SQLite的特點(diǎn)如下:

1,、無需安裝配置,應(yīng)用程序只需攜帶一個(gè)動(dòng)態(tài)鏈接庫,。

2,、非常小巧,F(xiàn)or Windows 3.3.8版本的DLL文件才374KB,。

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

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

5,、支持?jǐn)?shù)據(jù)庫大小至2TB。


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

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

Berkeley DB的特點(diǎn)如下:

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


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

Firebird的嵌入版有如下特色:

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


嵌入式數(shù)據(jù)庫特性對比

產(chǎn)品名稱 SQLite   Berkeley DB   Firebird嵌入服務(wù)器版

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

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

從 以上對比中,,我們可以看到,最短小精悍的是SQLite,,它的性能也是最高的,,Berkeley DB比較特殊,因?yàn)樗皇怯肧QL語言來操縱數(shù)據(jù)的,,F(xiàn)irebird嵌入版的體積對比之下顯得稍大了些,,但它對關(guān)系數(shù)據(jù)庫特性的支持是最好的,如果要考 慮到今后或許要將數(shù)據(jù)庫升級成網(wǎng)絡(luò)版本,,就要選Firebird了,。


嵌入式數(shù)據(jù)庫開發(fā)布署舉例
例1、用Delphi開發(fā)基于SQLite的單機(jī)版應(yīng)用程序

因?yàn)镾QLite自帶C,、C++,、Java接口,所以我這里舉用Delphi開發(fā)的例子,。

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

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

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

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

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

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



現(xiàn)在就可以用它開發(fā)你的程序了,,基于SQLite小巧的原因,特別推薦你在布署遠(yuǎn)程應(yīng)用時(shí)用它,,比如監(jiān)控啊,,木馬啊什么的。

OK,,為了使我們的例子更詳細(xì),,下面講講怎么用ASQLite組件創(chuàng)建、連接數(shù)據(jù)庫,,并建立一個(gè)數(shù)據(jù)表。

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

如下圖:


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

DB1.Open;

執(zhí)行完這條語句之后,,如果應(yīng)用程序當(dāng)前目錄下不存在test.sqb文件,則自動(dòng)創(chuàng)建并連接它,。

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

   Query1.StartTransaction;

   try

Query1.Close;

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

Query1.ExecSQL;

Query1.Commit;

   except

Query1.RollBack;

   end;

執(zhí)行完這些語句之后,,在Test.sqb數(shù)據(jù)庫里將創(chuàng)建數(shù)據(jù)表student。

現(xiàn)在,,請將您下載的SQLite的動(dòng)態(tài)鏈接庫sqlite3.dll文件復(fù)制到應(yīng)用程序目錄下,。

之后,可正常運(yùn)行,。

布署時(shí),,也應(yīng)將sqlite3.dll文件一起打包。

例2,、使用C++語言開發(fā)基于Firebird嵌入版的應(yīng)用程序,。

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

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

IBPP主頁:http://www./

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

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

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

示例代碼:

#define IBPP_WINDOWS   //運(yùn)行于Windows平臺的預(yù)先聲明

#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行語句為顯示結(jié)果的,,不同開發(fā)平臺應(yīng)該使用不同的方法演示,請勿直接復(fù)制源代碼,。

布署時(shí),,還應(yīng)該帶上如下文件:fbembed.dll,ib_util.dll,,icudt30.dll,,icuin30.dll,icuuc30.dll,,為了更通用,,還可以帶上VC++ 7.1的運(yùn)行庫msvcp71.dll,msvcr71.dll兩個(gè)文件,。


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

2010年05月25日 星期二 13:07
因 為項(xiàng)目中要用到嵌入式數(shù)據(jù)庫,,現(xiàn)在網(wǎng)上找了一些資料了解了一下嵌入式數(shù)據(jù)。在http://blog.csdn.net/love_study /archive/2009/04/07/4053644.aspx中講得蠻清楚,。綜合各自特點(diǎn),,最后決定選用SQLite。借鑒http: //www.codeproject.com/KB/database/CppSQLite.aspx,,自己寫了一個(gè)小例子,,實(shí)現(xiàn)了創(chuàng)建數(shù)據(jù)庫,,創(chuàng)建表, 添加記錄,,刪除記錄,,查詢記錄,修改記錄等功能,。
#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();   //測試創(chuàng)建一個(gè)新數(shù)據(jù)庫,,并向此數(shù)據(jù)庫添加表,對表中的記錄進(jìn)行增,,刪,,改,查,。

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

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

char sqlStr[512];

//創(chuàng)建表
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, "創(chuàng)建表失敗:%d\n", ret);
return -1;
}
else
{
fprintf(g_pFile, "創(chuàng)建表: %s 成功%\n", g_caTabeName);
}

//插入數(shù)據(jù)
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條數(shù)據(jù),,花費(fèi)%d毫秒\n", GROUP_NUM, endTime - startTime);

//查詢數(shù)據(jù)條數(shù)
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, "查詢記錄條數(shù)失敗");
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);

//列出表中所有的數(shù)據(jù)
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, "查詢記錄條數(shù)失敗");
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);

//修改數(shù)據(jù)
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條數(shù)據(jù), 消耗%d毫秒\n", rowsEffect, endTime - startTime);

//刪除數(shù)據(jù)
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條數(shù)據(jù), 消耗%d毫秒\n", rowsEffect, endTime - startTime);


sqlite3_close(g_pDB);

return 0;
}

(#)


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多