[.NET]XACT_E_TMNOTAVAILABLE(0x8004D01B)

[.NET]XACT_E_TMNOTAVAILABLE(0x8004D01B)

我們有個系統是使用.NET 1.1 + ORACLE,交易是使用MSDTC。

在移機時,卻發生以下的錯誤!

at System.Data.OleDb.OleDbConnection.ProcessResults  <System.Data.OleDb.OleDbException>

沒有錯誤資訊: XACT_E_TMNOTAVAILABLE(0x8004D01B)。 [ OleDbException.ErrorCode : -2147168229 ]
at System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr)
at System.Data.OleDb.OleDbConnection.InitializeProvider()
at System.Data.OleDb.OleDbConnection.Open()

 

後來看到了之前MSDTC的文件,才記起來要改機碼,因為預設裝Oracle Client起來,機碼的DLL跟實際上Oracle Client的bin目錄中的DLL不同,所以才要修改哦!

以下為連接Oracle使用MSDTC要設定的事項。

1.Registry 設定

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI]
     "OracleXaLib"="oraclient9.dll"
     "OracleSqlLib"="orasql9.dll"
     "OracleOciLib"="oci.dll"

註:上述的 oraclient?.dll 與 orasql?.dll  在不同版本的Oracle Client 有不一樣的檔名,請注意進行對應的修改。

例如 Oracle 8 Client 為 oraclient8.dll 與 orasql8.dll;Oracle 8i Client 為 oraclient81.dll 與 orasql81.dll;

例如 Oracle 10g Client 為 oraclient10.dll 與 orasql10.dll。

 

2.權限設定

另外要特別注意的是由於MSDTC 會 存取Oracle Client所安裝的檔案與上述的機碼,因此如果您更改了 MSDTC 的執行身分時(強烈建議您不要隨意更改該設定值,Windows 2000 的預設身分為” 本機系統帳戶”,Windows Server 2003 的預設身分為”NetworkService”),請務必確認該帳號是否具有存取Oracle Client 目錄的權限(NTFS),以及存取上述機碼的權限。否則會發生 2147430328 錯誤或是 XACT_E_TMNOTAVAILABLE(0x8004D01B) 錯誤。更改權限設定後請重新開機。
(注意,若您的Oracle Client 為9.x 版以上且作業系統為Windows Server 2003,請務必將Network Service加入可存取Oracle Client 目錄(例如: c:\oracle\ora92),並重新開機。)

 

3..NET應用程式所選擇的provider

若應用系統使用.NET開發並選擇使用 Microsoft Oracle .NET Managed Provider 或是 Oracle Data Provider for .NET,那麼當你安裝 Oracle Client 時請一併安裝"Oracle Services For Microsoft Transaction Server"

參考資料:

INFO:使用 Microsoft Transaction Server 和 COM+ 來使用 Oracle

PRB: "The Call to the 'GetXaSwitch' Function Failed" Error Message with the Oracle 9.x Client Installed

PRB: Error Messages When a Web Method that Requires a Transaction Accesses Oracle Database

The Microsoft .NET Managed Provider for Oracle depends on the Oramts.dll file to enlist the Oracle connections

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^