Oracle 테이블에 4,000 자의 VARCHAR2 필드를 만들었습니다. Visual Studio 2010, .NET Framework 4 및 ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)이있는 LINQ to Entities를 사용하여 문자열 값을 필드에 삽입합니다. 예상 - NCLOBEntity Framework 및 Oracle : VARCHAR2> 1,999 문자를 삽입 할 수 없음
가지고 : 일치하지 않는 데이터 유형을 :Oracle.DataAccess.Client.OracleException
ORA-00932 : 내가 문자열 값을 삽입하는 이상 1999 자 할 때, 나는 다음과 같은 내부 예외가
그러나 SQL Developer를 사용하면 4,000 자의 문자열 값을 필드에 아무런 문제없이 삽입 할 수 있습니다.
XMLTYPE 필드에 저장할 때 2,000 자 제한이 있지만 XMLTYPE 필드에 저장하지 않으려는 known ODAC bug (source #2)이 있습니다. Oracle GAC에서 Oracle.DataAccess 2.112.3.0을 사용하고 있으며 앞서 언급 한 Oracle 소프트웨어를 릴리스 5 (11.2.0.3.20)로 업데이트하는 것을 고려했지만 "Visual Studio 용 Oracle Developer Tools"는 릴리스 4에서 업데이트되었으며 "Oracle Data Provider for .NET 4"는 업데이트가 필요한 구성 요소라고 생각합니다. 내 .NET 프로젝트에서 System.Data.Entity와 System.Data.OracleClient는 모두 런타임 버전 4.0.30319입니다.
어쨌든 다른 누구에게도이 오류가 발생했는지 궁금합니다. 그렇다면 해결책이 발견되면 위의 링크 된 Oracle 포럼 스레드 외에 저장 프로 시저를 사용하여 해결 방법을 제안합니다 . Google은 사람들이 XMLTYPE 필드로 작업 할 때만이 오류가 발생한다고 알려주지 만 VARCHAR2 필드로 작업 할 때이 오류가 발생하는 유일한 사람은 아닙니다.
(FWIW, 위의 링크 된 Oracle 포럼 스레드에서 사용자 "997340"으로 내 게시물에 대한 응답을 받기를 희망합니다.) 유용한 응답을 받으면, 이쪽.)
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();
}
4월 3일 업데이트 : 나는 "만약"에서 오라클로 전송되는 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"매개 변수의 값으로 날을 제공하지 않았다, 그러나 예외가 발생, 1,999자를 초과하는 경우와 같이 이전 말했다. (이 SQL을 추적 할 때 매개 변수로 4,000 자 문자열을 전달했지만 물론 예외가 발생했습니다.) DBA는 또한 SQL Plus와 같은 특정 SQL 클라이언트에 대해 언급했습니다. Plus는 2,000을 넘는 VARCHAR2를 처리 할 수 없습니다 문자. 나는 완전히 따르지 않았다.SQL Plus, SQL Developer 또는 다른 도구를 사용하든 관계없이 Oracle은 4,000 자의 VARCHAR2 필드를 쿼리합니다. 또한, 내 마법의 숫자는 1,999 자입니다. 2,000 자 아니야. DBA는 매개 변수에 몇 개의 문자가있을 수 있는지에 대한 제한이 있음을 의미합니까? 더 중요한 것은 SQL Developer에서이 SQL을 실행할 때 매개 변수에 4,000 자 문자열을 입력하면 완벽하게 작동한다는 것입니다. 그래서 LINQ to Entities를 통해 작동하지 않는 이유에 대해 아직도 혼란 스럽습니다. 나는 아직도 ODAC에 손가락을 가리키는하고, 지금은
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();
: 나는 또한뿐만 아니라 완벽하게 일했다 "MSG"변수에 4,000 문자열과 유사한 쿼리를 실행하는 내 프로그램에서 다음 코드를 시도 엔티티에 대한 LINQ와 관련된 버그가 있습니다 ...