使用 `Recordset::Update` 寫入資料時拋出例外:「無法更新,當前記錄被鎖定」。常見於批次新增/修改大量記錄、並發存取或游標/鎖定類型設定不當。
將一組寫入操作包裝在交易中,確保原子性並減少鎖定衝突。
try {
conn->BeginTrans();
for (int i = 0; i < n; ++i) {
rs->AddNew();
rs->PutCollect("Field1", val1);
rs->PutCollect("Field2", val2);
// ... 其他欄位
rs->Update(); // 單筆寫入
}
conn->CommitTrans();
} catch (_com_error& e) {
conn->RollbackTrans();
AfxMessageBox(_T("寫入失敗:") + e.ErrorMessage());
}
注意:交易不宜過長,避免長時間持有鎖導致死結。
直接執行 `INSERT INTO ...` 避開 Recordset 游標鎖定機制,效能更佳。
CString sql;
sql.Format(_T("INSERT INTO MyTable (F1, F2) VALUES ('%s', %d)"), val1, val2);
conn->Execute(_bstr_t(sql), NULL, adExecuteNoRecords);