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

Visual C++ 中使用 ADO 進行資料庫程式設計完整指南

     編輯:關於VC++

專案建立與 COM 初始化

// App::InitInstance
BOOL CMyApp::InitInstance() { AfxOleInit(); /* ... */ return TRUE; }
// App::ExitInstance
int CMyApp::ExitInstance() { ::CoUninitialize(); return CWinApp::ExitInstance(); }

引入 ADO 型別庫

// stdafx.h
#include 
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","adoEOF")
  • comdef.h 提供 _variant_t、_bstr_t 等智慧型別
  • rename 避免 EOF 命名衝突

智慧指標與 ListCtrl 範例

class CMyDlg : public CDialog {
    _ConnectionPtr m_conn; _RecordsetPtr m_rs; CListCtrl m_list;
    // ...
    void OnQuery() {
        m_list.DeleteAllItems();
        m_conn.CreateInstance(__uuidof(Connection));
        m_rs.CreateInstance(__uuidof(Recordset));
        try {
            m_conn->Open("DSN=ADOTest", "", "", 0);
            m_rs->Open("SELECT * FROM middle", _variant_t((IDispatch*)m_conn),
                       adOpenDynamic, adLockOptimistic, adCmdText);
            while (!m_rs->adoEOF) {
                _variant_t v = m_rs->GetCollect("BIG_NAME");
                if (v.vt != VT_NULL) m_list.AddString((char*)_bstr_t(v));
                m_rs->MoveNext();
            }
        } catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); }
        // 關閉順序嚴禁重複
        if (m_rs)  { m_rs->Close(); m_rs = NULL; }
        if (m_conn){ m_conn->Close(); m_conn = NULL; }
    }
};

Execute / Command / Recordset.Open 三種查詢方式

(內容同 9267 文章,此處不重複)

通用查詢封裝函式

void ExecuteSQL(_ConnectionPtr conn, _RecordsetPtr rs, CString sql) {
    try {
        rs->Open(sql.AllocSysString(), _variant_t((IDispatch*)conn),
                 adOpenDynamic, adLockOptimistic, adCmdText);
    } catch (_com_error e) {
        AfxMessageBox(e.Description());
        if (e.WCode()==3127) AfxMessageBox("資料表不存在");
        if (e.WCode()==3092) AfxMessageBox("資料表已存在");
    }
}

記錄集異動完整範例

// 遍歷、刪除首筆、新增三筆、修改第二筆年齡
m_rs->Open("SELECT * FROM users", ...);
while(!m_rs->adoEOF) { /* TRACE 輸出 */ m_rs->MoveNext(); }
m_rs->MoveFirst(); m_rs->Delete(adAffectCurrent);
for(int i=0;i<3;i++) { m_rs->AddNew(); m_rs->PutCollect("ID",i+10); /* ... */ }
m_rs->Move(1, _variant_t(adBookmarkFirst));
m_rs->PutCollect("age", 45L); m_rs->Update();

關鍵提醒

  • 嚴禁多次 Close(),否則觸發存取違規
  • _variant_t/_bstr_t 大幅簡化 COM 型別轉換
  • 錯誤代碼 e.WCode() 可針對性處理(如 3127/3092)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved