转载地址:http://blog.sina.com.cn/s/blog_648d306d0100swhc.html
- 在程序目录下查找fbembed.dll
- 在程序目录下查找fbclient.dll
- 依据DefaultInstance注册表键值查找fbclient.dll
- 在系统定义位置查找fbclient.dll
- 在系统定义位置查找gds32.dll
例一,基本应用
- #include
<iostream> - #include
<ibpp.h> - 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 << e.what() << endl; -
tr->Rollback(); -
} -
-
tr->Start(); -
try{ -
IBPP::Statement st = IBPP::StatementFactory(db,tr); -
st->Execute("SELECT RNO, EMP FROM TESTTABLE"); -
//显示SELECT得到的数据 -
while(st->Fetch()) -
{ -
string rno, emp; -
st->Get("RNO",rno); -
st->Get("EMP",emp); -
cout << "RNO:" << rno << " EMP:" << emp << endl; -
} -
tr->Commit(); -
} -
catch(IBPP::SQLException &e){ -
cerr << e.what() << endl; -
tr->Rollback(); -
} - }
- 用工厂函数IBPP::DatabaseFactory生成IBPP::Database实例,然后调用它的Connect()成员变量连接数据库。
- 如果要建立数据库的话,使用Database::Create(int dialect)。其中dialect一般取值为3,它的含义如下:
SQL Dialect | 含义 |
---|---|
1 | 兼容InterBase 5.5及更早版本。 |
2 | 1和3的过渡版本。 |
3 | InterBase 6.0及以后版本,可以使用分隔符,精确数字和时间格式。 |
- 使用工厂函数IBPP::TransactionFactory生成IBPP::Transaction实例,然后用它的Start()开始事务,最后用Commit()来提交事务或Rollback()撤销事务。
- 使用工厂函数IBPP::StatementFactory生成IBPP::Statement实例,然后用它的Execute()来执行SQL命令。
- 值 得注意的是,IBPP中的Database,Transaction,Statement等由工厂函数返回的数据都是智能指针类型,它们能够在退出有效域 时自动执行一些保证完整性的操作。(比如我们使用tr->Start()后即便不调用tr->Commit(),在超出tr变量作用域后系统 也会自动调用Commit的)
例二,操作Blob型字段
- #include
<iostream> - #include
<algorithm> - #include
<assert.h> - #include
<ibpp.h> - 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; -
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; i<100; i++) buf[i]=i; -
res->Write(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 << e.what() << endl; -
tr->Rollback(); -
} -
-
tr->Start(); -
try{ -
IBPP::Statement st = IBPP::StatementFactory(db,tr); -
st->Execute("SELECT * FROM BlobTable"); -
//显示SELECT得到的数据 -
while(st->Fetch()) -
{ -
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 << id << " size is " << size << endl; -
char c; -
while(res->Read(&c,1)) -
{ -
cout << (int)c << ' '; -
} -
cout << endl; -
} -
tr->Commit(); -
} -
catch(IBPP::SQLException &e){ -
cerr << e.what() << endl; -
tr->Rollback(); -
} - }
- 用IBPP::Statement的Prepare()方法准备SQL插入语句,其中的Blob字段使用问号?代替。
- 用工厂函数IBPP::BlobFactory生成一个IBPP::Blob实例,然后分别调用它的Create(),Write()和Close()输入数据,最后用IBPP::Statement的Set()方法写入。
- 所有数据准备就绪后,执行IBPP::Statement的Execute()方法。
- 用IBPP::Statement的Execute()方法或ExecuteImmediate()方法执行SELECT语句。
- 使用IBPP::Statement的Fetch()方法提取出当前行的数据。
- 使用IBPP::Statement的Get()方法取出指定列的数据,如果是Blob类型,则使用IBPP::Blob实例作为输入。
- 最后分别调用IBPP::Blob的Open(),Read()和Close()方法取出数据(IBPP::Blob也是一个智能指针类型,所以上例中没有显式地使用Close()关闭)。