通过nhibernate调用存储过程

通过nhibernate调用存储过程

问题描述:

我需要通过nhibernate调用存储过程,但我不知道如何。 我有简单的存储过程:通过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> 

帮我解决这个问题,或者将我联系到一些有用的东西。

+0

你得到的错误是什么? – 2010-09-01 18:57:13

+0

我觉得你错过了NHibernate是ORM的一点。你可以实例化一个'documents'并像在你注释掉的那一行那样调用'Save()'。 – Michael 2014-06-18 20:19:11

+13

不,NHibernate的父亲是Hibernate ...... Ayende更像是一个吉祥物。 – dotjoe 2010-09-01 19:18:39

+0

Leniel Macaferi,CreateSQLQuery执行时没有错误,但没有将条目添加到表中 – gro 2010-09-01 19:19:25

来看,您似乎缺少Query.executeUpdate()一个,所以

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

应该工作,但它好得多绑定的变量programaticly

+7

这似乎是对我的SQL注入攻击的秘诀...... – 2016-03-30 18:31:56

+0

这不应该是upvoted ...构造动态SQL字符串isn'好的答案。 – Jansky 2016-08-02 10:59:45

下面是一个使用存储过程插入,更新实体映射的例子和数据库中的行删除:

<?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.Save,ISession.UpdateISession.Delete方法来管理你的实体,并保持NHibernate的第一级实体缓存与数据库同步。

干杯, Gerke。