使用IBPP在C++中操作FireBird/Interbase数据库 | 您所在的位置:网站首页 › mysql创建主键自增的表 › 使用IBPP在C++中操作FireBird/Interbase数据库 |
转载地址: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.dllFireBird主页:http://www.ibphoenix.com IBPP主页:http://www.ibpp.org 关于FireBird的中文教程我推荐姚启红编著的《Borland InterBase7.0 应用开发指南》(网上一找一大堆)。 例一,基本应用 #include #include using namespace std; //数据库名,根据你的情况更改。 const char* g_szDBName = "d:\\test.fdb"; //服务器名,针对服务器版本。对于嵌入式,它应该是"" const char* g_szServerName = ""; //这里的用户名和密码是FireBird默认值,对于服务器版,用你自己的密码 //对于嵌入式,就是这个(FireBird嵌入式版没有加密功能)。 const char* g_szUserName = "SYSDBA"; const char* g_szPassword = "masterkey"; int main() { IBPP::Database db = IBPP::DatabaseFactory(g_szServerName, g_szDBName, g_szUserName, g_szPassword); //建立数据库 db->Create(3); //连接数据库 db->Connect(); IBPP::Transaction tr = IBPP::TransactionFactory(db); tr->Start(); try{ IBPP::Statement st = IBPP::StatementFactory(db,tr); //建立数据表 st->Execute( "CREATE TABLE TESTTABLE(" " ID INTEGER NOT NULL PRIMARY KEY," " RNO VARCHAR(10) NOT NULL UNIQUE," " SHIFT VARCHAR(5) NOT NULL" " CHECK(SHIFT IN('A','B','C','D'))," " LINE CHAR(20) NOT NULL," " SL COMPUTED BY(SHIFT||'.'||LINE)," " EMP CHAR(20)" " )" ); tr->CommitRetain(); //插入数据,华安和小强 st->Execute( "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)" "VALUES(1,'B9527','B','DAZHA','Hua,An')" ); st->Execute( "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)" "VALUES(2,'B9528','B','ZHUANGSI','Xiao,Qiang')" ); tr->CommitRetain(); //插入数据,石榴和祝枝山 st->Execute( "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)" "VALUES(3,'B9525','A','DAZHA','Shi,Liu')" ); //SHIFT只能是ABCD,看看写X会有什么情况发生 st->Execute( "INSERT INTO TESTTABLE(ID,RNO,SHIFT,LINE,EMP)" "VALUES(4,'B9526','X','DAZHA','Zhu,ZiShang')" ); tr->Commit(); } catch(IBPP::SQLException &e){ cerr string rno, emp; st->Get("RNO",rno); st->Get("EMP",emp); cout IBPP::Database db; db = IBPP::DatabaseFactory(g_szServerName, g_szDBName, g_szUserName, g_szPassword); //连接数据库 db->Connect(); IBPP::Transaction tr = IBPP::TransactionFactory(db); tr->Start(); try{ IBPP::Statement st = IBPP::StatementFactory(db,tr); //建立数据表 st->ExecuteImmediate( "CREATE TABLE BlobTable(" " ID INTEGER NOT NULL," " RES BLOB)" ); //生成器 st->ExecuteImmediate( "CREATE GENERATOR BlobTable_ID_Gen" ); //触发器 st->ExecuteImmediate( "CREATE TRIGGER BlobTable_BI_ID FOR BlobTable " "ACTIVE BEFORE INSERT POSITION 0 " "AS " "BEGIN " " IF(NEW.ID IS NULL) THEN " " NEW.ID = GEN_ID(BlobTable_ID_Gen, 1); " "END" ); tr->CommitRetain(); st->Prepare("INSERT INTO BlobTable(RES) VALUES(?)"); assert(1 == st->Parameters()); //插入Blob,一块100字节的内存 { IBPP::Blob res = IBPP::BlobFactory(db,tr); res->Create(); char buf[100]; for(int i=0; iWrite(buf,sizeof(buf)); res->Close(); st->Set(1,res); //第一个问号 st->Execute(); } //插入Blob,一串字符串 { st->Set(1,string("HAHAHAHAHAHA...")); st->Execute(); } tr->Commit(); } catch(IBPP::SQLException &e){ cerr int id; IBPP::Blob res = IBPP::BlobFactory(db,tr); st->Get(1,id); st->Get(2,res); //显示Blob内容 res->Open(); int size; res->Info(&size,NULL,NULL); cout cerr |
CopyRight 2018-2019 实验室设备网 版权所有 |