2016-08-12 3 views
0

Oracle SQL Server의 패키지 내에 저장 프로 시저가 있습니다. 이 절차에는 입력 및 출력 매개 변수가 있습니다. 프로 시저 자체가 작동하고 Oracle SQL Developer에서 실행될 때 출력 매개 변수는 예상 출력 (마지막 행의 열 값)을 읽습니다. 이 프로 시저는 ODP.NET (Oracle Managed Data Access)을 통해 웹 API에 의해 호출되어야합니다.C# ODB.NET 출력 매개 변수는 항상 DBNull입니다.

문제점 : ODP의 Long 유형과 db의 NUMBER (12,0) 유형의 출력 매개 변수는 절대로 리턴되지 않습니다. 출력 매개 변수는 명령을 실행 한 후에 항상 DBNull입니다. 다음은

이 (다른 매개 변수를 생략) 내 코드의 관련 부분은 다음과 같습니다 [패키지 절차 :

PROCEDURE post_event (event_id OUT OPIS_REGISTRATIE_PROJ.PROJECT_ID%TYPE) 
IS BEGIN 
-- Some stuff that's happening (that works) 
SELECT MAX(PROJECT_ID) INTO event_id FROM OPIS_REGISTRATIE_PROJ WHERE PERSOON_ID = worksheet_id; 
END; 

사용되는 매개 변수 :

parameters.Add(new OracleParameter("event_id", OracleDbType.Long, ParameterDirection.Output)); 

C#에서 호출 코드 :

if (con.State == ConnectionState.Open) 
{ 
    // Create command and set parameters 
    using (var cmd = new OracleCommand(cmdText, con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     foreach (var p in parameters) 
     { 
      cmd.Parameters.Add(p); 
     } 

     // Execute the stored procedure 
     try 
     { 
      cmd.ExecuteNonQuery(); 
     } 
     catch (OracleException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

long paramEventId = 0; 
if (cmd.Parameters["event_id"].Value != DBNull.Value) 
{ 
    paramEventId = (long)(OracleDecimal)cmd.Parameters["event_id"].Value; 
} 

자세히 알 수있는 바와 같이, D BNull 값이지만 문제는 아닙니다. DBNull 값을 가져 오지 않아야합니다. 내가 지금까지 시도했습니다

어떤 것들은 :

  • 이 값으로 하드 코딩 EVENT_ID을 설정합니다 (I 올바르게 매개 변수 유형에 대해 오류가 다른 사람들과) INT64 및 다른 사람에
    • 매개 변수 변경 DBTYPE (EVENT_ID :.. = 1234567)
    • 직접 데이터베이스에있는 절차의 외부 SELECT MAX (... 쿼리를 실행 예상대로 SQL 개발자가 작동하지만 내가 시도

    모든 문제가있는 호출 C# API로 Output 매개 변수를 전송하는 것입니다. 많은 봤 거든 Stackoverflow 검색, 그래서 누군가가 작동하는 대답을 도울 수 있기를 바랍니다.

  • +0

    쿼리를 실행하기 전에 C# 출력 매개 변수 (속성 값)의 상태에 대한 세부 정보를 추가 할 수 있습니까? – Igor

    +0

    매개 변수 값을 읽기 전에 연결을 닫으십시오. – Steve

    +0

    @Igor 당신이 무엇을 의미하는지/어떻게 할 수 있는지 잘 모르겠습니다. 매개 변수 값은 출력 매개 변수이므로 null입니다. 실행 후 DBNull로 변경됩니다. 스티브, 팁 주셔서 감사합니다, 나는 그것에 대해 생각하지 않았습니다. 불행히도 그건 내 문제를 해결하지 못합니다. 게다가, 나는 연결을 닫지 않고 거의 동일하게 작동하는 다른 프로 시저를 가지고있다. 프로 시저가 레퍼런스 커서를 사용할 때 필요하다. – DevvoX

    답변

    0

    내 질문에 언급했듯이 출력 매개 변수의 DbType을 Int64로 변경하려고했습니다. 검토 할 때 DbType.Long으로 선언 된 또 다른 (IN OUT) 매개 변수가 있음을 발견했습니다. 하나를 변경할 때, 나는 다른 하나를 변경하지 않았으므로 여전히 오류가있었습니다.

    내가지고 있다고 오류 :

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    이 솔루션은 : OracleDbType.Int64로 모든 OracleDbType.Long 매개 변수를 변경 .

    뒤늦은 지평에서의 쉬운 대답. 아직도 이것이 왜 문제인지 이해할 수 없습니다.
    Long이 Int64의 동일/별칭이 아니겠습니까?

    불편을 끼쳐 드려서 죄송하며 노력하고 도와 주셔서 감사드립니다. :)
    누군가 내 질문/답변으로 (유사한) 문제를 해결할 수 있기를 바랍니다.

    +0

    'OracleDbType.Long' 긴 ** 문자열 ** 최대 2 기가 바이트에 사용되는 Oracle 데이터 유형 [LONG] (https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i3056)에 해당합니다. 연령대에 따라 'LONG'데이터 형식이 사용되지 않으며 많은 함수가이 유형을 지원하지 않습니다! 또한보십시오 [C# : 오라클 데이터 유형 동등성과 OracleDbType] (http://stackoverflow.com/questions/1583150/c-oracle-data-type-equivalence-with-oracledbtype) –

    +0

    @WernfriedDomscheit 아, 감사합니다, 몰랐어요. . 왜 작동하지 않을지 설명합니다 :) – DevvoX