在Visual C++中如何利用UDL文件來建立ADO連接
使用通用數(shù)據(jù)連接文件(*.UDL,以下簡稱文件)來創(chuàng)建ADO連接,可以和ODBC一樣可視化地定義要連接的數(shù)據(jù)源,從而實(shí)現(xiàn)數(shù)據(jù)訪問的透明性。
1.使用UDL文件來創(chuàng)建ADO連接
創(chuàng)建ADO的連接,首先要設(shè)置ADO連接對象的ConnectionString屬性,該屬性提供所要連接的數(shù)據(jù)庫類型、數(shù)據(jù)所處服務(wù)器、要訪問的數(shù)據(jù)庫和數(shù)據(jù)庫訪問的安全認(rèn)證信息。比較專業(yè)的方法是在ConnectionString中直接提供以上信息,下面是訪問不同類型數(shù)據(jù)源設(shè)置ConnectionString的標(biāo)準(zhǔn):
訪問ODBC數(shù)據(jù)
"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
訪問ORACLE數(shù)據(jù)庫
"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"
訪問MS SQL數(shù)據(jù)庫
"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;"
訪問ACCESS 數(shù)據(jù)庫
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"
上述的連接屬性設(shè)置標(biāo)準(zhǔn)隨著數(shù)據(jù)源的類型不同而變化,軟件用戶常常不習(xí)慣這種設(shè)置方式,都希望有可視化的數(shù)據(jù)源設(shè)置方法。為此Microsoft提供了通用數(shù)據(jù)連接文件(.UDL)來建立和測試ADO連接屬性。ADO連接對象可以很方便地使用UDL文件來連接數(shù)據(jù)源,下面例子使用my_data1.udl來創(chuàng)建ADO連接。
_ConnectionPtr m_pDBConn;
m_pDBConn.CreateInstance(__uuidof(Connection));
m_pDBConn->ConnectionString ="File Name=c:\mydir\my_data1.udl";
m_pDBConn->Open("","","",NULL);
這樣一來無論數(shù)據(jù)源如何變化,在軟件中都可以用統(tǒng)一的方法編程。當(dāng)數(shù)據(jù)源改變時,只要雙擊相應(yīng)的udl文件即可可視化地設(shè)置數(shù)據(jù)源,無需更改軟件。
因?yàn)?/span>ADO是COM接口,為了軟件的可靠性,打開ADO連接時,可以加入異常處理代碼。
try{
m_pDBConn->Open("","","",NULL);
}catch(_com_error &e){
//處理異常的代碼
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
m_pDBConn=NULL;
}
因?yàn)?/span>_ConnectionPtr m_pDBConn是智能指針,應(yīng)在處理異常代碼時將智能指針設(shè)為NULL后將自動將引用計(jì)數(shù)降為0。
如果不出現(xiàn)異常,只要在使用完m_pDBConn,只要引用Close方法即可。
2.創(chuàng)建你所需的UDL文件
在你所想創(chuàng)建UDL文件的目錄中單擊右鍵,選擇從菜單 新建|Microsoft 數(shù)據(jù)連接,然后將新創(chuàng)建的UDL文件更改為你所希望的文件名(.UDL擴(kuò)展名不能改變)。
注:如果操作系統(tǒng)是Window 2000,先創(chuàng)建一個文本文件,再將該文本文件的擴(kuò)展名改為 "udl"。
然后雙擊所創(chuàng)建的UDL文件,即可視化地完成數(shù)據(jù)源的設(shè)定。
完整示例如下:
#include <iostream>
//#import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
#import "msado25.tlb" rename("EOF", "adoEOF")
using namespace std;
using namespace ADODB;
#pragma warning(disable: 4146) // unary minus operator applied to unsigned type
int main()
{
_ConnectionPtr m_pconnection=NULL;
CoInitialize(NULL);
m_pconnection.CreateInstance(__uuidof(Connection));
if (NULL == m_pconnection)
{
cout<<"The pointer is null!"<<endl;
return -1;
}
try
{
m_pconnection->ConnectionString = "File Name=1.udl";
m_pconnection->Open("","","",NULL);
cout<<"Connect database success!"<<endl;
_RecordsetPtr m_pRecordSet;
m_pRecordSet.CreateInstance(__uuidof(Recordset));
m_pRecordSet->Open("select * from RefEquipmentType_BSS",
(IDispatch *)m_pconnection,
adOpenStatic,
adLockReadOnly,
adCmdText
);
while (!m_pRecordSet->adoEOF)
{
_variant_t tempData0=m_pRecordSet->GetCollect((_variant_t)(long)0);
_variant_t tempData1=m_pRecordSet->GetCollect((_variant_t)(long)1);
cout<<tempData0.iVal<<" : "<<tempData1.bstrVal<<endl;
m_pRecordSet->MoveNext();
}
}
catch (_com_error e)
{
cout<<e.ErrorMessage()<<endl;
}
return 0;
}