NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库,来源于非常优秀的基于Java的Hibernate 关系型持久化工具.
在NHibernate里怎么执行存储过程呢?下面有一个简单的例子,使用的MS SQL Server 2000 NorthWind库里的CustOrderHist存储过程.
先建2个实体类:
1.CustOrderHist : Customer Historical Order Summary
映射关系:
2.Customer:Customer表的2个字段:CustomerID And CompanyName 提供选择CustomerID
映射关系:
在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;
}
}
/// 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 >
< 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; }
}
}
/// 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:< 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 >
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:{
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 > ( );
}
}
<
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:< 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 >
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 语句是:{
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 );
}
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
'