本节讲述怎么样利用Nhibernate执行SQL和存储过程
InBlock.gif  /// <summary> 
InBlock.gif                 /// 执行sql语句 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="query">sql语句</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 protected IList ExecuteSQL( string query) 
InBlock.gif                { 
InBlock.gif                        IList result =  new ArrayList(); 
InBlock.gif                        ISessionFactoryImplementor s = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); 
InBlock.gif                        IDbCommand cmd = ((NHibernate.Driver.SqlClientDriver)s.ConnectionProvider.Driver).CreateCommand(); 
InBlock.gif                        cmd.CommandText = query; 
InBlock.gif                        IDbConnection conn = s.OpenConnection(); 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                cmd.Connection = conn; 
InBlock.gif                                IDataReader rs = cmd.ExecuteReader(); 
InBlock.gif                                 while (rs.Read()) 
InBlock.gif                                { 
InBlock.gif                                         int fieldCount = rs.FieldCount; 
InBlock.gif                                         object[] values =  new Object[fieldCount]; 
InBlock.gif                                         for ( int i = 0; i < fieldCount; i++) 
InBlock.gif                                                values[i] = rs.GetValue(i); 
InBlock.gif                                        result.Add(values); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                         finally 
InBlock.gif                        { 
InBlock.gif                                s.CloseConnection(conn); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         return result; 
InBlock.gif                }
这个是执行sql语句的,我们再看看执行存储过程的
InBlock.gif  /// <summary> 
InBlock.gif                 /// 执行存储过程 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="spName">存储过程名称</param> 
InBlock.gif                 /// <param name="paramInfos">存储过程(字段-值)对</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 protected IList ExecuteStoredProc( string spName, Dictionary< stringstring> paramInfos) 
InBlock.gif                { 
InBlock.gif                        IList result =  new ArrayList(); 
InBlock.gif                        ISessionFactoryImplementor s = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); 
InBlock.gif                        IDbCommand cmd = ((NHibernate.Driver.SqlClientDriver)s.ConnectionProvider.Driver).CreateCommand(); 
InBlock.gif                        cmd.CommandText = spName; 
InBlock.gif                        cmd.CommandType = CommandType.StoredProcedure; 
InBlock.gif                         // 加入参数 
InBlock.gif                         if (paramInfos !=  null
InBlock.gif                        { 
InBlock.gif                                 foreach (KeyValuePair< stringstring> de  in paramInfos) 
InBlock.gif                                { 
InBlock.gif                                        IDbDataParameter parameter = cmd.CreateParameter(); 
InBlock.gif                                        parameter.ParameterName = de.Key.ToString();  // driver.FormatNameForSql( info.Name ); 
InBlock.gif                                        parameter.Value = de.Value; 
InBlock.gif                                        cmd.Parameters.Add(parameter); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                        IDbConnection conn = s.OpenConnection(); 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                cmd.Connection = conn; 
InBlock.gif                                IDataReader rs = cmd.ExecuteReader(); 
InBlock.gif                                 while (rs.Read()) 
InBlock.gif                                { 
InBlock.gif                                         int fieldCount = rs.FieldCount; 
InBlock.gif                                        List< object> list =  new List< object>(); 
InBlock.gif                                         object[] values =  new Object[fieldCount]; 
InBlock.gif                                         for ( int i = 0; i < fieldCount; i++) 
InBlock.gif                                                values[i] = rs.GetValue(i); 
InBlock.gif                                        result.Add(values); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                         finally 
InBlock.gif                        { 
InBlock.gif                                s.CloseConnection(conn); 
InBlock.gif                        } 
InBlock.gif                         return result; 
InBlock.gif                }
需要引入的命名空间:
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif using System.Web.UI; 
InBlock.gif using System.Reflection; 
InBlock.gif using System.Data; 
InBlock.gif using NHibernate.Engine; 
InBlock.gif using NHibernate; 
InBlock.gif using NHibernate.Cfg;
ok,我们再看我写的Controller
InBlock.gif  public ActionResult Details() 
InBlock.gif                { 
InBlock.gif                        SpringContext.init(); 
InBlock.gif                        SS_CodeDao daoHelper=SpringContext.Context.GetObject( "DaoHelper"as SS_CodeDao; 
InBlock.gif                        IList list = daoHelper.ExecuteSQLQuery( "select * from SS_CODE where len(C_ENAME)>5"); 
InBlock.gif                        ViewData.Model = list; 
InBlock.gif                         return View(); 
InBlock.gif                }
返回给页面一个IList,实际上是一个ArrayList。我们看看页面怎么获取
InBlock.gif<%@ Page Title= "" Language="C# " MasterPageFile="~/Views/Shared/Site.Master " Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 
InBlock.gif 
InBlock.gif<%@ Import Namespace= "Dao" %> 
InBlock.gif<%@ Import Namespace= "System.Web.UI" %> 
InBlock.gif<asp:Content ID= "Content1" ContentPlaceHolderID= "TitleContent" runat= "server"
InBlock.gif        Details 
InBlock.gif</asp:Content> 
InBlock.gif<asp:Content ID= "Content2" ContentPlaceHolderID= "MainContent" runat= "server"
InBlock.gif        <h2> 
InBlock.gif                Details</h2> 
InBlock.gif        <fieldset> 
InBlock.gif                <legend>Fields</legend> 
InBlock.gif                <% IList list = ViewData.Model; %> 
InBlock.gif                <%  for (var i = 0; i < list.Count; i++) 
InBlock.gif                     { 
InBlock.gif                              object[] obj = ( object[])list[i]; 
InBlock.gif                              for ( int j = 0; j < obj.Length; j++) 
InBlock.gif                             { 
InBlock.gif                %> 
InBlock.gif                <div  class= "display-label"
InBlock.gif                        英文名称:</div> 
InBlock.gif                <div  class= "display-field"
InBlock.gif                        <%: obj[0] %></div> 
InBlock.gif                <div  class= "display-label"
InBlock.gif                        中文名称:</div> 
InBlock.gif                <div  class= "display-field"
InBlock.gif                        <%: obj[1]%></div> 
InBlock.gif                <div  class= "display-label"
InBlock.gif                        参数:</div> 
InBlock.gif                <div  class= "display-field"
InBlock.gif                        <%: obj[2]%></div> 
InBlock.gif                <div  class= "display-label"
InBlock.gif                        显示内容:</div> 
InBlock.gif                <div  class= "display-field"
InBlock.gif                        <%: obj[3]%></div> 
InBlock.gif                <div  class= "display-label"
InBlock.gif                        备注:</div> 
InBlock.gif                <div  class= "display-field"
InBlock.gif                        <%: obj[4]%></div> 
InBlock.gif                <% 
InBlock.gif
InBlock.gif                %> 
InBlock.gif                <%} %> 
InBlock.gif        </fieldset> 
InBlock.gif</asp:Content> 
运行结果如下
或者可以采用如下的方式
<sql-query name="存储过程名称">

  <return-scalar column="参数1" type="类型"/>

  <return-scalar column="" type="类型"/>

  exec 存储过程名称 ?, ?
</sql-query>

InBlock.gif public IList ParamStoredProcedure() 
InBlock.gif
InBlock.gif         return session.GetNamedQuery( "存储过程名称"
InBlock.gif                .SetInt64(0, 值) 
InBlock.gif                .SetInt64(1, 值) 
InBlock.gif                .List(); 
InBlock.gif