首页 / 软件开发 / .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