本节讲述怎么样利用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.gifusing System; 
InBlock.gifusing System.Collections.Generic; 
InBlock.gifusing System.Collections; 
InBlock.gifusing System.Linq; 
InBlock.gifusing System.Text; 
InBlock.gifusing System.Web.UI; 
InBlock.gifusing System.Reflection; 
InBlock.gifusing System.Data; 
InBlock.gifusing NHibernate.Engine; 
InBlock.gifusing NHibernate; 
InBlock.gifusing 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.gifpublic IList ParamStoredProcedure() 
InBlock.gif
InBlock.gif        return session.GetNamedQuery("存储过程名称"
InBlock.gif                .SetInt64(0, 值) 
InBlock.gif                .SetInt64(1, 值) 
InBlock.gif                .List(); 
InBlock.gif