Welcome

首页 / 软件开发 / .NET编程技术 / NHibernate之旅(16):探索NHibernate中使用存储过程(中)

NHibernate之旅(16):探索NHibernate中使用存储过程(中)2010-07-23 cnblogs 李永京本节内容

引入

实例分析

2.创建对象

3.更新对象

结语

引入

上一篇,怎么使用MyGeneration提供的模板创建存储过程和删除对象存储过程的使用,这篇接下来介绍在NHibernate中如何使用存储过程创建对象、更新对象整个详细过程,这些全是在实际运用中积累的经验,涉及使用的错误信息,如何修改存储过程,并且比较没有使用存储过程的不同点,并非官方比较权威的资料,所以敬请参考,这篇继续,如果你还没有来及看上一篇,那赶紧去看看吧。

实例分析2.创建对象

Step1:为了比较,我们先执行CreateCustomerTest()测试方法,没有使用存储过程下创建对象生成SQL语句如下:

INSERT INTO Customer (Version, Firstname, Lastname) VALUES (@p0, @p1, @p2);
select SCOPE_IDENTITY(); @p0 = "1", @p1 = "YJing", @p2 = "Lee"

Step2:修改映射文件添加存储过程,打开Customer.hbm.xml映射文件,在Class元素下添加<sql-insert>节点,调用CustomerInsert存储过程,CustomerInsert 存储过程有四个参数,这里用四个问号表示:

<sql-insert>exec CustomerInsert ?,?,?,?</sql-insert>

Step3:执行CreateCustomerTest()测试方法,出现错误“NHibernate.Exceptions.GenericADOException : could not insert: [DomainModel.Entities.Customer][SQL: exec CustomerInsert ?,?,?,?];System.Data.SqlClient.SqlException : 参数化查询 "(@p0 int,@p1 nvarchar(3),@p2 nvarchar(7),@p3 int)exec CustomerIn" 需要参数 "@p3",但未提供该参数”,这应该是参数问题,仔细看看原来的存储过程,参数位置有些问题。

Step4:修改CustomerInsert存储过程,去掉SET NOCOUNT ON并把参数移动位置,代码片段如下:

ALTER PROCEDURE [dbo].[CustomerInsert]

@Version int,
@Firstname nvarchar(50) = NULL,
@Lastname nvarchar(50) = NULL,
@CustomerId int = NULL OUTPUT

AS
INSERT INTO [Customer]

[Version],
[Firstname],
[Lastname]

VALUES

@Version,
@Firstname,
@Lastname

SELECT @CustomerId = SCOPE_IDENTITY();
RETURN @@Error