使用IBPP在C++中操作FireBird/Interbase数据库

2022-06-29 00:00:00 数据 字段 执行 嵌入式 方法

转载地址:http://blog.sina.com.cn/s/blog_648d306d0100swhc.html

FireBird是一种小巧的关系型数据库,它有多种版本,包括服务器版(象MySQL),单机版(象Access)以及嵌入式(象SQLite)。而且不管是服务器版还是嵌入式版它都完整支持视图、触发器、存储过程等SQL特性。

问题是它提供的C API“不太友好”,不容易掌握(特别是我),所以我一直只会在C++Builder里编程使用FireBird(因为FireBird源于 Borland的InterBase,VCL库自带了InterBase的组件),直到有一天我发现了IBPP...

IBPP是 一个FireBird/Interbase数据库API的C++包装,使用起来也比较简单,只要把IBPP源码目录里的 "core/all_in_one.cpp"加入工程,在代码中包含头文件"ibpp.h",后根据操作系统预定义一个IBPP_WINDOWS或 IBPP_UNIX的宏即可。

另外,当然还要安装FireBird客户端,如果只是学习,我们可以下载嵌入式版本。IBPP首先要找到FireBird的动态库,在Windows下, IBPP在下面的路径中查找:

  • 在程序目录下查找fbembed.dll
  • 在程序目录下查找fbclient.dll
  • 依据DefaultInstance注册表键值查找fbclient.dll
  • 在系统定义位置查找fbclient.dll
  • 在系统定义位置查找gds32.dll

FireBird主页:http://www.ibphoenix.com

IBPP主页:http://www.ibpp.org

关于FireBird的中文教程我推荐姚启红编著的《Borland InterBase7.0 应用开发指南》(网上一找一大堆)。

例一,基本应用

  1. #include <iostream>
  2. #include <ibpp.h>
  3. using namespace std;
  4.  
  5. //数据库名,根据你的情况更改。
  6. const charg_szDBName "d:\\test.fdb";
  7. //服务器名,针对服务器版本。对于嵌入式,它应该是""
  8. const charg_szServerName "";
  9.  
  10. //这里的用户名和密码是FireBird默认值,对于服务器版,用你自己的密码
  11. //对于嵌入式,就是这个(FireBird嵌入式版没有加密功能)。
  12. const char   g_szUserName "SYSDBA";
  13. const charg_szPassword "masterkey";
  14.  
  15. int main()
  16. {
  17.     IBPP::Database db IBPP::DatabaseFactory(g_szServerName,
  18.         g_szDBName,
  19.         g_szUserName,
  20.         g_szPassword);
  21.     //建立数据库
  22.     db->Create(3);
  23.     //连接数据库
  24.     db->Connect();
  25.  
  26.     IBPP::Transaction tr IBPP::TransactionFactory(db);
  27.     tr->Start();
  28.     try{
  29.         IBPP::Statement st IBPP::StatementFactory(db,tr);
  30.         //建立数据表
  31.         st->Execute(
  32.             "CREATE TABLE TESTTABLE("
  33.                ID INTEGER NOT NULL PRIMARY KEY,"
  34.                RNO VARCHAR(10) NOT NULL UNIQUE,"
  35.                SHIFT VARCHAR(5) NOT NULL"
  36.                    CHECK(SHIFT IN('A','B','C','D')),"
  37.                LINE CHAR(20) NOT NULL,"
  38.                SL COMPUTED BY(SHIFT||'.'||LINE),"
  39.                EMP CHAR(20)"
  40.                )"
  41.             );
  42.         tr->CommitRetain();
  43.         //插入数据,华安和小强
  44.         st->Execute(
  45.             "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)"
  46.             "VALUES(1,'B9527','B','DAZHA','Hua,An')"
  47.         );
  48.         st->Execute(
  49.             "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)"
  50.             "VALUES(2,'B9528','B','ZHUANGSI','Xiao,Qiang')"
  51.         );
  52.  
  53.         tr->CommitRetain();
  54.         //插入数据,石榴和祝枝山
  55.         st->Execute(
  56.             "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)"
  57.             "VALUES(3,'B9525','A','DAZHA','Shi,Liu')"
  58.         );
  59.         //SHIFT只能是ABCD,看看写X会有什么情况发生
  60.         st->Execute(
  61.             "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)"
  62.             "VALUES(4,'B9526','X','DAZHA','Zhu,ZiShang')"
  63.         );
  64.         tr->Commit();
  65.     }
  66.     catch(IBPP::SQLException &e){
  67.         cerr << e.what() << endl;
  68.         tr->Rollback();
  69.     }
  70.  
  71.     tr->Start();
  72.     try{
  73.         IBPP::Statement st IBPP::StatementFactory(db,tr);
  74.         st->Execute("SELECT RNO, EMP FROM TESTTABLE");
  75.         //显示SELECT得到的数据
  76.         while(st->Fetch())
  77.         {
  78.             string rno, emp;
  79.             st->Get("RNO",rno);
  80.             st->Get("EMP",emp);
  81.             cout << "RNO:" << rno << EMP:" << emp << endl;
  82.         }
  83.         tr->Commit();
  84.     }
  85.     catch(IBPP::SQLException &e){
  86.         cerr << e.what() << endl;
  87.         tr->Rollback();
  88.     }
  89. }

相关文章