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 값을 가져 오지 않아야합니다. 내가 지금까지 시도했습니다
어떤 것들은 :
- 매개 변수 변경 DBTYPE (EVENT_ID :.. = 1234567)
- 직접 데이터베이스에있는 절차의 외부 SELECT MAX (... 쿼리를 실행 예상대로 SQL 개발자가 작동하지만 내가 시도
모든 문제가있는 호출 C# API로 Output 매개 변수를 전송하는 것입니다. 많은 봤 거든 Stackoverflow 검색, 그래서 누군가가 작동하는 대답을 도울 수 있기를 바랍니다.
쿼리를 실행하기 전에 C# 출력 매개 변수 (속성 값)의 상태에 대한 세부 정보를 추가 할 수 있습니까? – Igor
매개 변수 값을 읽기 전에 연결을 닫으십시오. – Steve
@Igor 당신이 무엇을 의미하는지/어떻게 할 수 있는지 잘 모르겠습니다. 매개 변수 값은 출력 매개 변수이므로 null입니다. 실행 후 DBNull로 변경됩니다. 스티브, 팁 주셔서 감사합니다, 나는 그것에 대해 생각하지 않았습니다. 불행히도 그건 내 문제를 해결하지 못합니다. 게다가, 나는 연결을 닫지 않고 거의 동일하게 작동하는 다른 프로 시저를 가지고있다. 프로 시저가 레퍼런스 커서를 사용할 때 필요하다. – DevvoX