目录

写在前面

文档与系列文章

创建对象

更新对象

总结

写在前面

上篇文章介绍了如何使用MyGeneration代码生成器生成存储过程,以及nhibernate中通过存储过程删除数据的内容,这篇文章将介绍如何创建对象,更新对象。

文档与系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置与测试 

[NHibernate]HQL查询 

[NHibernate]条件查询Criteria Query

[NHibernate]增删改操作

[NHibernate]事务

[NHibernate]并发控制

[NHibernate]组件之依赖对象

[NHibernate]一对多关系(级联删除,级联添加)

[NHibernate]一对多关系(关联查询)

[NHibernate]多对多关系(关联查询)

[NHibernate]延迟加载

[NHibernate]立即加载

[NHibernate]视图处理

[NHibernate]N+1 Select查询问题分析

[NHibernate]存储过程的使用(一)

创建对象

创建对象和删除对象的步骤类似,首先修改Customer.hbm.xml映射文件,添加<sql-insert>节点。调用TB_CustomerInsert存储过程,CustomerInsert 存储过程有四个参数,这里用四个问号表示:

    <!--存储过程,check参数:none/rowcount/param-->
<sql-insert>exec TB_CustomerInsert ?,?,?,?</sql-insert>
<!--<sql-delete check="rowcount" >exec TB_CustomerDelete ?</sql-delete>-->
<sql-delete>DELETE FROM [TB_Customer] WHERE [CustomerID] = ? and [Version] =?</sql-delete>

测试

         /// <summary>
/// 通过存储过程添加客户
/// </summary>
/// <param name="customer">客户实体</param>
/// <returns>是否添加成功 </returns>
public bool AddCustomerUsingProcess(Customer customer)
{
try
{ var session = NHibernateHelper.GetSession();
//将customer对象写入内存
session.Save(customer);
//更新到数据库
session.Flush();
return true;
}
catch (Exception ex)
{
throw ex;
}
}

运行代码,进行测试,此时会有一个异常

int和guid类型不兼容,猜测是存储过程中参数位置不对,调整参数位置。

 ALTER PROCEDURE [dbo].[TB_CustomerInsert]
(
@Version int,
@CustomerName nvarchar(16) = NULL,
@CustomerAddress nvarchar(128) = NULL,
@CustomerID uniqueidentifier OUTPUT )
AS
--去掉SET NOCOUNT ON INSERT INTO [TB_Customer]
(
[Version],
[CustomerName],
[CustomerAddress],
[CustomerID] )
VALUES
(
@Version,
@CustomerName,
@CustomerAddress,
@CustomerID
) RETURN @@Error

数据表

你会发现,在存储过程中的,参数的顺序id必须在后面,乐观并发控制(版本号)必须在第一个。

如果是自增主键,可能遇到的错误可参考:http://www.cnblogs.com/lyj/archive/2008/11/06/1328240.html

更新对象

首先修改映射文件Customer.hbm.xml,添加<sql-update>节点。同理,参数使用?占位。

     <!--存储过程,check参数:none/rowcount/param-->
<sql-insert>exec TB_CustomerInsert ?,?,?,?</sql-insert>
<sql-update>exec TB_CustomerUpdate ?,?,?,?</sql-update>
<!--<sql-delete check="rowcount" >exec TB_CustomerDelete ?</sql-delete>-->
<sql-delete>DELETE FROM [TB_Customer] WHERE [CustomerID] = ? and [Version] =?</sql-delete>

测试

         /// <summary>
/// 使用存储过程修改客户信息
/// </summary>
/// <param name="customer">客户对象</param>
/// <returns>是否修改成功</returns>
public bool UpdateCustomerUsingProcess(Customer customer)
{
try
{ var session = NHibernateHelper.GetSession();
//Update the persistent instance with the identifier of the given transient instance.
session.Update(customer);
session.Flush();
return true;
}
catch (Exception)
{
throw;
}
}

此时还会有那个异常,如图,同样的办法修改存储过程。

修改后的存储过程

 ALTER PROCEDURE [dbo].[TB_CustomerUpdate]
(
@Version int,
@CustomerName nvarchar(16) = NULL,
@CustomerAddress nvarchar(128) = NULL,
@CustomerID uniqueidentifier
)
AS
--SET NOCOUNT ON UPDATE [TB_Customer]
SET
[Version] = @Version,
[CustomerName] = @CustomerName,
[CustomerAddress] = @CustomerAddress,
[CustomerID] = @CustomerID
WHERE
[CustomerID] = @CustomerID RETURN @@Error

生成的sql语句

exec sp_executesql N'exec TB_CustomerUpdate @p0,@p1,@p2,@p3',N'@p0 int,@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 uniqueidentifier,@p4 int',@p0=3,@p1=N'wolfy22222',@p2=N'南京22222',@p3='DDF63750-3307-461B-B96A-7FF356540CB8',@p4=2

数据表

你通过数据表中的Version,会发现,它发生了变化,从1到2(出现3的原因,是在之前我测试了一下)。并且在sql语句中有一个@p4的参数。

为了更好的实现版本控制的功能,你可以修改存储过程,添加一个@oldeversion参数。

 ALTER PROCEDURE [dbo].[TB_CustomerUpdate]
