2011-07-01 72 views
11

我正在開發一個應用程序,該應用程序應該長期運行並通過ODP.NET廣泛使用Oracle(11g)數據庫。試圖在Oracle 11g中使用ODP.NET讀取或寫入受保護的內存

但是,偶爾會發生一次(每2或3天)ODP.NET拋出System.AccessViolationException,然後應用程序需要重新啓動。這裏是我的堆棧跟蹤:

Unhandled exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. 
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
at Oracle.DataAccess.Client.OpsSql.Prepare2(IntPtr opsConCtx, IntPtr& opsErrCtx, IntPtr& opsSqlCtx, IntPtr& opsDacCtx, OpoSqlValCtx*& pOpoSqlValCtx, string pCommandText, IntPtr& pUTF8CommandText, OpoMetValCtx*& pOpoMetValCtx, Int32 prmCnt) 
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonquery() 

堆棧跟蹤的其餘部分是不時不同,並指從我的應用程序的內部調用。

現在,我在問這裏之前做了大量的研究,但是我沒有發現任何結論。許多其他人顯然也遇到了同樣的問題,但根本原因似乎有很大差異。我真的希望有人有這個解決方案:-)

在一個不相關的說明,看起來這個異常是能夠忽略我的catch {}塊,並導致應用程序崩潰每次它發生。那是因爲它與內存損壞問題有關嗎?

問候, 安德烈

編輯:進一步的調查使我相信,這可能是值得入手的「分佈式事務協調器」服務,看看是否異常停止被拋出。你怎麼看?

+2

僅供參考,它忽略您的try/catch塊的原因是因爲當代碼的非託管部分崩潰時,它佔用整個dot.net堆棧。 – tsells

回答

7

這是一個錯誤。 11.1和11.2提供者有這個問題。要解決這個問題的唯一方法是安裝11.2.0.2客戶端,然後應用補丁6.

5

在構建我的OracleCommand對象,並添加參數...

我發現,從改變:

select.Parameters.Add("Result", OracleDbType.RefCursor); 

要:

select.Parameters.Add("Result", OracleDbType.RefCursor, ParameterDirection.Output); 

的11.2.0.2客戶端上解決了這個問題對我來說。

2

我們經歷了同樣的AccessViolationException因爲REFCURSOR被宣佈爲輸入參數,而不是輸出

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Input); 

對於這樣一個簡單的錯誤,這是一個苛刻的信息。改變參數方向確定了錯誤。

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Output); 
相關問題