Набор записей VB6 и хранимая процедура SQL - PullRequest
0 голосов
/ 03 февраля 2020

Предположим, у меня есть основная процедура 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;

1 Ответ

1 голос
/ 05 февраля 2020

Вот как я выполняю хранимую процедуру через ADO в VB6:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...