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 );

         仅需几个接口即可完成全部操作。

原创文章 17 获赞 7 访问量 4654

猜你喜欢

转载自blog.csdn.net/tan_kaishuai/article/details/105448427