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

VC++ ADO 執行 Update 異常「無法更新」的三大解決方案

     編輯:VC 教學

現象

使用 ADO Recordset::Update() 或 UpdateBatch() 時拋出「無法更新」錯誤,常見於批量新增、游標類型不匹配、欄位資料類型衝突等場景。

方案一:使用事務 (Transaction) 確保原子性

將批量操作包裝在事務中,任何單條失敗自動回滾,避免部分提交導致資料不一致。

try {
    m_pConnection->BeginTrans();
    for (int i = 0; i < nCount; ++i) {
        m_pRecordset->AddNew();
        m_pRecordset->PutCollect("Field1", _variant_t(strVal));
        m_pRecordset->PutCollect("Field2", _variant_t(dateVal));
        // ... 其他欄位
        m_pRecordset->Update(); // 逐條 Update 或最後 UpdateBatch
    }
    m_pConnection->CommitTrans();
}
catch (_com_error& e) {
    m_pConnection->RollbackTrans();
    // 記錄錯誤
}

注意:事務不宜過長,避免鎖升級導致死鎖;建議批次提交 (如每 500 條)。

方案二:改用 SQL INSERT 陳述式

繞過 Recordset 更新機制,直接執行參數化 INSERT,效能更高、錯誤更明確。

CString sql = _T("INSERT INTO MyTable (Col1, Col2, Col3) VALUES (?, ?, ?)");
_CommandPtr pCmd; pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = m_pConnection;
pCmd->CommandText = _bstr_t(sql);
pCmd->Prepared = TRUE;

for (int i = 0; i < nCount; ++i) {
    pCmd->Parameters->Refresh(); // 首次取得參數資訊
    pCmd->Parameters->GetItem(0)->Value = _variant_t(val1[i]);
    pCmd->Parameters->GetItem(1)->Value = _variant_t(val2[i]);
    pCmd->Parameters->GetItem(2)->Value = _variant_t(val3[i]);
    pCmd->Execute(NULL, NULL, adExecuteNoRecords);
}

方案三:檢查資料格式與空值約束

  • 非空欄位:確認 PutCollect 未傳入 VT_EMPTY 或 VT_NULL (除非資料庫允許 NULL)。
  • 資料類型匹配:_variant_t 自動轉型,但日期、數值精度、字串長度超限會導致更新失敗。
  • 主鍵/唯一索引衝突:自動編號欄位勿手動賦值;唯一鍵重複會拋錯。
  • 游標類型:需支援更新的游標 (adOpenKeyset, adOpenDynamic, adOpenStatic + adLockOptimistic/adLockBatchOptimistic)。

快速排查清單

  1. 錯誤訊息中 HRESULT 查找 ADO Error 0x800A0CB3 (Object or provider is not capable of performing requested operation) → 游標/鎖類型不支援。
  2. 檢查 Recordset->State 是否 adStateOpen。
  3. 嘗試 Recordset->UpdateBatch(adAffectAll) 替代單條 Update。
  4. 啟用 ADO 追蹤 (_ConnectionPtr->Properties["Trace"] = true) 觀察底層 SQL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved