Annule tout le sql insert si quelque chose échoueJ'essaie d'exécuter plusieurs insertions sur différentes tables et je veux qu'elles soient toutes restaurées en cas d'échec. Maintenant, j'ai le code SQL qui fonctionne et il revient correctement, mais il ne soulève pas l'erreur sur odbc. JMP renvoie simplement une valeur manquante. Quelqu'un sait comment s'assurer que raiserror () s'affiche correctement sur ODBC? L'erreur est correctement générée si je lance le même code directement en SQL.
dbc = Create database connection("DRIVER=SQL SERVER;SERVER=.\;Database=Test");
rfail = executeSQL(dbc,
"
DECLARE @TransactionName varchar(20) = 'Transaction1';
BEGIN TRY
BEGIN TRAN @TransactionName
INSERT INTO [dbo].Test1
(A --varchar
,B --Int
)
VALUES
('Test Fail'
,1
)
DECLARE @ID bigint
SELECT @ID = SCOPE_IDENTITY()
INSERT INTO [dbo].Test2
(T1ID --Test1 ID
,A --varchar
)
VALUES
(@ID
,14
)
COMMIT TRAN @TransactionName
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
IF @@TRANCOUNT > 0
ROLLBACK TRAN @TransactionName
SELECT
@ErrorMessage=ERROR_MESSAGE(),
@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
",
);
close database connection(dbc);
Re: Annulez l’insertion de tout le SQL en cas d’échec @vince_faller Je me considère toujours comme un "pirate informatique" SQL, donc nullement un expert. En regardant simplement votre code SQL et en sachant qu'un BEGIN TRAN se termine par un COMMIT TRAN ou un ROLLBACK TRAN, peut-être que la section SELECT de SQL pour capturer les messages d'erreur devrait apparaître avant le ROLLBACK ???
Ceci est juste une conjecture sauvage. S'il vous plaît poster si vous trouvez une solution.
Re: Annulez l’insertion de tout le SQL en cas d’échecPas d'amour. Toujours rien obtenir en retour.
Re: Annulez l’insertion de tout le SQL en cas d’échecC'est une solution brute, mais avant de faire votre transaction, insérez une valeur dans une table d'état comme "Traitement en cours" et validez-la.
Alors faites votre transaction. Une fois la validation validée, définissez la valeur de la table de statut sur "Terminé". Si vos transactions échouent et que vous passez à la section d'annulation, votre tableau des statuts indiquera toujours "Traitement en cours". Donc, après l'appel de vos transactions principales, vérifiez votre table de statut. Si le message "Traitement en cours" persiste, vous saurez qu'une annulation a été effectuée.