create procedure sp_1
as
declare @return as int
set @return=0
update t1 set ...
if @@error<>0
set @return=-1
return @return
但是在执行存储过程时出错,sqlserver就会自动终止存储过程的执行,这样返回值就不正确了,怎么解决呢
比如:在update表t1时,表t1设置了触发器,如果更新值有问题触发器会返回错误,这样sqlserver就会终止过程的执行
as
declare @return as int
set @return=0
update t1 set ...
if @@error<>0
set @return=-1
return @return
但是在执行存储过程时出错,sqlserver就会自动终止存储过程的执行,这样返回值就不正确了,怎么解决呢
比如:在update表t1时,表t1设置了触发器,如果更新值有问题触发器会返回错误,这样sqlserver就会终止过程的执行
as
declare @return as int
--set @return=0--这句多余
SET XACT_ABORT ON--如果 Transact- SQL 语句产生了运行时错误,则回滚事务。
BEGIN TRANSACTION
update t1 set ...
if @@error<>0
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN(-1)
ENDCOMMIT TRANSACTION
SET XACT_ABORT OFF--这样存储过程遇到错误回滚所有更新,并且ADO会捕获错误而不会更新数据
ON ERROR GOTO ErrDEAL
BEGIN TRANSACTION **********************
**********************COMMIT TRANSACTIONErrDEAL:
ROLLBACK TRANSACTION
我分析了一下,sqlserver在执行时根本不执行if @@error<>0这句就已经结束了过程的执行
〉10的嚴重級別才會被程序識別,等待結果
CREATE PROCEDURE procTry
AS
Raiserror('Proc出錯',11,1)
ReturnGO
'程序
On Error GoTo Err
Dim Con As New ADODB.Connection
Con.ConnectionString = Me.Adodc1.ConnectionString
Con.Open
Con.Execute ("procTry")
Con.Close
Set Con = Nothing
Exit Sub
Err: MsgBox (Err.Description)測試了下 會彈出sp中的錯誤描述信息
/*TRIGGER */
CREATE TRIGGER [aUpdate] ON [dbo].[authors]
FOR UPDATE
AS
IF UPDATE(zip)
Begin
Raiserror('不能修改authors表中的zip紀錄',11,1)
Return
End/*Proc*/
CREATE PROCEDURE procTry
AS--Raiserror('Proc出錯',11,1)
--Return
Update authors Set zip=94026 WHere au_id='172-32-1176'
GO'程序
和上面的一樣 彈出提示信息,不知道爲什麽你的沒有提示...
難道是Rp問題
/*TRIGGER */
CREATE TRIGGER [aUpdate] ON [dbo].[authors]
FOR UPDATE
AS
IF UPDATE(zip)
Begin
Raiserror('不能修改authors表中的zip紀錄',11,1)
Return
End/*Proc*/
CREATE PROCEDURE procTry
AS
declare @return as intUpdate authors Set zip=94026 WHere au_id='172-32-1176'
if @@error<>0
begin
set @return=-1
return @return
end
set @return=0
return @return
GO
----------
Vb中的代码
Dim m_cmm1 As New ADODB.Command
On Error GoTo lerr
With m_cmm1
.ActiveConnection = cnnMain
.CommandType = adCmdStoredProc
.CommandText = "procTry "
.Parameters.Append .CreateParameter("returnvalue", adInteger, adParamReturnValue, 0, 0)
.Execute
If .Parameters(0) < 0 Then Set m_cmm1 = Nothing: Exit Function
End With
On Error GoTo 0
EnsureStBill = True
Exit Function
lerr:
....
-----
我是在调用存储过程的返回值来判断是否执行成功的,但是触发器给出的错误时sqlserver终止了过程的执行返回值就不正确了
这个不会...
1的错误程度不足 被系统吃了