C/C++ 连接使用嵌入式数据库 InterBase / Firebird
嵌入式数据库与非嵌入式数据库的差别,在于运行模式的差别。并不是运行在嵌入式手持设备上的数据库就是嵌入式数据库,那种数据库我们通常称做嵌入式移动数据库。理论上讲,嵌入式设备一样可以运行网络数据库的服务端程序。
从这个意义上讲,似乎所有单机数据库都可以算嵌入式数据库,比如Access,Paradox,DBF等等,因为它们都不用启动数据库服务器即可使用。然而,我们通常不将上述数据库归入嵌入式数据库,而只将它们归入“桌面数据库”,甚至“文件型数据库”,因为这些数据库的完备性、存储容量及性能方面存在较大的缺陷。
嵌入式数据库支持的数据都是TB文件级别,更由于嵌入式数据库具备高性能的特点,可以预测,单机数据库的未来将是嵌入式数据库的天下。
嵌入式数据库三雄
目前,嵌入式数据库市场主要由三个产品分割:SQLite,Birkeley DB,Firebird嵌入服务器版。
嵌入式数据库特性对比
产品名称 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了。
Firebird 嵌入服务器版(Embedded Server) 主页:http://www.firebirdsql.org
从Interbase开源衍生出的Firebird,充满了勃勃生机。虽然它的体积比前辈Interbase缩小了几十倍,但功能并无阉割。为了体现Firebird短小精悍的特色,开发小组在增加了超级服务器版本之后,又增加了嵌入版本,新版本为2.0。
Firebird的嵌入版有如下特色:
1、数据库文件与Firebird网络版本完全兼容,差别仅在于连接方式不同,可以实现零成本迁移。
2、数据库文件仅受操作系统的限制,且支持将一个数据库分割成不同文件,突破了操作系统大文件的限制,提高了IO吞吐量。
3、完全支持SQL92标准,支持大部分SQL-99标准功能。
4、丰富的开发工具支持,绝大部分基于Interbase的组件,可以直接使用于Firebird。
5、支持事务、存储过程、触发器等关系数据库的所有特性。
6、可自己编写扩展函数(UDF)。
C/C++ 连接使用嵌入式数据库 InterBase / Firebird 可以使用IBBP,但用法较为复杂。这里介绍另一种更方便、也更强大的连接方式。
github 项目地址:Any_DataBase_Viewer
https://github.com/tankaishuai/Any_DataBase_Viewer
Any_DataBase_Viewer 支持 FireBird、Access、Sqlite、 WMI、及 SQL Server、MySQL、Oracle等多种其他基于ODBC数据库格式,并使用完全一致的统一接口操作各个数据库。这里我们只使用其开放的 /sdk/Db32_interface.h :
(1) 连接数据库:
IDb32 *handle = win32db_open( L"firebird:C:\\mydb\\test.db", NULL, NULL );
连接字符串以 firebird: 开头,如果要连接其他类型的数据库,可以使用: sqlite:,wmi:,mysql:, ado: 等等。
(2) 执行SQL,插入数据:
win32db_exec( handle, L"insert into t_test values(1, 3.14, 'Zhang 3')", 0 );
(3) 执行SQL,查询数据:
if(win32db_exec( handle, L"select * from t_test", 0 )){
win32db_fetch( handle, 0, 0, OnFetchCallback, NULL );
}
其中,回调函数:OnFetchCallback
bool OnFetchCallback(
long lRows, long lCols, long lNumCols, //当前行数、当前列数、总列数
const void *varKey, bool bIsUnicodeKey, //FieldName
const VARIANT *varVal, //FieldValue
void *pUser){ //用户自定义数据,win32db_fetch() 后一个参数传入
if(bIsUnicodeKey){
// 其他类型数据库可能返回 unicode 的数据库成员
const wchar_t *szFieldName = (const wchar_t *)varKey;
... ...
}else{
// Firebird 总是返回 ANSI 的数据库成员
const char *szFieldName = (const char *)varKey;
... ...
}
return true;
}
(4) 遍历当前的所有表:
if(win32db_schema( handle, DB32_SCHEMA_DEFAULT, NULL )){
win32db_fetch( handle, 0, 0, OnFetchCallback, NULL );
}
(5) 关闭数据库连接:
win32db_close( handle );
仅需几个接口即可完成全部操作。
————————————————
版权声明:本文为CSDN博主「tan_kaishuai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tan_kaishuai/article/details/105448427
相关文章