通过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>
帮我解决这个问题,或者将我联系到一些有用的东西。
来看,您似乎缺少Query.executeUpdate()一个,所以
session.CreateSQLQuery("EXEC InsertDoc @Name = N'" + exSample.name + "',@Author = N'" + exSample.author + "',@Link = N'" + exSample.doclink + "'").executeUpdate();
应该工作,但它好得多绑定的变量programaticly
这似乎是对我的SQL注入攻击的秘诀...... – 2016-03-30 18:31:56
这不应该是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.Update
和ISession.Delete
方法来管理你的实体,并保持NHibernate的第一级实体缓存与数据库同步。
干杯, Gerke。
你得到的错误是什么? – 2010-09-01 18:57:13
我觉得你错过了NHibernate是ORM的一点。你可以实例化一个'documents'并像在你注释掉的那一行那样调用'Save()'。 – Michael 2014-06-18 20:19:11