ADO (ActiveX Data Objects) 是 Microsoft 為 OLE DB 設計的應用層介面,優點在於易用、快速、記憶體耗用少、磁碟足跡小。OLE DB 是 COM 介面集合,封裝 ODBC 功能,統一存取關聯式、非關聯式資料庫、郵件、檔案系統等多樣資料源。ADO 就是連接應用程式與 OLE DB 的橋梁。
在 stdafx.h 中加入:
#import "C:\\Program Files\\Common Files\\System\\ADO\\msado15.dll" \
no_namespace rename("EOF", "adoEOF")
no_namespace:不使用 ADO 命名空間rename("EOF", "adoEOF"):避免與 C++ 標準庫 EOF 衝突編譯器會自動產生 msado15.tlh、msado15.tli 兩個標頭檔。
在 CWinApp::InitInstance 中:
BOOL CMyApp::InitInstance()
{
if (!AfxOleInit()) // 初始化 COM
{
AfxMessageBox(_T("OLE 初始化失敗!"));
return FALSE;
}
// ...
}
| 介面 | 用途 |
|---|---|
_ConnectionPtr | 建立資料連線、執行不傳回結果的 SQL(如預存程序) |
_CommandPtr | 執行傳回記錄集的 SQL/預存程序,可使用連線字串或現有連線 |
_RecordsetPtr | 記錄集物件,提供最完整的游標控制、鎖定等功能 |
_ConnectionPtr pConn;
if (FAILED(pConn.CreateInstance(__uuidof(Connection))))
return;
CString strConn = _T("Driver=SQL Server;Server=myserver;Database=mydb;UID=sa;PWD=;");
_bstr_t bstrConn(strConn);
if (FAILED(pConn->Open(bstrConn, _T(""), _T(""), adConnectUnspecified)))
return;
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CString strSQL = _T("INSERT INTO student(no,name,sex,address) VALUES(3,'aaa','male','beijing')");
pConn->Execute(_bstr_t(strSQL), &vtOptional, adCmdText);
pConn->Release();
_RecordsetPtr pRs;
pRs.CreateInstance(__uuidof(Recordset));
CString strConn = _T("Driver=SQL Server;Server=210.46.141.145;Database=mydb;UID=sa;PWD=sa");
CString strSQL = _T("SELECT id,name,gender,address FROM personal");
_variant_t varConn(strConn), varSQL(strSQL);
if (FAILED(pRs->Open(varSQL, varConn, adOpenStatic, adLockOptimistic, adCmdText)))
return;
while (!pRs->GetadoEOF())
{
_variant_t varId = pRs->GetCollect(_T("id"));
_variant_t varName = pRs->GetCollect(_T("name"));
_variant_t varGender = pRs->GetCollect(_T("gender"));
_variant_t varAddr = pRs->GetCollect(_T("address"));
CString strId = (char*)_bstr_t(varId);
CString strName = (char*)_bstr_t(varName);
// ... 顯示至 List Control
pRs->MoveNext();
}
pRs->Close();
pRs->Release();
_CommandPtr pCmd;
_RecordsetPtr pRs;
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConn; // 使用現有連線
pCmd->CommandText = _T("SELECT * FROM student");
pCmd->CommandType = adCmdText;
pRs = pCmd->Execute(NULL, NULL, adCmdUnknown);
_variant_t varVal = pRs->GetCollect(_T("name"));
CString strVal = (char*)_bstr_t(varVal);
COM 使用 VARIANT 傳遞資料,CString 不相容。_variant_t、_bstr_t 提供 C++ 型別與 COM 型別雙向轉換。