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

时间:2014-04-18 00:19:41

标签: c# oracle ado.net dapper odac

修改:使用Execute方法代替Query / QueryMultiple方法,我的OUT_SUCCESS参数现在有一个AttachedParam,其中{{1}具有返回值的。因此,如果仅 需要检索非游标参数,这将起作用。然后,我可以将OracleParameter用于具有所有非游标输出参数的过程,并使用Execute / Query用于具有游标输出参数的过程。但是,如果我需要调用具有两个游标和非游标输出参数的存储过程,通常就是这种情况呢?

使用QueryMultipleOracleDynamicParameters 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; }
    ...
}

但它们都不起作用:

  1. 对于名称为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 } 的参数,AttachedParamnull(虽然我可以看到参数存在)
  2. "OUT_SUCCESS"报告&#34;序列不包含任何元素&#34;,可能是因为它不知道如何从响应中读取字符串。
  3. 这个似乎是最有希望的 - gridReaderInvalidArgumentException建议我&#34;当使用多映射API时,如果你有除Id和#以外的密钥,请确保设置splitOn参数34;但我不确定这与我的问题有什么关系。
  4. 顺便说一句,我知道该过程已成功执行,因为ODP.NET不会产生异常,我看到结果行在数据库中持久存在。

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

2 个答案:

答案 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)

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