programing

Dapper.NET을 사용하여 저장 프로시저 호출에서 Oracle OUT 매개 변수 값을 가져옵니다.

muds 2023. 7. 25. 21:25
반응형

Dapper.NET을 사용하여 저장 프로시저 호출에서 Oracle OUT 매개 변수 값을 가져옵니다.

편집: 사용Execute대신 방법Query/QueryMultiple메서드, 내OUT_SUCCESS이제 매개 변수에AttachedParam와 함께OracleParameter반환된 값을 가집니다.예를 들어 커서가 아닌 매개변수만 검색하면 됩니다.그럼 제가 쓸 수 있어요Execute모든 비표준 출력 매개변수를 사용하는 절차의 경우Query/QueryMultiple커서 출력 매개 변수만 있는 프로시저의 경우.그러나 흔히 있는 것처럼 커서와 커서가 아닌 출력 매개 변수가 모두 있는 저장 프로시저를 호출해야 하는 경우에는 어떻게 해야 합니까?

사용.Dapper.NET그리고 내가 성공적으로 반환하고 여러 개의 클래스를 매핑했습니다.IN OUT REF CURSORs, 하지만 단 하나의 가치도 얻을 수 없습니다.OUT매개 변수

예를 들어 다음 사양을 사용하여 저장 프로시저를 호출하려고 합니다.

PROCEDURE DO_SOMETHING (
    OUT_SUCCESS    OUT VARCHAR2
)

모델화하기 위해 해당 C# 클래스를 생성했으며, 여기에는 다음을 얻는 방법이 포함되어 있습니다.OracleDynamicParameters,그CommandText매개 변수에 대한 자동 압축 속성도 포함됩니다.

public class DO_SOMETHING {
    ... //code to return parameters, etc
    public string OUT_SUCCESS { get; set; }
    ...
}

다음 구문을 모두 시도해 보았습니다.

using (var gridReader = Connection.QueryMultiple(nModel.CommandText(), param: nModel.DynamicParameters(), commandType: nModel.CommandType()))
{
     OUT_SUCCESS = ((OracleDynamicParameters)Model.DynamicParameters()).Get<string>("OUT_SUCCESS"); // 1
     OUT_SUCCESS = gridReader.Read<string>().Single(); //2
     OUT_SUCCESS = gridReader.Read<DO_SOMETHING>().Single().OUT_SUCCESS; //3
}

하지만 그들 중 아무 것도 작동하지 않습니다.

  1. AttachedParam이라null이름이 있는 매개 변수의 경우"OUT_SUCCESS"(파라미터가 존재한다는 것을 알 수 있지만)
  2. gridReader에서는 응답에서 문자열을 읽는 방법을 모르기 때문에 "시퀀스에 요소가 없습니다"라고 보고합니다.
  3. 이게 가장 가능성이 있어 보입니다.InvalidArgumentExceptiongridReader는 "멀티매핑 API를 사용할 때 ID 이외의 키가 있는 경우 splitOn 매개 변수를 설정해야 합니다."라고 알려주지만, 이것이 내 문제와 어떻게 관련이 있는지 잘 모르겠습니다.

그런데, ODP 때문에 절차가 성공적으로 실행되고 있는 것으로 알고 있습니다.NET은 예외를 생성하지 않으며 결과 행이 데이터베이스에 지속됩니다.

어떻게 진행해야 할지 모르겠지만, 저는 Dapper를 정말로 사용하고 싶습니다. 이것이 마지막으로 남은 장애물이기 때문입니다.어떤 도움이든 항상 감사합니다.

이것이 매우 늦고 저를 제외한 대부분의 사람들에게 상식일 수도 있다는 것을 알지만, 얼마 전 원본 메시지에 댓글이 있습니다. 그래서 저는 커서 아웃 매개 변수와 커서 아웃 매개 변수가 없는 문제를 어떻게 해결했는지 설명하겠습니다.

내 예제에는 하나의 Oracle 커서만 있으므로 Query 메서드를 사용할 수 있습니다.다른 out 매개 변수의 결과는 매개 변수 자체에 있으며 Oracle DynamicParameters 클래스의 Get<> 메서드를 사용하여 검색할 수 있습니다.

다른 중요한 부분은 myout 매개 변수에 크기를 추가하는 것이었습니다. 그렇지 않으면 null 또는 빈 문자열로 반환됩니다.

아래는 제가 사용하고 있는 코드의 샘플입니다.

using (IDbConnection db = new OracleConnection(connectionString)) {
    var p = new OracleDynamicParameters();
    p.Add("p_first_parameter", someParameter, OracleDbType.Varchar2, ParameterDirection.Input);
    p.Add("o_cursr", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);
    p.Add("o_sqlerrm", dbType: OracleDbType.Varchar2, direction: ParameterDirection.Output, size: 200);
    p.Add("o_sqlcode", dbType: OracleDbType.Varchar2, direction: ParameterDirection.Output, size: 200);

    dynamic csr = db.Query("myStoredProcedure", p, commandType: CommandType.StoredProcedure).ToList().First();
    string code = p.Get<OracleString>("o_sqlcode").ToString();
    if (code != "0") {
        string errm = p.Get<OracleString>("o_sqlerrm").ToString();
        throw new Exception($"{code} - {errm}");
    }
}

연결을 닫은 다음 출력 매개 변수를 읽습니다.

언급URL : https://stackoverflow.com/questions/23145558/get-value-of-oracle-out-parameter-from-a-stored-procedure-call-using-dapper-net

반응형