使用Dapper.NET从存储过程调用中获取Oracle OUT参数的值

tac*_*cos 9 c# oracle ado.net odac dapper

编辑:使用Execute方法而不是Query/ QueryMultiple方法,我的OUT_SUCCESS参数现在有一个AttachedParam带有OracleParameter返回值的with .因此,如果我需要检索非游标参数,那么这将起作用.然后我可以使用Execute所有非游标输出参数的程序和Query/ QueryMultiple用于光标输出参数的程序.但是,如果我需要调用已存储的过程光标和非游标输出参数,这是常有的情况?

使用Dapper.NETOracleDynamicParameters我已经成功返回并映射了多个IN OUT REF CURSORs,但是我无法获得单个OUT参数的值.

例如,我试图使用以下规范调用存储过程:

PROCEDURE DO_SOMETHING (
    OUT_SUCCESS    OUT VARCHAR2
)
Run Code Online (Sandbox Code Playgroud)

为此我创建了一个相应的C#类来对其进行建模,其中包含获取OracleDynamicParameters,CommandText等等的方法,还包括每个参数的自动实现属性

public class DO_SOMETHING {
    ... //code to return parameters, etc
    public string OUT_SUCCESS { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下所有语法:

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
}
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用:

  1. AttachedParamnull与名称的参数"OUT_SUCCESS"(虽然我可以看到参数存在)
  2. gridReader该"序列不包含任何元素",可能是因为它不知道如何读一个串出响应的报告.
  3. 这个似乎是最有希望的 - InvalidArgumentException:gridReader建议我"当使用多映射API确保你设置splitOn参数,如果你有Id以外的键",但我不确定这是如何与我的问题相关.

顺便说一句,我知道该过程成功执行,因为ODP.NET不会产生异常,我看到结果行在数据库中持久存在.

我不知道如何继续,但我真的很想使用Dapper,因为这是最后一次攀登的障碍.任何帮助总是受到赞赏.

Car*_*man 0

关闭连接,然后读取输出参数。