编辑:使用Execute方法而不是Query / QueryMultiple方法,我的OUT_SUCCESS参数现在有一个AttachedParam,其中包含一个具有返回值的OracleParameter.因此,如果我只需要检索非游标参数,那么这将起作用.然后,我可以将Execute用于具有所有非游标输出参数的过程,并将Query / QueryMultiple用于仅具有游标输出参数的过程.但是,如果我需要调用具有游标和非游标输出参数的存储过程,通常就是这种情况呢?
使用Dapper.NET和OracleDynamicParameters class我已成功返回并映射了多个IN OUT REF CURSOR,但我无法获得单个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("OUT_SUCCESS"); // 1
OUT_SUCCESS = gridReader.Read().Single(); //2
OUT_SUCCESS = gridReader.Read().Single().OUT_SUCCESS; //3
}
但它们都不起作用:
>对于名称为“OUT_SUCCESS”的参数,AttachedParam为null(尽管我可以看到参数存在)
> gridReader报告“序列不包含任何元素”,可能是因为它不知道如何从响应中读取字符串.
>这个看起来最有前途–InvalidArgumentException:gridReader建议我“当使用多映射API确保你设置splitOn参数,如果你有除Id以外的密钥”,但我不确定这是如何与我的问题.
顺便说一句,我知道该过程正在成功执行,因为ODP.NET不会产生异常,我看到结果行在数据库中持久存在.
我不知道如何继续,但我真的很想使用Dapper,因为这是最后一次攀登的障碍.任何帮助总是受到赞赏.