欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
嵌入式數據庫比較(SQLite Birkeley DB Firebird)
http://blog.csdn.net/love_study/archive/2009/04/07/4053644.aspx

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

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

SQLite    主頁(yè):http://www.sqlite.org

SQLite誕生于2000年5月,這幾年增長(cháng)勢頭迅猛無(wú)比,目前版本是3.3.8。

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

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

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

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

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

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


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

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

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

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


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

Firebird的嵌入版有如下特色:

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


嵌入式數據庫特性對比

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

當前版本: 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

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

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


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

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

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

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

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

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

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

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



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

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

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

如下圖:


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

DB1.Open;

執行完這條語(yǔ)句之后,如果應用程序當前目錄下不存在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;

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

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

之后,可正常運行。

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

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

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

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

IBPP主頁(yè):http://www.ibpp.org/

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

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

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

示例代碼:

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

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


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

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

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

int Test1()
{
int ret = SQLITE_ERROR;
//創(chuàng )建數據庫
remove(g_caDBName);
ret = sqlite3_open(g_caDBName, &g_pDB);
if (!g_pDB)
{
fprintf(g_pFile, "創(chuàng )建數據庫失敗: %d\n", ret);;
return -1;
}
else
{
fprintf(g_pFile, "創(chuàng )建數據庫: %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);
}

//插入數據
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);

//查詢(xún)數據條數
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, "查詢(xún)記錄條數失敗");
return -1;
}
else
{
int recordCount = 0;
ret = sqlite3_step(stmt);
if (ret != SQLITE_ROW)
{
fprintf(g_pFile, "查詢(xún)記錄失敗: %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, "查詢(xún)記錄條數失敗");
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, "查詢(xún)記錄失敗: %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;
}

(#)


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
PHP的PDO類(lèi)教程
sqlite教程 - 我的文章 - Jerry
SQLite學(xué)習教程學(xué)習總結
關(guān)于SQLite 與 FireBird 利弊分析
點(diǎn)評主流開(kāi)源數據庫的技術(shù)特點(diǎn) --SQLite 中文社區-- http://www.sqlite.com.cn/
常用嵌入式數據庫概覽 - 嵌入式相關(guān) - 無(wú)為
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久