Я создал поле 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 к объектам ...