请问这个存储过程,最后一条sql 语句执行出错的情况下,是否能 RollBack ? ( 积分: 50 )

D

decade

Unregistered / Unconfirmed
GUEST, unregistred user!
请问这个存储过程,最后一条sql 语句执行出错的情况下,是否能 RollBack ?
CREATE PROCEDURE [dbo].[Material_Post] @PostUser varChar(16) AS
Begin
Begin Transaction
Insert Into Tuico_BackMaterStock Select * From Tuico_MaterStock Where Post_Date Is Null
Update Tuico_BackMaterStock Set Post_Date=GetDate() ,Post_User=@PostUser Where Post_Date Is Null
//以下语句如果产生异常,能否正常回滚?
Update Tuico_MaterStock Set Post_Weigh=Stock_Weigh,Input_Weight=0,SendOut_Weight=0,Stock_Year=Year(GetDate()),Stock_Month=Stock_Month+1
if @@Error<>0
Begin
RaisError('库存结转出现错误,操作被取消!',16,1)
RollBack Transaction
End
Else
Commit Transaction
End
 
请问这个存储过程,最后一条sql 语句执行出错的情况下,是否能 RollBack ?
CREATE PROCEDURE [dbo].[Material_Post] @PostUser varChar(16) AS
Begin
Begin Transaction
Insert Into Tuico_BackMaterStock Select * From Tuico_MaterStock Where Post_Date Is Null
Update Tuico_BackMaterStock Set Post_Date=GetDate() ,Post_User=@PostUser Where Post_Date Is Null
//以下语句如果产生异常,能否正常回滚?
Update Tuico_MaterStock Set Post_Weigh=Stock_Weigh,Input_Weight=0,SendOut_Weight=0,Stock_Year=Year(GetDate()),Stock_Month=Stock_Month+1
if @@Error<>0
Begin
RaisError('库存结转出现错误,操作被取消!',16,1)
RollBack Transaction
End
Else
Commit Transaction
End
 
在delphi 里面是这样执行的:
IF application.MessageBox('确定要进行库存结转吗?','提示',MB_OKCancel+MB_ICONINFORMATION)=IDOK Then
Begin
adoStockDate.Active:=False;
adoStockDate.Active:=True;
if adoStockDate.RecordCount<>1 Then
Begin
if adoStockDate.RecordCount=0 Then
application.MessageBox('没有需结转的库存数据,如有错误,请与管理员联系!','系统提示',MB_OK+MB_ICONWARNING)
else
application.MessageBox('未结转的库存数据日期有不同日期,请与管理员联系!','系统提示',MB_OK+MB_ICONWARNING);
Exit;
End;
PstMsg:='当前要结转的是:'+IntToStr(adoStockDate.FieldByName('Stock_Year').AsInteger)+'年'+IntToStr(adoStockDate.FieldByName('Stock_Month').AsInteger)+'月库存资料吗';
if Application.MessageBox(Pchar(PstMsg),'库存结转',MB_OKCancel+MB_ICONWARNING)=IDOK Then
Try
adoStockDate.Connection.BeginTrans;
adoStockDate.Connection.Execute('Exec dbo.Material_Post '+QuotedStr('TestUser'));
adoStockDate.Connection.CommitTrans;
BtnRefresh.Click;
Except
ErrorStr:=adoStockDate.Connection.Errors[0].Description;
adoStockDate.Connection.RollbackTrans;
application.MessageBox(pchar(ErrorStr),'结转资料错误',MB_OK+MB_ICONERROR);
End;
End;

end;

但是问题出在这里: 第1,2条sql 语句执行正确,偏偏 最后一条语句 有其中一条数据出错,很纳闷,如果是 第1,2条sql 语句 执行出错,这还好解析.这最后一条,按理说不应该部分出错.
 
try
BeginTrans
...
CommitTrans
except
RollBackTrans
end;
 
问题解决,问题不出在这里!谢谢各位的捧场.
 
顶部