C++ Builder在運行時創建BDE別名
2019-09-06 23:33:31
供稿:網友
通過bde別名來連接數據庫,確實很方便,然而,那些沒有確定的數據庫,我們卻無法給它創建別名。
而大多數時候,當我們把程序交給別人真正投入使用時,別名的路徑也是不確定的。這就要求我們在程序
運行時動態連接到數據庫。
現在,假設在程序運行目錄下有個通訊錄friends.db,我們要通過tquery、tdatasource等控件來訪問:
本人學習編程不久,如有錯誤或失漏,請不吝賜教
在窗體上添加相關控件
在頭文件中聲明會話句柄
hdbises tmpsession;
要在程序啟動時裝入數據庫,可以如下:
void __fastcall tmainfrm::formcreate(tobject *sender)
{
/tif (query1->state==dsinactive)
/t/t{
/t/t
/t/tdbiinit(null);//bde初始化
/t/tdbistartsession(null,tmpsession,"");//打開一個臨時的bde session
/t/t//設別名路徑為程序所在目錄,要注意前頭要加上"path:"字串
ansistring strpath="path:"+extractfiledir(application->exename);
/t/tdbiaddalias(null,"tmpmyfriends",
/t/t/t"paradox",strpath.c_str(),false);//增加別名完成
/t/tquery1->databasename="tmpmyfriends";//接下來就可如常使用了。
/t/tquery1->active=true;
/t/t}
query1->sql->clear ();
query1->sql->add("select * from friends.db");
query1->open();
}
當程序關閉時,要記得釋放bde占用的資源
void __fastcall tmainfrm::formclose(tobject *sender, tcloseaction &action)
{
/tif (query1->active )
/t/tquery1->active=false;
/tdbiclosesession(tmpsession);//關閉當前會話
/tdbiexit();//放掉bde資源
}
可以說明一下的是dbistartsession和dbiaddalias函數。
dbistartsession函數語法如下:
dbiresult dbifn dbistartsession ([pszname], phses, [pnetdir]);
其中,pszname參數是pchar類型指針,用來為最近打開的session命名,可以是null而讓bde任意指定
;phses參數則用來指定你要找開的session的句柄。pnetdir為指向network路徑的指針,具體我也沒有用過。
函數調用成功,則返回dbierr_none。
/tdbiaddalias函數語法如下:
dbiresult dbiaddalias( [hcfg], pszaliasname, pszdrivertype, pszparams, bpersistent );
其中,hcfg指定要使用的配置文件,設null則把當前session加入配置文件;pszdrivertype指明數據
庫驅動類型,null表示為standard型。bpersitent為bool值,指定是否一直保存別名到配置文件中,如果為
false則要加入的別名只有當前session中使用。函數如調用成功,返回dbierr_none。