使用 nHibernate 在 SQL Server 中执行存储过程
使用 nHibernate 执行存储过程的有用技巧
引言
本文展示了如何在 Microsoft Visual Studio (C#) 中使用 nHibernate 执行存储过程 (SP)。
背景
我在完成这项任务时遇到了很多挑战。由于我对 nHibernate 技术还不熟悉,而且 Google 搜索在这方面也没有帮我太多,所以我花费了大量时间才能得到实际结果。在这里,我与您分享一些进行此类活动时的技巧。
实用技巧
Hibernate 配置文件
编写 nHibernate 配置文件 (*.hbm.xml) 时需要注意的点。
- 存储过程返回的所有参数都将以“return-scalar”的形式出现,并带有列名和类型。
- 在存储过程中使用数据库别名代替数据库列名。
- 如果您的 SP 具有输入参数,则为每个参数使用逗号分隔的
?
标记。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="GetCustomerOrderHistory"> //code name of your SP
<return-scalar column="ProductName" type="String" /> //all the return parameters
<return-scalar column="Total" type="Int32" />
exec CustOrderHist :?
</sql-query>
</hibernate-mapping>
Hibernate 模型类
以下内容对于为 SP 编写 hibernate 配置的模型类非常重要。
- 对于每个返回的参数,都将有一个属性。
- 您的模型类中将只有一个参数化构造函数,您需要使用特定的构造函数设置所有
private
变量。
public class HistoricalOrderSummary { public HistoricalOrderSummary(string productName, int totalQuantity) { _productName = productName; _totalQuantity = totalQuantity; } public string ProductName { get { return _productName; } } public int TotalQuantity { get { return _totalQuantity; } } private string _productName; private int _totalQuantity; }
Hibernate 仓库类
我假设您已经知道如何初始化/创建/映射 nHibernate 会话。
要执行存储过程,hibernate 使用 GetNamedQuery
方法。
public class HistoricalOrderSummaryDao
{
public List<HistoricalOrderSummary> GetCustomerOrderHistoryFor(string customerId) {
IQuery query = NHibernateSession.GetNamedQuery("GetCustomerOrderHistory")
query .SetString("CustomerID", customerId)
query .SetResultTransformer(
new NHibernate.Transform.AliasToBeanConstructorResultTransformer(
typeof (HistoricalOrderSummary).GetConstructors()[0]));
return query.List<HistoricalOrderSummary>() as List<HistoricalOrderSummary>;
}
private ISession NHibernateSession {
get {
return NHibernateSessionManager.Instance.GetSession();
}
}
}
结论
找到解决方案并不困难,但记住一些技巧很重要。请分享您的输入或想法。 这篇文章 帮助我完成了我的任务。如果您需要任何帮助或协助,请告诉我。谢谢。