2016-03-02 69 views
1

在我開始之前,我建議你深吸一口氣並理解,這是一個非常長的問題,並且在單一環境下有3-4個問題。所以耐心閱讀。 (如果你需要任何東西,代碼示例或任何其他內容,請寫評論,因爲我認真尋找解決方案)。Oracle .NET數據提供者問題 - 尋找其他選項

最近我一直在與一個客戶端工作,他想要在Oracle應用程序數據庫。該應用程序建立在ASP.NET MVC上。

我們選擇Oracle 11g表示對於開發環境和客戶端已經確認相同。我們決定去支持ORM(EF)的ODAC 32bit .NET Provider。我們首先進行了一個實施CRUD操作的試用案例,一切正常。然後,我們開始制定實際的客戶需求。在2-3個月內產品已準備好交付。所以到現在爲止,ASP.NET和Oracle 11g的所有功能都運行良好。當我們進行部署和UAT時,我們開始知道客戶端使用的是現有的ERP,它與我們開發的版本不匹配。因此,我們在互聯網上搜索了驗證相同的ODAC提供程序是否與Oracle 9i兼容。我們在提到的參考資料中發現它與Oracle 9i兼容。

我們只是數據庫遷移到Oracle 9i服務器,改變EF模型相應,發現以下問題:

1.交易沒有自動提交!

using (TransactionScope transaction = new TransactionScope()) 
{ 
    // some code written here 
} 

相同的代碼11g版本是工作,當移動到Oracle 9i它停止working.Transactions沒有自動using語句完成後提交。我們故意在使用塊中寫入transaction.commit();,並開始工作。

這是預期的行爲?

2.與VARCHAR2數據類型和ODP NET提供商有關的問題。 我們已經在數據庫中創建了一些存儲過程,其中Varchar2和其他數據庫類型作爲參數。在使用ADO.NET風格(OracleConnection,OracleCommand和OracleParameter)訪問這些存儲過程時,我們知道的是,即使數據傳遞給參數的數據的大小小於表的大小,我們也知道有些時候數據類型爲VARCHAR2的參數會截斷數據列被給出。它只是從最後隨機刪除一些字符。 Problem is also logged here in oracle forum

我們無法找到解決方案。

3.內嵌查詢大小限制(字符數)。 爲了解決#2中提到的問題,我們意識到我們應該將這些存儲過程轉換爲內聯查詢,並調用那些使用ADO.NET(在校期間編碼的舊樣式)!我們將所有的存儲過程轉換爲行腳本並寫成以下代碼

OracleCommand command=new OracleCommand("Select * from something",Connection); 

並且對其他DML語句使用相同的技術。現在一切正常,我們執行了UAT,並且我們使應用程序生效。 10-15天后,我們發現奇怪的問題。如果查詢(內聯查詢)的大小超過4000個字符,則Oracle服務器會拋出異常,指出'Query太長而無法執行'(我完全不記得異常或消息,但它與我所寫的相似) 。我們將開發環境中的示例數據以及通過代碼進行調試,並且知道SQL查詢的大小太長,超過32000到64000個字符!我們知道解決這個問題的方法是一樣的'如果我們能以某種方式正確調用存儲過程!'但我們不能,因爲我們沒有任何選擇。

作爲一個解決方案,我們重新創建這些存儲過程在數據庫中,並呼籲那些存儲過程在線!

OracleCommand command=new OracleCommand("BEGIN ProceduretoCall(Param1,Param2); END;",Connection); 

它從那時起工作。

考慮到上述問題,

  1. 我不能用常規方法來調用存儲過程從ASP.NET(CommandType.StoredProcedure)#問題-1以上
  2. 我不是能夠在插入或更新後從存儲過程返回任何數據或標量值或返回值。 #問題-3以上
  3. 我無法在代碼級別使用事務。 (它一直在說,分佈式事務已初始化,但實際上我根本沒有分佈式事務!)

爲什麼所有上述最後都在Go Live之後? 這幾乎是甲骨文的問題的噩夢,我已經解決了一個月,一個又一個,這讓我覺得

ODP.NET/ODAC工具是否真的可靠?

如果沒有,那麼什麼是我可以根據自己的經驗去其他的選擇嗎? (請知道ODBC與Oracle 9i也有類似的問題)。

我更可能在下週相似類型的項目的工作,我想這一次我要準備好與更好的辦法。

+1

Oracle 9i不受支持。不應該針對它開發新的應用程序。 –

+0

你應該分解你的問題。這個問題是無法回答的。 –

回答

0

我強烈建議每個隔離貴點作爲一個單獨的問題。每一個都是特定的,並有它自己的問題,這將是一個混亂,保持直線。

其次,我同意意見。即使在2003年發佈的Oracle 10gR1也不受支持。也許你需要事先不問這個問題來接受一些責任,但是我也不認爲你也沒有理由說他們會使用受支持的oracle版本。

這就是說,我會採取快速刺:

  1. 的TransactionScope從未autocommits。你需要添加transaction.Complete()。唯一出乎意料的行爲是WAS之前提交的。

  2. 引用的文章提到的問題是在Oracle proceedures的重新編譯解決,並表示甲骨文的補丁集能解決問題。如果是這種情況,我不認爲這是一個odp.net問題。如果你想要的話,你可以粘貼proc簽名,以及如何添加參數,看看是否有一些你可以嘗試的tweeks。但是,我再次發佈一個單獨的問題。

3。2 - 我不確定你是如何返回標量的 - 你需要一個參數的refcursor,我不知道如何創建一個匿名塊會改變它。再次,我認爲你需要發佈更多的代碼,特別是你如何發送參數。

3.3 - 當事務包含多個連接時,即使它們位於同一個數據庫,TransactionScope也會自動從本地事務轉換爲分佈式連接。不過,我認爲這個功能在11g之前是不支持的,而且以前所有的事務都是以分佈式的方式開始的。但是,我不確定9i甚至有這個概念可能解釋了你所看到的奇怪的自動提交。

ODP.net在過去的7年裏對我來說是完全可靠的。也就是說,我一直使用支持的Oracle版本來運行該版本,併爲該版本設置了相當最新的補丁。

+0

我完全理解,並有事件想到將這些問題分解成不同的問題,但不能獲得上下文...正如你看到後面的問題是彼此相關的... Oracle 9i不支持?它受到支持,但不能按預期工作。 –

+0

關於其他評論, TransactionScope會自動提交,就像微軟所說的那樣,這對MSSQL來說一直在爲我工作。 在參考文章中,您可以再次檢查,即使在重新編譯軟件包之後,也有像我這樣的人無法解決此問題! (在我的情況下,我沒有包裹,我不介意重新編寫我的程序)。 我是如何返回標量的?使用MSSQL中的返回值,但由於存儲過程停止工作,我沒有任何選擇。 –

+0

我應該同意並交叉檢查第3.3點(我對同一個數據庫有多個連接),這可能是其中一個原因。謝謝你指出! –

相關問題