>假设我有主过程X
,它将通过 ADODB 记录集通过 VB 6.0 应用程序调用四个子过程。
例如,假设子过程的名称是A
、B
、C
、D
。
在 4 个子过程中,第一个过程A
从多个表中删除记录,然后将控件传递给其他 3 个过程。将所有存储过程从 Oracle 迁移到 SQL Server 后,我遇到了一个问题,即当我通过 VB6 记录集执行主过程时,时间过程A
有时不会从表中删除记录并将控制权传递给其他过程而没有正确执行。
因此,我无法理解是SQL Server锁定机制的问题还是VB6应用程序记录集问题。
在现有的旧结构中,可以与VB6和Oracle数据库正常工作。
下面给出了我的 vb 代码
ST = "execute proc X"
Set adoPrimaryRS = New ADODB.Recordset
adoPrimaryRS.Open ST, db, adOpenStatic, adLockOptimistic
过程 X 和 A 的示例代码
程序 X
CREATE PROCEDURE [dbo].[X]
AS
BEGIN
BEGIN TRY
EXECUTE A
EXECUTE B
EXECUTE C
EXECUTE D
END TRY
BEGIN CATCH
DECLARE @ERRORNUMBER$ INT;
DECLARE @ERRORMESSAGE$ VARCHAR(MAX);
DECLARE @ERRORLINE$ INT;
DECLARE @ERRORPROCEDURE$ VARCHAR(MAX);
SET @ERRORNUMBER$ = ERROR_NUMBER();
SET @ERRORMESSAGE$ = ERROR_MESSAGE();
SET @ERRORLINE$ = ERROR_LINE();
SET @ERRORPROCEDURE$ = ERROR_PROCEDURE();
PRINT 'ERROR NUMBER : ' + CAST(@ERRORNUMBER$ AS VARCHAR(MAX)) + ', ERROR MESSAGE : '+@ERRORMESSAGE$+', ERROR LINE NO. : '+ CAST(@ERRORLINE$ AS VARCHAR(MAX)) + ', ERROR PROCEDURE : '+@ERRORPROCEDURE$;
THROW
END CATCH
END
程序 A
CREATE PROCEDURE [dbo].[A]
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DELETE FROM TABLE_1
DELETE FROM TABLE_2
DELETE FROM TABLE_3
DELETE FROM TABLE_4
IF @@TRANCOUNT > 0
COMMIT WORK;
END TRY
BEGIN CATCH
DECLARE @ERRORNUMBER$ INT;
DECLARE @ERRORMESSAGE$ VARCHAR(MAX);
DECLARE @ERRORLINE$ INT;
DECLARE @ERRORPROCEDURE$ VARCHAR(MAX);
SET @ERRORNUMBER$ = ERROR_NUMBER();
SET @ERRORMESSAGE$ = ERROR_MESSAGE();
SET @ERRORLINE$ = ERROR_LINE();
SET @ERRORPROCEDURE$ = ERROR_PROCEDURE();
BEGIN
PRINT 'ERROR NUMBER : ' + CAST(@ERRORNUMBER$ AS VARCHAR(MAX)) + ', ERROR MESSAGE : '+@ERRORMESSAGE$+', ERROR LINE NO. : '+CAST(@ERRORLINE$ AS VARCHAR(MAX)) + ', ERROR PROCEDURE : '+@ERRORPROCEDURE$;
THROW;
END
END CATCH
END;
这是我在 VB6 中通过 ADO 执行存储过程的方式:
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = <your ADO connection here>
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "<name of the stored procedure>"
Set rs = cmd.Execute
将参数传递给 SP 时:
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = <your ADO connection here>
cmd.CommandType = adCmdStoredProc
Set prm = cmd.CreateParameter("ID", adInteger, adParamInput)
prm.Value = lID
cmd.CommandText = "<name of the stored procedure>"
Set rs = cmd.Execute