同一 TransactionScope 內連續呼叫兩次 Database.ExecuteReader,第一條 SQL 故意非法(捕獲異常忽略),第二條合法,執行第二條時拋出:
InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is closed.
DAAB 內部 ExecuteReader 邏輯(簡化):
public virtual IDataReader ExecuteReader(DbCommand command) {
ConnectionWrapper wrapper = GetOpenConnection(false);
try {
PrepareCommand(command, wrapper.Connection);
if (Transaction.Current != null)
return DoExecuteReader(command, CommandBehavior.Default); // 共用連線,不自動關閉
else
return DoExecuteReader(command, CommandBehavior.CloseConnection);
} catch {
wrapper.Connection.Close(); // 異常時關閉連線
throw;
}
}
當環境異常(Transaction.Current != null)時,DAAB 共用同一 DbConnection 與 DbTransaction。第一次 ExecuteReader 發生異常進入 catch,連線被關閉。第二次嘗試使用同一已關閉連線,故失敗。
ExecuteNonQuery 驗證、或捕獲異常後手動重新開啟連線(不推薦)。ExecuteNonQuery 或 ExecuteScalar 先檢查,或捕獲異常後 Transaction.Current 標記為 rollback 並重新開啟新 Transaction。