什么原因造成程序出现《select error:尝试启动新的sql server操作,结果未决》的错误,我修改了存储过程,问题消失了,可是不明白??详

booksfount 2003-09-10 11:13:36
前台的开发工具是pb,后台ms sql server
我在某个窗口执行了保存操作后(更新了menuwater表,此表有触发器更新romenum),就执行了如下的存储过程(第二种),倒是不报错,但是一打开与存储过程中更新的表(romenum)有关的窗口,就报错,错误如下:

select error:尝试启动新的sql server操作,结果未决

查了半天不知何故,因为最近还修改了存储过程和触发器,就查这两方面的原因
结果又把存储过程改成了第一种,这个提示就消失了!到底问题在哪里的,我改的最总要的地方是一个用了set XACT_ABORT ON一个没有用,

存储过程第一种写法(select 不报错的)::

CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int
set XACT_ABORT ON
set @returnvalue= - 100
begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )

--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum

--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4



if @@error=0 ---这个@@error能真正反映所有的sql是否执行成功么??这样写正确么?
set @returnvalue=100
select @returnvalue
commit tran
set XACT_ABORT OFF
GO


存储过程的第二种写法(造成select不正常的)
CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int

begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )

if @@error<>0 goto lb_error

--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum

if @@error<>0 goto lb_error
--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4

if @@error<>0 goto lb_error

select @@error
commit tran
lb_error:
select @@error
rollback tran
print '失败'
GO


应为触发器也更新了romenum表,也列在下面,不知道是不是相互影响了???

update触发器:

CREATE TRIGGER trg_u_menuwater ON menuwater
FOR update
AS
declare @m_account int,@m_old_account int
if not update(m_account)
return
select @m_account=m_account from inserted
select @m_old_account=m_account from deleted

if @m_account=0 return
if @m_old_account=1 return


UPDATE romenum
SET rm_state = 3--买单后设置为空闲
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table


if @@error =0
commit tran
else
rollback tran


insert触发器:

CREATE TRIGGER trg_i_menuwater ON menuwater
FOR INSERT
AS

if @@error<>0
return

UPDATE romenum
SET rm_state = 1
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table


if @@error =0
commit tran
else
rollback tran


触发器写的也是疑问多多,
如下的这段话,我删掉或不删系统一点也不报错,为什么?而且我在触发其中连begin tran都没有写呀,触发器中是否有一个隐含的事务???所以不用写么????

if @@error =0
commit tran
else
rollback tran


谢谢大家的帮助!我对于这个事务真是太糊涂了!谢谢!
...全文
845 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
booksfount 2003-09-10
  • 打赏
  • 举报
回复
to CrazyFor(蚂蚁) :
我用了set XACT_ABORT ON
按照第一种的写法,不用明确的写rollback tran ,是否正确??

按照第一种写法结尾处:
if @@error=0 ---这个@@error能真正反映所有的sql是否执行成功么??这样写正确么?
set @returnvalue=100
select @returnvalue
commit tran
不知道这个@@error能否准确的返回值,因为有很多update语句,中途万一有个不对的,能执行到后面么,那么程序中,返回的数值又会是什么??



谢谢指教!!!
CrazyFor 2003-09-10
  • 打赏
  • 举报
回复
用set XACT_ABORT ON,这样可以让SQL来管理ROLLBACK.
booksfount 2003-09-10
  • 打赏
  • 举报
回复
to txlicenhe(马可&不做技术高手) :

按照第二种写法,出错转到lb_error处,这样应该是rollback 乐呀??
lb_error:
select @@error
rollback tran

第一种写法,我设置了
set XACT_ABORT ON
我就没有rollback,没有出错,然后select romenum表也没有报错,倒是第一种有rollback的报错了?????
txlicenhe 2003-09-10
  • 打赏
  • 举报
回复
1: 出错后没有rollback

22,300

社区成员

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

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