2013-04-01 4 views
3

Я создал поле VARCHAR2 объемом 4000 символов в таблице Oracle. Я вставляю строковые значения в поле, используя LINQ to Entities с Visual Studio 2010, .NET Framework 4 и ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0). При попытке вставить значение строки больше, чем 1,999 символов, я получаю следующее внутреннее исключение:Entity Framework & Oracle: не удается добавить VARCHAR2> 1,999 Персонажи

Oracle.DataAccess.Client.OracleException

ORA-00932: несовместимые типы данных: ожидалось - получил NCLOB

Однако я могу вставить в поле значение 4000 символов в поле без каких-либо проблем при использовании SQL Developer.

Существует known ODAC bug (source #2), в котором при сохранении в поле XMLTYPE существует ограничение 2000 символов, но я не сохраняю его в поле XMLTYPE. У меня есть Oracle.DataAccess 2.112.3.0 в моем GAC, и я рассмотрел обновление до версии 5 (11.2.0.3.20) вышеупомянутого программного обеспечения Oracle, но «Oracle Developer Tools для Visual Studio» - единственный компонент, который, как представляется, был обновлено с версии 4, и я считаю, что «поставщик данных Oracle для .NET 4» - это компонент, который нуждается в обновлении. В моем проекте .NET System.Data.Entity и System.Data.OracleClient являются версией 4.0.30319.

В любом случае, мне просто интересно, встретил ли кто-нибудь еще эту ошибку, и если да, то если какое-либо решение было найдено - кроме того, что было описано в разделе форума Oracle, связанного выше, который предлагает использовать хранимые процедуры в качестве обходного пути , Google сообщает мне, что люди сталкиваются с этой ошибкой только при работе с полями XMLTYPE, но я не могу быть единственным человеком, который сталкивается с этой ошибкой при работе с полем VARCHAR2, могу ли я?

(FWIW) Я также надеюсь получить ответ на мое сообщение в качестве пользователя «997340» в теме форума Oracle, которая приведена выше. Если я получу полезный ответ, я обязательно поделюсь знаниями о этот конец.)

EDIT: В случае, если это помогает, ниже приведены два блока в моем коде, которые не работают. Во втором блоке я создал второй блок, чтобы выяснить, есть ли разница. Я получаю исключение, проверяя, были ли уже вставлены строковые значения (операторы 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(); 
} 

3 апреля UPDATE:

я смог проследить SQL, отправляемого в Oracle с "если" в первом блоке кода выше. Вот оно:

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-символьную строку в качестве параметра, и, конечно же, возникло исключение.) Администратор баз данных также упомянул кое-что о некоторых SQL-клиентах, таких как SQL Plus - не имея возможности обрабатывать VARCHAR2 более 2000 персонажи. Я не полностью следовал.Используя SQL Plus, SQL Developer или любой другой инструмент, Oracle по-прежнему будет запрашивать поле VARCHAR2 емкостью 4000 символов. Кроме того, мое магическое число составляет 1999 символов; не 2000 символов. Возможно ли, что DBA означает, что существует ограничение на количество символов в параметре? Что еще более важно, когда я выполняю этот SQL в SQL Developer, и я ввожу 4000-символьную строку для параметра, он отлично работает. Поэтому я все еще совершенно смущен тем, почему он не работает через LINQ для Entities. Я также попытался следующий кодом в моей программе, чтобы запустить подобный запрос со строкой в ​​4000 символов в переменном «MSG», которая работала отлично, а также:

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 к объектам ...

ответ

4

Последняя документация по ODP.NET - для «11.2 Release 5 Production (11.2.0.3.0)» с сентября 2012 года содержит следующую известную проблему в разделе «Entity» Раздел «Связанные советы, ограничения и известные проблемы», в котором рассматривается ошибка из операторов «if» в кодовых блоках вопроса:

Ошибка «ORA-00932: непоследовательные типы данных» может возникнуть, если строка из 2000 или более символов или массив байтов длиной 4000 или более связана с предложением WHERE запроса LINQ/ESQL , Та же ошибка может возникнуть, если свойство сущности, которое сопоставляется столбцу BLOB, CLOB, NCLOB, LONG, LONG RAW, XMLTYPE, используется в предложении WHERE запроса LINQ/ESQL.

Старая документация ODP.NET - для выпуска «Release 11.2.0.3.0 Production» с мая 2011 года - заявляет тот же известный вопрос, поэтому, по-видимому, это была известная проблема на некоторое время.

Ни один из вышеупомянутой документации упоминает встретив ту же ошибку, из заявления «AddObject» в кодовых блоках на вопросе, но этот вопрос очень похож на другую известную проблему для XMLType полея, упоминаются:

An «Ошибка ORA-00932: непоследовательные типы данных: ожидается - полученная NCLOB» будет обнаружена при попытке привязать строку, которая равна или превышает 2000 символов в столбце или параметре XMLType. [Ошибка 12630958]