修改:使用Execute
方法代替Query
/ QueryMultiple
方法,我的OUT_SUCCESS
参数现在有一个AttachedParam
,其中{{1}具有返回值的。因此,如果仅 需要检索非游标参数,这将起作用。然后,我可以将OracleParameter
用于具有所有非游标输出参数的过程,并使用Execute
/ Query
用于具有仅游标输出参数的过程。但是,如果我需要调用具有两个游标和非游标输出参数的存储过程,通常就是这种情况呢?
使用QueryMultiple
和OracleDynamicParameters
class我已成功返回并映射了多个Dapper.NET
IN OUT
,但我无法获得单个REF CURSOR
参数的值。
例如,我尝试使用以下规范调用存储过程:
OUT
我为其创建了一个相应的C#类来对其进行建模,其中包含获取PROCEDURE DO_SOMETHING (
OUT_SUCCESS OUT VARCHAR2
)
,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"
报告&#34;序列不包含任何元素&#34;,可能是因为它不知道如何从响应中读取字符串。gridReader
:InvalidArgumentException
建议我&#34;当使用多映射API时,如果你有除Id和#以外的密钥,请确保设置splitOn参数34;但我不确定这与我的问题有什么关系。顺便说一句,我知道该过程已成功执行,因为ODP.NET不会产生异常,我看到结果行在数据库中持久存在。
我不知道如何继续,但我真的很想使用Dapper,因为这是最后一次攀登的障碍。任何帮助总是受到赞赏。
答案 0 :(得分:1)
我知道这是非常晚的,除了我之外,对大多数人来说可能是常识,但是不久前在原始消息中有一条评论,所以我将描述我是如何解决这个问题的。游标输出参数以及非游标输出参数。
由于我的示例只有一个Oracle游标,我可以使用Query方法。其他输出参数的结果在参数本身中,并且可以使用Get&lt;&gt;来检索。 OracleDynamicParameters类中的方法。
对我来说另一个重要的部分是为我的out参数添加一个大小,否则它们将返回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}");
}
}
答案 1 :(得分:0)
关闭连接,然后读取输出参数。