如何以编程方式使用NHibernate调用Oracle存储过程?

时间:2011-02-08 12:06:21

标签: oracle nhibernate stored-procedures

(如果问题似乎重复,请提前道歉。但就我对SF的其他问题看,他们没有回答这个问题。我是NH初学者,所以感谢能够容忍我的菜鸟问技能;谢谢)

如何以编程方式使用NHibernate调用Oracle存储过程?

假设我们在Oracle数据库中有一个存储过程。我怎么称呼它(即使使用NHibernate的原生sql功能)?

2 个答案:

答案 0 :(得分:4)

使用ISession.CreateSQLQuery方法。

var query = session.CreateSQLQuery("EXEC myStoredProc :p1, :p2");
query.SetParameter("p1", "someValue");
query.SetParameter("p2", 5);

使用ListUniqueResultExecuteUpdate来运行存储过程。

答案 1 :(得分:0)

您可以在此处调用包含输入和输出变量的sp: https://github.com/lucianoybanez/csharp-useful-functions/blob/master/oracle-nhibernate-sp/OracleNhibernateStoreProcedure.cs

try
    {
        IDbCommand command = new OracleCommand();
        command.Connection = nHibernateSession.Connection;
        command.CommandType = CommandType.StoredProcedure;

        command.CommandText = "SP_NAME";

        command.Parameters.Add(new OracleParameter("@i_userFirstName", "jhon"));
        command.Parameters.Add(new OracleParameter("@i_userLastName", "Doe"));


        OracleParameter outputParameter =
            new OracleParameter("@o_result", OracleDbType.Varchar2, 255)
            {
                Direction = ParameterDirection.Output
            };
        command.Parameters.Add(outputParameter);

        nHibernateSession.Transaction.Enlist((DbCommand)command);

        command.ExecuteNonQuery();

        var result = ((OracleParameter)command.Parameters["@o_result"]).Value;

        if (result != null)
        {
            return result.ToString();
        }
        else
        {
            return string.Empty;
        }
    }
    catch (Exception ex) when (ex.GetType() == typeof(OracleException))
    {
        throw new Exception(ex.Message, ex);
    }