存储过程中事务回滚与返回值的问题。

bangle 2013-01-25 02:35:16
我制作了一个存储过程来实现3个表格的数据添加的操作,同时其中有2个表对应各有一个insert的触发器用作检查数据添加时某一字段是否已有重复数据。如果其中一个表格添加失败,存储过程就回滚操作并返回错误信息值。现遇到回滚语句放置的地方会出现不同的问题。代码如下:
use testDB
go
if exists(select name from sysobjects where name = 'procTest1' and type='P')
drop procedure procTest1
go
create procedure procTest1
@menbName varchar(50)='',
@custName varchar(50)='',
@custAddress varchar(50)='',
@custPhone varchar(50)='',
@prodSerial varchar(50)='',
@prodFactName varchar(50)='',
@prodConfign varchar(50)='',
@prodModel varchar(50)=''
as
begin tran
insert into Men1(name) values(@menbName)
insert into Cust1(custName,custAddress,custPhone) values(@custName,@custAddress,@custPhone)
insert into Prod1(prodSerial,prodFactName,prodConfign,prodModel) values (@prodSerial,@prodFactName,@prodConfign,@prodModel)
if((select count(ID) from MsgError) > 0)
begin
select * from MsgError
-->rollback tran放置该位置后,MsgError表保存的错误信息被清空。
rollback tran
if exists(select msgStyle from MsgError where msgStyle = 'Men1')
return 1
else
return 2

-->rollback tran放置该位置后,执行报错。
/**
消息 266,级别 16,状态 2,过程 procTest1,第 20 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
**/
end
else
commit tran
return @@error
go
if exists(select name from sysobjects where name='trigMen1Insert' and type='TR')
drop trigger trigMen1Insert
go
create trigger trigMen1Insert on Men1
instead of insert as
declare @业务员 varchar(50)
select @业务员=name from inserted
if (@业务员 in (select name from Men1))
insert into MsgError values((select count(ID)+1 from MsgError),'成员表已存在该名字。','Men1')
else
insert into Men1(name) values(@业务员)
go
if exists(select name from sysobjects where name = 'trigCust1Insert' and type='TR')
drop trigger trigCust1Insert
go
create trigger trigCust1Insert on Cust1
instead of insert as
declare @客户名 varchar(50)
select @客户名=custName from inserted
if (@客户名 in(select custName from Cust1))
insert into MsgError values((select count(ID) +1 from MsgError),'客户表已存在该用户名','Cust1')
else
insert into Cust1(custName,custAddress,custPhone) select custName,custAddress,custPhone from inserted
go
declare @megs int
exec @megs=procTest1 '王一','客户名','客户地址','13900201243','A234553','宝鸡机床','980TDb/DA98','TK36S'
select @megs as '返回值'
select * from MsgError
go

望有能之士仗义帮忙。
...全文
194 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bangle 2013-01-25
  • 打赏
  • 举报
回复
问题已解决,是存储过程的If...Else...的流程控制上出现问题。 解决后的代码如下:
create procedure procTest1
	@menbName varchar(50)='',
	@custName varchar(50)='',
	@custAddress varchar(50)='',
	@custPhone varchar(50)='',
	@prodSerial varchar(50)='',
	@prodFactName varchar(50)='',
	@prodConfign varchar(50)='',
	@prodModel varchar(50)=''
as
begin tran
	insert into Men1(name) values(@menbName)
	insert into Cust1(custName,custAddress,custPhone) values(@custName,@custAddress,@custPhone)
	insert into Prod1(prodSerial,prodFactName,prodConfign,prodModel) values (@prodSerial,@prodFactName,@prodConfign,@prodModel)
if (select count(ID) from MsgError) > 0
begin
	select * from MsgError
	if exists(select msgStyle from MsgError where msgStyle = 'Men1')
	begin
		rollback tran
		return 1	
	end
	else
	begin
		rollback tran
		return 2	
	end
end	
commit tran
return @@error
我腫了 2013-01-25
  • 打赏
  • 举报
回复
用if不就可以了嗎? 先判斷是否已有該數據,是則不添加,否則添加。
比较实用,基础 目录 第一节 整理目的 3 第二节 jdbc的概念 3 2.1概念 3 2.2 Jdbc与应用程序的关系 3 2.3 数据库的连接步骤 4 2.4 Quick Start 4 第三节 如何与数据库建立连接 6 3.1 注册驱动 6 3.2 建立数据库的连接 8 3.3 规范Quick Start的例子 10 第四节 Statement 接口的使用详解 12 4.1 Statement 的常用方法 12 4.2 CRUD操作 16 4.3 Statement有那些缺点 19 第五节 ResultSet接口的使用详解 20 第六节 JDBC 数据类型详解 30 6.1 基本数据类型 30 6.2 日期类型 34 6.3 CLOB类型 36 6.4 BLOB类型 39 6.5 其他数据类型 41 第七节 DAO设计模式详解 41 7.1 实际项目如何使用JDBC 41 7.2 DAO设计模式简介 42 7.3 DAO设计模式的实现 42 7.4 DAO设计模式与工厂模式的整合 49 7.5 DAO设计模式测试 52 第八节 JDBC对事务的支持 52 8.1 模拟转账 53 8.2 jdbc默认事务 54 8.3 事务提交与回滚 54 8.4 设置保存点 55 8.5 JTA事务的介绍 56 8.6 数据库的隔离级别介绍 56 8.6.1 未提交读 57 8.6.2 提交读 58 8.6.3 重复读 59 8.6.4 序列化读 60 8.7 小结 62 第九节 PreparedStatement接口的使用 62 第十节 CallableStatement接口的使用 62 9.1 无参无返回值存储过程调用 63 9.2 有参无返回值存储过程调用 63 9.3 有参有返回值存储过程调用 64 9.4 JDBC其他API 65 第十一节 元数据信息 66 11.1 数据库元数据信息 66 11.2 参数元数据信息 67 第十二节 批处理的使用 67 12.1 普通方式插入一千条数据 68 12.2 批处理方式插入一千条数据 69 第十三节 JDBC其他API 70 13.1 可滚动结果集 70 13.2 分页技术 72 13.3 可更新结果集 73 第十四节 编写一个简单的数据库连接池 74 14.1 为什么要使用数据库连接池 74 14.2 数据库连接池雏形 74 14.2 数据库连接池优化 77 14.2.1 对线程池加锁 77 14.2.2 连接不够用时抛出异常 77 14.3 数据库连接池之代理模式 78 14.3.1 静态代理 78 14.3.2 动态代理 84 14.4 DBCP数据库连接池的使用 87 第十五节 jdbc轻量级封装 88 15.1 将结果集封装为Map 88 15.1.1 ResultSetMetaData演示 88 15.1.2解决多行记录的问题 89 15.1.3 Map结果集的封装 90 15.2 将结果集封装为对象 91 15.2.1 user表POJO的编写 91 15.2.2 Bean结果集的封装 92 15.3 将结果集封装为List 94 15.4 策略模式的应用 96 15.4.1 Map结果集策略模式应用 96 15.4.2 Bean结果集策略模式应用 97 15.4.3 List结果集策略模式应用 98 15.4.4 单元测试 99 15.5 模板模式的应用 100 第十六节 近期推出 101

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