我在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 bug(source #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 ...