65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 nHibernate 在 SQL Server 中执行存储过程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (6投票s)

2009 年 6 月 18 日

CPOL

1分钟阅读

viewsIcon

100196

使用 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();
        }
    }
}

结论

找到解决方案并不困难,但记住一些技巧很重要。请分享您的输入或想法。 这篇文章 帮助我完成了我的任务。如果您需要任何帮助或协助,请告诉我。谢谢。

© . All rights reserved.