create PROCEDURE dbo.FDLck_zh_SaveCK
( --保存数据[RdRecord 收发记录主表]
@ID as int,
--[收发记录子表 RdRecords]
@AutoID as int, --表ID
)
AS BEGIN
BEGIN TRAN--开始事务
--[收发主表操作]
INSERT INTO RdRecord(
[ID], *)
VALUES(
@ID,*)
INSERT INTO RdRecords(
[AutoID], *)
VALUES(
@AutoID,*)
update ...... --出错处理
IF (@@error!=0)
BEGIN
--RAISERROR 20000 'AddICStockBill: Cannot insert data into AddICStockBill '--向应用程序抛出错误 RAISERROR ('error!', 16, 1) ROLLBACK TRAN--回滚事务
Return (1)--设置返回值
End
COMMIT TRAN--如果没有错误则提交事务
END
以上是 一个事务存储过程,里面包含有二条插入语句和一条修改语句,在执行存储过程中遇到以下两个问题,请高手解决!
1、如何保证三条语句能执行成功,不成功回滚。我的程序中由于是二开程序,与原程序插入的语句,会出现@ID重复,而出现第一条插入不成功,@AutoID插入成功,我在取ID时也 用 with(uplock)来进行锁定。不知道如何会出现一条执行成功,一条不成功的现象;
2、当执行不成功,如何将SQL返回值返回给我的程序,我是用VB+SQL开发。请高手指教!
( --保存数据[RdRecord 收发记录主表]
@ID as int,
--[收发记录子表 RdRecords]
@AutoID as int, --表ID
)
AS BEGIN
BEGIN TRAN--开始事务
--[收发主表操作]
INSERT INTO RdRecord(
[ID], *)
VALUES(
@ID,*)
INSERT INTO RdRecords(
[AutoID], *)
VALUES(
@AutoID,*)
update ...... --出错处理
IF (@@error!=0)
BEGIN
--RAISERROR 20000 'AddICStockBill: Cannot insert data into AddICStockBill '--向应用程序抛出错误 RAISERROR ('error!', 16, 1) ROLLBACK TRAN--回滚事务
Return (1)--设置返回值
End
COMMIT TRAN--如果没有错误则提交事务
END
以上是 一个事务存储过程,里面包含有二条插入语句和一条修改语句,在执行存储过程中遇到以下两个问题,请高手解决!
1、如何保证三条语句能执行成功,不成功回滚。我的程序中由于是二开程序,与原程序插入的语句,会出现@ID重复,而出现第一条插入不成功,@AutoID插入成功,我在取ID时也 用 with(uplock)来进行锁定。不知道如何会出现一条执行成功,一条不成功的现象;
2、当执行不成功,如何将SQL返回值返回给我的程序,我是用VB+SQL开发。请高手指教!
第一个问题已解决,
第二个问题,我如何在VB中获取到RAISERROR 返回的信息呢?
GO
SET ANSI_NULLS ON
GOALTER PROCEDURE test(@vs1 as nvarchar(50),@vs2 as nvarchar(50))
as
begin
SET XACT_ABORT ON
BEGIN TRAN
insert into T1(ID,Vs)values(@vs1,'a')
insert into T1(ID,Vs)values(@vs2,'a')
--select * from T1
IF (@@error!=0)
BEGIN
select * from T1
RAISERROR ('error!', 16, 1)
ROLLBACK TRAN --回滚事务
End
COMMIT TRAN --如果没有错误则提交事务
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO==============================================================
VB代码:
On Error GoTo f_error
Dim txtsql As String
Dim mrc As ADODB.Recordset
Dim gconn As New ADODB.Connection
gconn.ConnectionString = Adodc1.ConnectionString
gconn.CursorLocation = adUseClient
gconn.Open
txtsql = "execute test @Vs1='11',@vs2='11'"
gconn.Execute (txtsql)
Exit Sub
f_error:
MsgBox "错误码:" & Err.Number & Chr(13) & Err.Source & ":" & Err.Description, vbExclamation, "提示"
Me.MousePointer = 0
=====================================================================第一参数执行的插入语句错误,会捕捉到错误提示,第一参数执行的插入语句正确,不会提示?是为何?高手指导
然后每一个i u d都要用@@error判断判断,如:
declare @err int
set @err=0
begin tran
insert into ...
set @err=@err+@@error
update ....
set @err=@err+@@error
delete ...
set @err=@err+@@errorif @err<>0
rollback tran
else
commit tran另外如果需要返回文字,可以给存储过程加一个output参数。