下面列出了連接三種數(shù)據(jù)庫的語句
CString strConn;
1、連接SQL SERVER
strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);
strServer是服務(wù)器名,如果訪問本地數(shù)據(jù)庫,可是設(shè)strServer = “172.0.0.1”或”.”;這是我試過的,都可以。
dbName是數(shù)據(jù)庫名稱,user, psw是用戶名和密碼。
2、連接ORACLE
trConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);
dbName, user, psw分別是數(shù)據(jù)庫名,用戶名,密碼。
3、連接ACCESS
strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;
Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fnamepath","","",adModeUnknown
dbName是數(shù)據(jù)庫路徑名,如“F:\\DB\\hermes.mdb”,psw是密碼。
設(shè)置了連接語句,下面要和數(shù)據(jù)庫進(jìn)行連接了,對于上面三種數(shù)據(jù)庫都是要執(zhí)行下面這個連接的,下面語句是打一開連接的語句。
connPtr->Open((_bstr_t)strConn, "", "", adModeUnknown);
adModeUnknown:缺省。當(dāng)前的許可權(quán)未設(shè)置
adModeRead:只讀
adModeWrite:只寫
adModeReadWrite:可以讀寫
adModeShareDenyRead:阻止其它Connection對象以讀權(quán)限打開連接
adModeShareDenyWrite:阻止其它Connection對象以寫權(quán)限打開連接
adModeShareExclusive:阻止其它Connection對象以讀寫權(quán)限打開連接
adModeShareDenyNone:阻止其它Connection對象以任何權(quán)限打開連接
4、連接UDL
CString strConnect = "File Name=" + udlDir;
connPtr->Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);
字符串udlDir是udl文件路徑,user和pssw是udl連接數(shù)據(jù)庫的用戶名和密碼。
得到記錄集:
l_pRecordset.CreateInstance("ADODB.Recordset");
l_pRecordset->Open(_bstr_t(l_strSQLConn),
_variant_t((IDispatch*)l_pConnection, true),
adOpenStatic, adLockOptimistic, adCmdText);
l_strSQLConn是select語句
// 遍歷結(jié)果集
while( !l_pRecordset->adoEOF)
{
……// 在這里添加操作結(jié)果集的代碼如:
strTemp = (LPCSTR)(_bstr_t)l_pRecordsetTable->GetCollect(_variant_t((long)i));// 得到某個字段的記錄。
l_pRecordset->MoveNext();
}
對數(shù)據(jù)庫的操作一般使用異常機制。也就是try{…}catch(){..}
注意,一個_RecordsetPtr的對象只能得到一個記錄集,重復(fù)用時就會出錯。當(dāng)要打開兩個數(shù)據(jù)庫時最好定義兩個_RecordsetPtr對象
四、關(guān)閉記錄集和連接
關(guān)閉記錄集:
l_pRecordsetTable->Close();
l_pRecordsetTable = NULL;
關(guān)閉連接:
l_pConnection->Close();
l_pConnection = NULL;
// 釋放環(huán)境
::CoUninitialize();
附加:
l_pRecordset執(zhí)行select語句后就可以得到表的字段名,字段數(shù),字段大小,我寫了三個函數(shù),分別得到指定表的字段數(shù),
指定字段的字段名及字段大小。
// 得到字段名
BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)
{
if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
_variant_t vt((long)nField);
strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));
return true;
}
// 得到字段大小
int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)
{
if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
_variant_t vt((long)nField);
int nSize = RcdPtr->GetFields()->Item[vt]->DefinedSize; // 返回已聲明的字段大小
//int nSize = RcdPtr->GetFields()->Item[vt]->ActualSize; // 返回給定字段中數(shù)據(jù)的實際大小
return nSize;
}
SQL 語句:
得到SQL SERVER的所有用戶類型的表
select name from sysobjects where xtype='U'
得到ORACLE的所有用戶表
select tname from tab where tabtype='TABLE'
得到ACCESS的所有用戶建的表
SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1
SELECT MSysObjects.Name FROM MSysObjects WHERE Type=1