在NHibernate里执行存储过程

NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库,来源于非常优秀的基于JavaHibernate 关系型持久化工具.
在NHibernate里怎么执行存储过程呢?下面有一个简单的例子,使用的MS SQL Server 2000 NorthWind库里的CustOrderHist存储过程.
先建2个实体类:
1.CustOrderHist : Customer Historical Order Summary
    ///   <summary>
    
///  Customer Historical Order Summary Object Entity Class
    
///   </summary>
     public   class  CustOrderHist
    {
        
private   string  productName;
        
private   int  total;

        
///   <summary>
        
///  Constructor
        
///   </summary>
        
///   <param name="productName"> Product Name </param>
        
///   <param name="total"> Total Quantity </param>
         public  CustOrderHist (  string  productName, int  total)
        {
            
this .productName  =  productName;
            
this .total  =  total;
        }

        
///   <summary>
        
///  Product Name
        
///   </summary>
         public   string  ProductName
        {
            
get  {  return  productName; }
        }

        
///   <summary>
        
///  Total Quantity
        
///   </summary>
         public   int  Total
        {
            
get  {  return  total; }
        }

        
///   <summary>
        
///  Return Product Name And Quantity
        
///   </summary>
        
///   <returns></returns>
         public   override   string  ToString ( )
        {
            
return   " Product Name :  "   +  productName  +   " ; Quantity:  "   +  total;
        }
    }

映射关系:
<? xml version="1.0" encoding="utf-8"  ?>
< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.2" >
  
< sql-query  name ="GetCustomerOrderHistory" >
    
< return-scalar  column ="ProductName"  type ="String"   />
    
< return-scalar  column ="Total"  type ="int"   />
    exec CustOrderHist :CustomerID
  
</ sql-query >
</ hibernate-mapping >

2.Customer:Customer表的2个字段:CustomerID And CompanyName 提供选择CustomerID
///   <summary>
    
///  Customer Object Entity Class
    
///   </summary>
     public   class  Customer
    {
        
private   string  customerID;
        
private   string  companyName;

        
///   <summary>
        
///  Customer ID
        
///   </summary>
         public   string  CustomerID
        {
            
get  {  return  customerID; }
            
set  { customerID  =  value; }
        }

        
///   <summary>
        
///  Company Name
        
///   </summary>
         public   string  CompanyName
        {
            
get  {  return  companyName; }
            
set  { companyName  =  value; }
        }
    }

映射关系:
<? xml version="1.0" encoding="utf-8"  ?>
< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.2" >
  
< class  name ="NHibernate.Study.Entity.Customer,Entity"  table ="Customers" >
    
< id  name ="CustomerID" >
      
< column  name ="CustomerID"  sql-type ="string"  length ="5" />
      
< generator  class ="assigned"   />
    
</ id >
    
< property  name ="CompanyName" >
      
< column  name ="CompanyName"  sql-type ="string"  length ="40" />
    
</ property >
  
</ class >
</ hibernate-mapping >
再来看看Data Object Access Class:
    public   class  BllExecPro : IDisposable
    {
        
private  ISession session  =   null ;

        
public   void  Dispose ( )
        {
            session.Dispose( );
        }

        
public  BllExecPro ( )
        {
            session 
=  NHLibrary.NHFactory.OpenSession( );
        }

        
public  IList < Customer >  getCustomerIDList ( )
        {
            
return  session.CreateQuery(  " FROM Customer "  )
                .SetMaxResults( 
10  )
                .List
< Customer > ( );
        }

        
public  IList < CustOrderHist >  getCustOrderHistList (  string  customerID )
        {
            IQuery query 
=  session.GetNamedQuery(  " GetCustomerOrderHistory "  )
                .SetString( 
" CustomerID "  , customerID )
                .SetResultTransformer(
                    
new  NHibernate.Transform.AliasToBeanConstructorResultTransformer(
                    
typeof ( CustOrderHist ).GetConstructors( )[ 0 ] ) );
            
return  query.List < CustOrderHist > ( );
        }
    }
页面 HTML:
< form  id ="form1"  runat ="server" >
    
< div >
        
< asp:DropDownList  ID ="DropDownList1"  runat ="server"  AutoPostBack ="True"  DataTextField ="CompanyName"
            DataValueField
="CustomerID"  OnSelectedIndexChanged ="DropDownList1_SelectedIndexChanged"
            Width
="238px" >
        
</ asp:DropDownList >
        
< asp:GridView  ID ="GridView1"  runat ="server" ></ asp:GridView >     
    
</ div >
    
</ form >
Codebehind:
    protected   void  Page_Load (  object  sender , EventArgs e )
    {
        
if  (  ! IsPostBack )
        {
            bindDropDownList( );
        }
    }

    
private   void  bindDropDownList ( )
    {
        BllExecPro bllExecPro 
=   new  BllExecPro( );
        DropDownList1.DataSource 
=  bllExecPro.getCustomerIDList( );
        DropDownList1.DataBind( );
        bindGridView( bllExecPro,DropDownList1.SelectedValue );
    }

    
private   void  bindGridView (BllExecPro bllExecPro,  string  customerID )
    {
        
if  ( bllExecPro  ==   null )
            bllExecPro 
=   new  BllExecPro( );
        GridView1.DataSource 
=  bllExecPro.getCustOrderHistList( customerID );
        GridView1.DataBind( );
        bllExecPro.Dispose( );
    }

    
protected   void  DropDownList1_SelectedIndexChanged (  object  sender , EventArgs e )
    {
        bindGridView(
null , DropDownList1.SelectedValue );
    }
浏览页面,通过SQL 事件探察器可以看到在执行 bllExecPro.getCustomerIDList( ) 时实际执行的SQL 语句是:
select   top   10  customer0_.CustomerID  as  CustomerID3_, customer0_.CompanyName  as  CompanyN2_3_  from  Customers customer0_
在执行 bllExecPro.getCustOrderHistList( customerID ) 时实际执行的SQL语句是:
exec  sp_executesql N ' exec CustOrderHist @p0 ' , N ' @p0 nvarchar(5) ' @p0   =  N ' 对应的customerID '
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值