写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第一种是用的配置反正就是各种配置,最后能实现。第二种跟以前比较接近但是不是完全符合,然后针对现有情况就改了一下现在代码如下
1 #region ExecuteStoredProcForQuery 2 public void ExcuteStoreProcForReturn(String spName, IList<param> param,out object result) 3 { 4 var session = _sessionFactory.OpenSession(); 5 IDbCommand cmd = session.Connection.CreateCommand(); 6 cmd.CommandText = spName; 7 cmd.CommandType = CommandType.StoredProcedure; 8 if (param.Count > 0) 9 { 10 foreach (ParamInfo info in param) 11 { 12 IDbDataParameter parameter = cmd.CreateParameter(); 13 parameter.ParameterName = info.Name; // 14 parameter.Value = info.Value; 15 if (info.Name == "@result") 16 { 17 parameter.Direction = ParameterDirection.Output; 18 } 19 cmd.Parameters.Add(parameter); 20 } 21 } 22 IDbConnection conn = session.Connection; 23 if (conn.State == ConnectionState.Closed) 24 { 25 conn.Open(); 26 } 27 try 28 { 29 cmd.Connection = conn; 30 31 cmd.ExecuteNonQuery(); 32 var sqlParameter = cmd.Parameters["@result"] as SqlParameter; 33 result = sqlParameter != null ? sqlParameter.Value : 5; 34 } 35 catch ( Exception ex) 36 { 37 result = 0; 38 } 39 finally 40 { 41 session.Connection.Close(); 42 } 43 44 45 46 }
如上就是调用存储过程方法,最大的问题是硬编码了参数是通过参数来控制是返回哪一个值的,在得到结果后倒是可以在我的转换之前就先判断类型,以此来得到有返回值的那个参数,然后再赋值。大家有需要自行参考,以上代码可以用。