(如果问题似乎重复,请提前道歉。但就我对SF的其他问题看,他们没有回答这个问题。我是NH初学者,所以感谢能够容忍我的菜鸟问技能;谢谢)
如何以编程方式使用NHibernate调用Oracle存储过程?
假设我们在Oracle数据库中有一个存储过程。我怎么称呼它(即使使用NHibernate的原生sql功能)?
答案 0 :(得分:4)
使用ISession.CreateSQLQuery
方法。
var query = session.CreateSQLQuery("EXEC myStoredProc :p1, :p2");
query.SetParameter("p1", "someValue");
query.SetParameter("p2", 5);
使用List
,UniqueResult
或ExecuteUpdate
来运行存储过程。
答案 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);
}