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ù)端程序,。
開發(fā)接口:C, C++, PHP, Java, Delphi, Python .net(有些是第三方廠商開發(fā)的) 嵌入式數(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; } (#) |
|