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

ADO 入門實戰(一):基礎流程與核心代碼

     編輯:關於VC++

ADO 簡介

ADO (ActiveX Data Objects) 建立於 OLE DB 之上,比 ODBC/DAO/RDO 更簡單易用且不失彈性。

基本流程四步驟

  1. AfxOleInit() 初始化 COM
  2. #import "msado15.dll" no_namespace rename("EOF","adoEOF") 引入型別庫
  3. _ConnectionPtr 建立連線
  4. _RecordsetPtr / _CommandPtr 執行 SQL、處理結果
  5. 用畢 Close()、Release()

連線字串範例

// Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb"
// Access 97
"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\\test.mdb"
// SQL Server (無 DSN)
"Driver={SQL Server};Server=127.0.0.1;Database=db;UID=sa;PWD=123"
// DSN
"DSN=myDSN;UID=sa;PWD=;"

Connection 物件關鍵方法

  • Open(connStr, user, pwd, opt):opt 可指定 adModeReadWrite、adAsyncConnect 等
  • Execute(sql, &recordsAffected, adCmdText):執行不回傳記錄集的 SQL
  • ConnectionTimeout、State 屬性
  • BeginTrans/CommitTrans/RollbackTrans 交易控制

Recordset 開啟三種方式

// 1. Connection.Execute 回傳
_variant_t ra; m_rs = m_conn->Execute("SELECT * FROM t", &ra, adCmdText);

// 2. Command 物件
_CommandPtr cmd; cmd.CreateInstance("ADODB.Command");
cmd->ActiveConnection = m_conn; cmd->CommandText = "SELECT * FROM t";
m_rs = cmd->Execute(&vNull, &vNull, adCmdText);

// 3. Recordset.Open 直接查詢(最靈活)
m_rs->Open("SELECT * FROM t",
           _variant_t((IDispatch*)m_conn, TRUE),
           adOpenStatic, adLockOptimistic, adCmdText);

游標與鎖定類型

游標值特性
adOpenForwardOnly0唯向前、效能最好、無書籤/RecordCount
adOpenKeyset1可見他人更新、不可見新增刪除
adOpenDynamic2完全動態、支援所有移動
adOpenStatic3靜態複本、適合報表
鎖定值特性
adLockReadOnly1唯讀
adLockPessimistic2編輯即鎖定
adLockOptimistic3Update 時才鎖定
adLockBatchOptimistic4批次更新

記錄集遍歷與異動

while (!m_rs->adoEOF) { // 注意:rename("EOF","adoEOF")
    _variant_t v = m_rs->GetCollect("fieldName");
    // 或 m_rs->Fields->GetItem("fieldName")->Value
    m_rs->MoveNext();
}
m_rs->MoveFirst();
m_rs->Delete(adAffectCurrent); // 刪除
m_rs->AddNew(); m_rs->PutCollect("f", val); m_rs->Update(); // 新增
m_rs->Move(1, _variant_t(adBookmarkFirst)); // 移至第二筆
m_rs->PutCollect("f", newVal); m_rs->Update(); // 修改

錯誤處理

catch (_com_error e) {
    AfxMessageBox(e.ErrorMessage());
    // e.WCode() 可取得 HRESULT,如 3127=找不到表、3092=表已存在
}

下一篇預告

Recordset 進階屬性/方法、參數化命令/預存程序、交易處理、BLOB 圖片存取、DataGrid 繫結。

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