Dapper.NET을 사용하여 저장 프로시저 호출에서 Oracle OUT 매개 변수 값을 가져옵니다.
편집: 사용Execute
대신 방법Query
/QueryMultiple
메서드, 내OUT_SUCCESS
이제 매개 변수에AttachedParam
와 함께OracleParameter
반환된 값을 가집니다.예를 들어 커서가 아닌 매개변수만 검색하면 됩니다.그럼 제가 쓸 수 있어요Execute
모든 비표준 출력 매개변수를 사용하는 절차의 경우Query
/QueryMultiple
커서 출력 매개 변수만 있는 프로시저의 경우.그러나 흔히 있는 것처럼 커서와 커서가 아닌 출력 매개 변수가 모두 있는 저장 프로시저를 호출해야 하는 경우에는 어떻게 해야 합니까?
사용.Dapper.NET
그리고 내가 성공적으로 반환하고 여러 개의 클래스를 매핑했습니다.IN OUT
REF CURSOR
s, 하지만 단 하나의 가치도 얻을 수 없습니다.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
}
하지만 그들 중 아무 것도 작동하지 않습니다.
- 그
AttachedParam
이라null
이름이 있는 매개 변수의 경우"OUT_SUCCESS"
(파라미터가 존재한다는 것을 알 수 있지만) - 그
gridReader
에서는 응답에서 문자열을 읽는 방법을 모르기 때문에 "시퀀스에 요소가 없습니다"라고 보고합니다. - 이게 가장 가능성이 있어 보입니다.
InvalidArgumentException
그gridReader
는 "멀티매핑 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
'programing' 카테고리의 다른 글
MySQL에서 어떤 조합을 선택해야 합니까? (0) | 2023.07.30 |
---|---|
패딩 구조물을 확장할 때, 왜 여분의 필드를 테일 패딩에 배치할 수 없습니까? (0) | 2023.07.25 |
도메인 간 Ajax 요청을 보내는 Phonegap-Javascript (0) | 2023.07.25 |
시간이 너무 오래 걸리는 경우 MySQL 쿼리를 중지하려면 어떻게 해야 합니까? (0) | 2023.07.25 |
Tableau에 연결할 때 MariaDB의 저장 프로시저가 나타나지 않는 이유는 무엇입니까? (0) | 2023.07.25 |