通过nhibernate调用存储过程

gro*_*gro 4 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)
Run Code Online (Sandbox Code Playgroud)

我在我的代码中试过这个:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我调用存储过程

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

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

<?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>
Run Code Online (Sandbox Code Playgroud)

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

Len*_*rri 5

看看这些链接是否可以帮助您:

使用NHibernate和存储过程(来自Ayende - NHibernate的父亲)

如何从NHibernate调用没有结果的存储过程?

如何使用NHibernate执行存储过程 - 工作示例代码

  • 不,NHibernate的父亲是Hibernate ...... Ayende更像是吉祥物. (18认同)

Mar*_*ijn 2

看来你缺少一个 Query.executeUpdate() ,所以

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

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

  • 这不应该被赞成...构造动态 SQL 字符串不是一个好的答案。 (5认同)