2013-04-01 55 views
3

我在Oracle表中創建了一個4,000字符的VARCHAR2字段。我將字符串值插入到使用LINQ to Entities with Visual Studio 2010,.NET Framework 4和ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)的字段中。當我嘗試插入一個字符串值大於1999個字符,我得到了以下內部異常:實體框架和Oracle:不能插入VARCHAR2> 1,999個字符

Oracle.DataAccess.Client.OracleException

ORA-00932:不一致的數據類型:預期 - 有NCLOB

但是,使用SQL Developer時,我可以在字段中插入一個4000字符的字符串值,而不會有任何問題。

存在known ODAC bugsource #2),其中保存到XMLTYPE字段時有2000個字符限制,但我不保存到XMLTYPE字段。我在我的GAC中安裝了Oracle.DataAccess 2.112.3.0,並且考慮升級到上述Oracle軟件的版本5(11.2.0.3.20),但「Visual Studio的Oracle開發工具」是唯一似乎已經從版本4開始更新,我相信「Oracle Data Provider for .NET 4」是需要更新的組件。在我的.NET項目中,System.Data.Entity和System.Data.OracleClient都是運行時版本4.0.30319。

無論如何,我只是想知道是否有其他人遇到這個錯誤,如果有的話,如果有任何解決方案已被發現 - 除了上面提到的使用存儲過程作爲解決方法的Oracle論壇主題中的鏈接。谷歌告訴我,只有在使用XMLTYPE字段時,人們纔會遇到這個錯誤,但我不能是唯一一個在使用VARCHAR2字段時遇到此錯誤的人,可以嗎? (FWIW,我也希望在上面鏈接的Oracle論壇主題中以用戶「997340」的身份收到我的回覆。如果我收到了有用的回覆,我一定會分享這些知識。 )

編輯:如果有幫助,下面是我的代碼中失敗的兩個塊。在排除第一個問題時,我創建了第二個塊,以查看是否有任何區別。在檢查字符串值是否已經插入(「if」語句)以及實際插入字符串值(「AddObject」語句)時,我得到異常。

1:

if (!(from q in db.MSG_LOG_MESSAGE where q.MESSAGE == msg select q.MESSAGE).Any()) 
{ 
    db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg }); 
    db.SaveChanges(); 
} 

2:

if (!db.MSG_LOG_MESSAGE.Any(q => q.MESSAGE == msg)) 
{ 
    db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg }); 
    db.SaveChanges(); 
} 

4月3日更新:

我能夠跟蹤正被髮送到Oracle從 「如果」 SQL語句在上面的第一個代碼塊中。那就是:

SELECT 
CASE WHEN (EXISTS (SELECT 
     1 AS "C1" 
     FROM "SEC"."MSG_LOG_MESSAGE" "Extent1" 
     WHERE ("Extent1"."MESSAGE" = :p__linq__0) 
)) THEN 1 WHEN (NOT EXISTS (SELECT 
     1 AS "C1" 
     FROM "SEC"."MSG_LOG_MESSAGE" "Extent2" 
     WHERE ("Extent2"."MESSAGE" = :p__linq__0) 
)) THEN 0 END AS "C1" 
FROM (SELECT 1 FROM DUAL) "SingleRowTable1" ; 

不幸的是,和我一起工作的DBA沒有提供我與「p_linq_0」參數的值,但如前所述,若超過1999個字符,發生異常。 (當跟蹤這個SQL時,我傳遞了一個4000字符的字符串作爲參數,當然還有一個異常發生。)DBA還提到了某些SQL客戶端的一些問題 - 例如SQL Plus - 無法處理超過2,000個VARCHAR2字符。我並沒有完全遵循。無論使用SQL Plus,SQL Developer還是其他任何工具,Oracle仍然會查詢4000字符的VARCHAR2字段。另外,我的幻數是1,999個字符;不是2000個字符。 DBA是否意味着可以在參數中有多少個字符?更重要的是,當我在SQL Developer中執行這個SQL併爲參數輸入一個4000字符的字符串時,它完美地工作。所以我仍然完全迷惑它爲什麼不通過LINQ to Entities工作。我也試過下面的代碼在我的程序中的「味精」變量運行了4000個字符的字符串類似的查詢,這完美地工作,以及:

using Oracle.DataAccess; 
using Oracle.DataAccess.Client; 
using System.Data; 

... 

OracleConnection conn = new OracleConnection("Data Source=[MASKED];User Id=[MASKED];Password=[MASKED]"); 
conn.Open(); 
OracleCommand cmd = new OracleCommand(); 
cmd.Connection = conn; 
cmd.CommandText = "SELECT message FROM msg_log_message WHERE message = '" + msg + "'"; 
cmd.CommandType = CommandType.Text; 
OracleDataReader dr = cmd.ExecuteReader(); 
dr.Read(); 
string result1 = dr.GetString(0); 
conn.Dispose(); 

現在,我仍然在ODAC指責因爲它涉及到LINQ to Entities ...

回答

4

最新的ODP.NET文檔 - 對於2012年9月份的「11.2 Release 5 Production(11.2.0.3.0)」 - 聲明瞭以下「Entity框架相關提示,限制和已知問題「部分,其中解決了來自問題代碼塊中」if「語句的錯誤:

如果在LINQ/ESQL查詢的WHERE子句中綁定了一個包含2,000個或更多字符的字符串或長度爲4,000字節或更長的字節數組,則可能會遇到「ORA-00932:inconsistent datatypes」錯誤。如果在LINQ/ESQL查詢的WHERE子句中使用映射到BLOB,CLOB,NCLOB,LONG,LONG RAW,XMLTYPE列的實體屬性,則可能會遇到同樣的錯誤。

較早的ODP.NET文檔 - 對於2011年5月份的「11.2.0.3.0版本生產」 - 陳述了相同的已知問題,顯然這是一段時間以來已知的問題。

無論上述文件中提到遇到從問題的代碼塊的「ADDOBJECT」語句相同的錯誤,但這個問題是非常相似的被提及的XMLType領域的另一個已知的問題:

的嘗試將長度等於或大於2,000個字符的字符串綁定到XMLType列或參數時,會遇到「ORA-00932:數據類型不一致:預期 - 得到NCLOB」錯誤。 [錯誤12630958]