通过nhibernate调用存储过程

时间:2010-09-01 18:45:32

标签: sql sql-server nhibernate stored-procedures

我需要通过nhibernate调用存储过程,但我不知道如何。 我有简单的存储过程:

CREATE PROCEDURE InsertDoc 
    @Name nvarchar(50),   
    @Author nvarchar(50),
    @Link nvarchar(50) 
AS 
    INSERT INTO documents(name, date, author, doclink) 
    VALUES(@Name, CURRENT_TIMESTAMP, @Author, @Link)

我在我的代码中尝试了这个:

public class documents
{
    public int id;
    public string name;
    public DateTime date;
    public string author;
    public string doclink;

    public void CreateDocuments(String n,String l,String u)
    {
        documents exSample = new documents();
        exSample.name = n;
        exSample.date = DateTime.Now;
        exSample.author = u;
        exSample.doclink = l;

        using (ISession session = OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            //Session.CreateSQLQuery("EXEC :sp_name :start_date :end_date").SetString("sp_name", <>;)
            session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'");
            // session.Save(exSample);
            transaction.Commit();
        }
    }

    public ISessionFactory factory;

    public ISession OpenSession()
    {
        if (factory == null)
        {
            Configuration conf = new Configuration();
            conf.AddAssembly(Assembly.GetCallingAssembly());
            factory = conf.BuildSessionFactory();
        }
        return factory.OpenSession();
    }
}

我调用存储过程

session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'");

在我的映射文件中,我有以下设置:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="WebApplication1" assembly="WebApplication1">
  <class name="WebApplication1.documents" table="documents" lazy="false">
    <id name="id" access="field">
      <generator class="native" />
    </id>
    <property name="name" access="field" column="name" type="String"/>
    <property name="date" access="field" column="date" type="date"/>
    <property name="author" access="field" column="author" type="String"/>
    <property name="doclink" access="field" column="doclink" type="String"/>
  </class>
</hibernate-mapping>

帮我解决这个问题或将我链接到有用的东西。

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

似乎你错过了一个Query.executeUpdate(),所以

session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'").executeUpdate();

应该可行,但以编程方式绑定变量会更好

答案 2 :(得分:2)

以下是使用存储过程插入,更新和删除数据库行的实体映射示例:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo"
               assembly="MyAssembly"
               namespace="MyAssembly.MyNamespace">

  <class name="MyEntity" table="my_entity" lazy="false">
    <id name="MyId" column="my_id" type="Int64">
      <generator class="native" />
    </id>
    <property name="Name" type="string" column="name" />
    <property name="Comment" type="string" column="comment" />

    <sql-insert xml:space="preserve">
      DECLARE @my_id  bigint
      EXECUTE dbo.InsertMyEntity @name = ?, @comment = ?, @my_id = @my_id OUT
      SELECT  @my_id
    </sql-insert>
    <sql-update xml:space="preserve">
      EXECUTE dbo.UpdateMyEntity @name = ?, @comment = ?, @my_id = ?
    </sql-update>
    <sql-delete xml:space="preserve">
      EXECUTE dbo.DeleteMyEntity @my_id = ?
    </sql-delete>
  </class>
</hibernate-mapping>

使用此映射,您可以使用ISession.SaveISession.UpdateISession.Delete方法管理实体,并使NHibernate第一级实体缓存与数据库保持同步。

干杯, Gerke。