(
@Version int,
@CustomerName nvarchar(16) = NULL,
@CustomerAddress nvarchar(128) = NULL,
@CustomerID uniqueidentifier,
@oldVersion int
)
AS
--SET NOCOUNT ON UPDATE [TB_Customer]
SET
[Version] = @Version,
[CustomerName] = @CustomerName,
[CustomerAddress] = @CustomerAddress,
[CustomerID] = @CustomerID
WHERE
[CustomerID] = @CustomerID and [Version] =@oldVersion RETURN @@Error

在映射文件中,添加一个?,代表@oldVersion。

 <sql-update>exec TB_CustomerUpdate ?,?,?,?,?</sql-update>

生成的sql语句为

这样就跟存储过程中的参数对应上了。

上篇文章也介绍了一种方法,如果你不想执行存储过程,可以使用sql语句也可以达到目的。

   <sql-update>UPDATE TB_CustomerUpdate SET Version=?, [CustomerName]=?,[CustomerAddress]=? WHERE CustomerID=? AND Version=? </sql-update>

总结

本篇文章介绍了如何在nhibernate使用存储过程添加数据,更新数据及在使用过程中需要注意的问题。你可能也有个疑问,为啥使用MyGeneration生成的存储过程,每次都要修改?这个的确是个很让人恼火的地方,没办法,并不能什么东西都十全十美,至少存储过程的语法已经写好了,修改起来也很方便。

[NHibernate]存储过程的使用(二)的更多相关文章

  1. [NHibernate]存储过程的使用(三)

    目录 写在前面 文档与系列文章 查询 总结 写在前面 前面的文章介绍了在nhibernate中使用存储过程进行增删改的操作,当然查询也是可以的,在nhibernate中也可以执行任意的存储过程.本篇文 ...

  2. [Nhibernate]二级缓存(二)

    目录 写在前面 文档与系列文章 更新数据 二级缓存管理 总结 写在前面 本篇文章也算nhibernate入门系列的结尾了,在总结nhibernate系列的过程中,遇到了很多问题,学习的过程也是解决bu ...

  3. NHibernate 存储过程使用

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...

  4. NHibernate 存储过程 第十四篇

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...

  5. [NHibernate]存储过程的使用(一)

    目录 写在前面 文档与系列文章 Nhibernate中使用存储过程 一个例子 总结 写在前面 上篇文章一个小插曲,分析了延迟加载是如何解决N+1 select查询问题的.这篇开始介绍在nhiberna ...

  6. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...

  7. NHibernate系列文章十二:Load/Get方法

    摘要 NHibernate提供两个方法按主键值查找对象:Load/Get. 1. Load/Get方法的区别 Load: Load方法可以对查询进行优化. Load方法实际得到一proxy对象,并不立 ...

  8. 转:NHibernate 存储过程

    http://stackoverflow.com/questions/928847/how-to-get-the-return-value-from-a-sql-server-stored-proce ...

  9. Nhibernate系列学习之(二) 简单增删改查

    实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用: 1:首先在数据库中创建一个表T_School,脚本如下: USE [TestDb] GO /****** 对象: Table [dbo] ...

随机推荐

  1. 断言(Assert)与异常(Exception)

    断言是被用来检查非法情况而不是错误情况,即在该程序正常工作时绝不应该发生的非法情况,用来帮助开发人员对问题的快速定位.异常处理用于对程序发生异常情况的处理,增强程序的健壮性.容错性,减少程序使用中对用 ...

  2. [转]中国最大的Webshell后门箱子调查,所有公开大马全军覆没

    起因 对这件事情的起因是某天我渗透了一个大站,第二天进webshell时就发现,当前目录出现了新的后门,仔细一查,发现是博彩团伙干的,网站被全局劫持黑帽程序如下代码 set_time_limit(); ...

  3. 蓝牙BLE传输性能及延迟分析

    BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数.每一帧数据的长度.具体参见如下链接: https://devz ...

  4. SDN:motivation

    今天公交车上看了会SDN一本介绍性的书籍,具体名字不记得了.我想,我已经在实验室呆了很久的时间的,接触SDN也有一段时间了.对SDN的一些基本的知识还是需要好好整理一番.当然,这里只是一个随笔,想到什 ...

  5. Android UI组件----AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...

  6. Linux档案与目录管理

    Linux档案与目录管理1. 目录与路径1.1 相对路径与绝对路径1.2 目录的相关操作: cd, pwd, mkdir, rmdir cd [相对路径或绝对路径]cd ~ [用户]: 切换家目录cd ...

  7. alexkn android第一行代码-7.广播

    0.Android 中的广播主要可以分为两种类型,标准广播和有序广播.标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的 广播接收器几乎都会在同一时刻接收到 ...

  8. MATLAB常用字符串函数之二

    1,lower和upper lower: 将包含的全部字母转换为小写. upper: 将包含的全部字母转化为大写. 实例一: >>str='Sophia is a good girl.'; ...

  9. #1014 Trie树

    本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...

  10. jquery富文本在线编辑器UEditor

    UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. UEditor的功能非常强大,官方 ...