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