2013-04-01 2 views
3

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와 관련된 버그가 있습니다 ...

답변

4

2012 년 9 월의 "11.2 릴리스 5 Production (11.2.0.3.0)"에 대한 최신 ODP.NET 설명서 - "Entity 질문의 코드 블록에있는 "if"문에서 오류를 해결하는 프레임 워크 관련 팁, 제한 및 알려진 문제점 "절을 참조하십시오.

LINQ/ESQL 쿼리의 WHERE 절에 2,000 자 이상의 문자열이나 4,000 바이트 이상의 길이를 갖는 바이트 배열이 바인딩되면 "ORA-00932 : inconsistent datatypes"오류가 발생할 수 있습니다 . BLOB, CLOB, NCLOB, LONG, LONG RAW, XMLTYPE 열에 매핑되는 엔터티 속성이 LINQ/ESQL 쿼리의 WHERE 절에서 사용되는 경우에도 같은 오류가 발생할 수 있습니다.

2011 년 5 월의 "Release 11.2.0.3.0 Production"에 대한 이전 ODP.NET 문서에는 동일한 알려진 문제점이 나와 있으므로 잠시 동안 알려진 문제 일 수 있습니다.

상기 문서의 어느 문제의 코드 블록에서 "AddObject"문에서 같은 오류가 발생 언급,하지만 문제는 언급 XMLType을 필드에 대한 또 다른 알려진 문제와 매우 유사하다 :

"ORA-00932 : 일관되지 않은 데이터 유형 : expected - NCLOB"오류는 XMLType 열 또는 매개 변수의 길이가 2,000 자 이상인 문자열을 바인드 할 때 발생합니다. [버그 12630958]