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

2024-01-04

编辑:使用Execute方法而不是Query/QueryMultiple方法,我的OUT_SUCCESS参数现在有一个AttachedParam与 与 与OracleParameter有返回值。因此,例如,如果我需要检索非游标参数,那么这将起作用。然后我可以使用Execute对于具有所有非光标输出参数的过程以及Query/QueryMultiple对于具有光标输出参数的过程。但是,如果我需要调用一个同时具有游标和非游标输出参数的存储过程(通常情况下),该怎么办?

Using Dapper.NETOracleDynamicParameters class https://gist.github.com/vijaysg/3096151我已成功返回并映射了多个IN OUT REF CURSORs,但我无法获取单个值OUT范围。

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

PROCEDURE DO_SOMETHING (
    OUT_SUCCESS    OUT VARCHAR2
)

我为此创建了一个相应的 C# 类来对其进行建模,其中包含获取OracleDynamicParameters, the 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. The AttachedParam is null对于带有名称的参数"OUT_SUCCESS"(虽然我可以看到参数存在)
  2. The gridReader报告“序列不包含元素”,可能是因为它不知道如何从响应中读取字符串。
  3. 这似乎是最有希望的 -InvalidArgumentException: the gridReader建议我“使用多重映射 API 时,如果您有 Id 以外的键,请确保设置 splitOn 参数”,但我不太确定这与我的问题有何关系。

顺便说一句,我确实知道该过程已成功执行,因为 ODP.NET 不会产生异常,并且我看到结果行保留在数据库中。

我不知道如何继续,但我真的很想使用 Dapper,因为这是最后一个需要克服的障碍。任何帮助总是值得赞赏。


我知道这已经太晚了,可能是除了我之外的大多数人的常识,但不久前的原始消息中有一条评论,所以我将描述我如何解决光标输出参数的问题:以及非游标输出参数。

由于我的示例只有一个 Oracle 游标,因此我可以使用 Query 方法。其他输出参数的结果位于参数本身中,可以使用 OracleDynamicParameters 类中的 Get 方法进行检索。

对我来说另一个重要的部分是为我的输出参数添加一个大小,否则它们将以 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}");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Dapper.NET 从存储过程调用获取 Oracle OUT 参数的值 的相关文章

随机推荐