在我開始之前,我建議你深吸一口氣並理解,這是一個非常長的問題,並且在單一環境下有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);
它從那時起工作。
考慮到上述問題,
- 我不能用常規方法來調用存儲過程從ASP.NET(CommandType.StoredProcedure)#問題-1以上
- 我不是能夠在插入或更新後從存儲過程返回任何數據或標量值或返回值。 #問題-3以上
- 我無法在代碼級別使用事務。 (它一直在說,分佈式事務已初始化,但實際上我根本沒有分佈式事務!)
爲什麼所有上述最後都在Go Live之後? 這幾乎是甲骨文的問題的噩夢,我已經解決了一個月,一個又一個,這讓我覺得
ODP.NET/ODAC工具是否真的可靠?
如果沒有,那麼什麼是我可以根據自己的經驗去其他的選擇嗎? (請知道ODBC與Oracle 9i也有類似的問題)。
我更可能在下週相似類型的項目的工作,我想這一次我要準備好與更好的辦法。
Oracle 9i不受支持。不應該針對它開發新的應用程序。 –
你應該分解你的問題。這個問題是無法回答的。 –