經典 ADO 錯誤:「Cannot start transaction while in firehose mode」或「Cannot create new connection in manual/distributed transaction mode」。根因:Firehose 唯讀前向游標 與 交易/批次模式 互斥。本文透過 MSDN 文檔分析三種錯誤場景,給出解決方案:改用 Recordset.Open 替代 Connection.Execute。
conn.BeginTrans rs.Open "SELECT * FROM Msg", conn -- Firehose 唯讀前向 cmd.ActiveConnection = conn -- 錯誤:同一連線無法同時參與批次與 Firehose
錯誤:Unspecified error (ODBC) / 僅見於 Err 物件。
rs.Open "SELECT * FROM Msg", conn -- 連線進入 Firehose 模式 conn.BeginTrans -- 錯誤:Firehose 模式不可進入交易模式
錯誤:Cannot start transaction while in firehose mode (ODBC/SQL Server)。
rs.Open "SELECT * FROM Msg", conn cmd.ActiveConnection = conn conn.BeginTrans -- 錯誤:連線同時參與 Firehose 與批次
錯誤:Cannot start transaction because more than one hdbc is in use (ODBC/SQL Server)。
-- 正確模式:明確指定游標類型與鎖類型,避免隱式 Firehose rs.CursorLocation = adUseClient -- 客戶端游標 (斷開連線) rs.Open "SELECT * FROM Msg", conn, adOpenStatic, adLockBatchOptimistic conn.BeginTrans -- 後續操作... conn.CommitTrans
adUseClient 將資料取回本地,連線釋放,後續可自由啟動交易。adOpenKeyset / adLockOptimistic (伺服器端游標) 但需確保連線未進入 Firehose。Connection.Execute 返回隱式 Firehose Recordset。Connection.Execute、Recordset.Open 無游標參數)。Command.Execute 直接執行更新 SQL。MultipleActiveResultSets=True (MARS, SQL 2005+) 可緩解但非根治。