Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call stored procedure through nhibernate

I need to call a stored procedure through nhibernate, but I do not know how. I have simple stored procedure:

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)

I tried this in my code:

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

I call the stored procedure

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

In my mapping file I have these settings:

<?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>

Help me solve this problem or link me to something useful.

like image 595
gro Avatar asked Feb 26 '23 08:02

gro


2 Answers

Seems you're missing a Query.executeUpdate() for one, so

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

should work, but it's much nicer to bind your variables programaticly

like image 67
Martijn Avatar answered Mar 06 '23 20:03

Martijn


Here is an example of an entity mapping that uses stored procedures for insert, update and delete of database rows:

<?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>

With this mapping you can use the ISession.Save, ISession.Update and ISession.Delete methods to manage your entities and keep the NHibernate first-level entity cache in sync with the database.

Cheers, Gerke.

like image 35
Gerke Geurts Avatar answered Mar 06 '23 21:03

Gerke Geurts