當使用Oracle Database Link時,因涉及兩台以上的Oracle Server,自動啟用Distributed Transaction可以被理解(SQL Server亦是如此)。但網路上的討論似乎都集中火力在避免啟用Distributed Transaction上,而不是研究怎麼順利啟用它。Anyway,我試出兩種成功的做法。第一種是用ORACLE提供的OLEDB,關鍵是要將Registry中的HKLM\SOFTWARE\ORACLE\OLEDB\DistribTX由1改為0,表示停用分散式交易(我懷疑這會導致所有的Oracle OLEDB操作都失去分散式交易的能力,值得留意)。程式碼如下:
1: static void testOraOle()
2: { 3: OleDbConnection cn =
4: new OleDbConnection(
5: "Provider=OraOLEDB.Oracle; Data Source=Ora1; " +
6: "User Id=blah; Password=blahblah;");
7: cn.Open();
8: OleDbCommand cmd =
9: new OleDbCommand("select * from myTable@Ora2", cn); 10: OleDbDataReader dr = cmd.ExecuteReader();
11: while (dr.Read())
12: Console.WriteLine(dr[0].ToString());
13: dr.Close();
14: cn.Close();
15: }
1: static void testOraODP()
2: { 3: //程式碼要宣告using ODP = Oracle.DataAccess.Client;
4: ODP.OracleConnection cn =
5: new ODP.OracleConnection(
6: "Data Source=Ora1; User Id=blah; Password=blahblah; " +
7: "Enlist=false;");
8: cn.Open();
9: ODP.OracleCommand cmd =
10: new ODP.OracleCommand("select * from myTable@Ora2", cn); 11: ODP.OracleDataReader dr = cmd.ExecuteReader();
12: while (dr.Read())
13: Console.WriteLine(dr[0].ToString());
14: dr.Close();
15: cn.Close();
16: }
至於System.Data.OracleClient,在我的測試中,即使加上Enlist=false仍會傳回相同錯誤,是否註定無法支援或仍有其他的解法,暫時不得而知,若有人有成功案例再反應給我吧!