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.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With