Предположим, у меня есть основная процедура X
, которая вызовет четыре подпроцедуры через приложение VB 6.0 через набор записей ADODB.
Например, предположим, что имена подпроцедур A
, B
, C
, D
.
Из 4 подпроцессов первая процедура A
удаляет записи из многих таблиц, а затем управление переходит к другим 3 процедурам. После переноса всех хранимых процедур с Oracle на SQL Сервер я сталкиваюсь с проблемой, т.е. когда я выполняю основную процедуру через набор записей VB6, эта временная процедура A
иногда не удаляет записи из таблиц и передает управление другим процедурам без правильное выполнение.
Из-за этого я не могу понять, является ли это проблемой механизма блокировки SQL Проблема набора записей сервера или приложения 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
ПРОЦЕДУРА А
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;