http://blog.csdn.net/love_study/archive/2009/04/07/4053644.aspx 嵌入式数据库与非嵌入式数据库的差别,在于运行模式的差别。并不是运行在嵌入式手持设备上的数据库就是嵌入式数据库,那种数据库我们通常称做嵌入式移动数据库。理论上讲,嵌入式设备一样可以运行网络数据库的服务端程序。
开发接口:C, C++, PHP, Java, Delphi, Python .net(有些是第三方厂商开发的) 嵌入式数据库开发布署举例 例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; } (#) |
|