首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 使用 ADO 存取資料庫完整攻略

     編輯:VC++

一、ADO 概述

ADO (ActiveX Data Objects) 是 Microsoft 為 OLE DB 設計的應用層介面,優點在於易用、快速、記憶體耗用少、磁碟足跡小。OLE DB 是 COM 介面集合,封裝 ODBC 功能,統一存取關聯式、非關聯式資料庫、郵件、檔案系統等多樣資料源。ADO 就是連接應用程式與 OLE DB 的橋梁。

二、VC++ 中使用 ADO 開發步驟

1. 匯入 ADO 類型庫

在 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 兩個標頭檔。

2. 初始化 COM 程式庫

在 CWinApp::InitInstance 中:

BOOL CMyApp::InitInstance()
{
    if (!AfxOleInit()) // 初始化 COM
    {
        AfxMessageBox(_T("OLE 初始化失敗!"));
        return FALSE;
    }
    // ...
}

3. ADO 三大核心介面

介面用途
_ConnectionPtr建立資料連線、執行不傳回結果的 SQL(如預存程序)
_CommandPtr執行傳回記錄集的 SQL/預存程序,可使用連線字串或現有連線
_RecordsetPtr記錄集物件,提供最完整的游標控制、鎖定等功能

4. 使用 _ConnectionPtr

_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();

5. 使用 _RecordsetPtr(以 SQL Server 為例)

_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();

6. 使用 _CommandPtr

_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);

7. 資料型別轉換:_variant_t 與 _bstr_t

COM 使用 VARIANT 傳遞資料,CString 不相容。_variant_t、_bstr_t 提供 C++ 型別與 COM 型別雙向轉換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved