Nombre de transactions après EXECUTE indique des différences de nombre de lancer et valider
Lorsqu'une erreur se produire dans la suite de proc puis message d'erreur est "nombre de Transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Précédent count = 1, current count = 0
. Nombre de transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Précédent count = 1, current count = 0
"
CREATE PROCEDURE [dbo].[proc_PurchaseOrder_Create](@CustomerID INT, @CustomerOrderID INT OUTPUT)
AS
SET NOCOUNT ON;
--------------------------------
DECLARE @Return_Message VARCHAR(1024)
DECLARE @ErrorCode INT
DECLARE @ErrorStep VARCHAR(200)
DECLARE @UserID INT
--------------------------------
DECLARE @CustomerCartID INT,@PONumber VARCHAR(255), @CartTotalAmount NUMERIC
BEGIN TRY
BEGIN TRAN
-----------------------------------------------------------------------------
SELECT @ErrorCode = @@ERROR
SET NOCOUNT ON;
IF NOT EXISTS(SELECT CustomerCartID FROM TxnCustomerCart WHERE CustomerID = @CustomerID)
BEGIN
SET @Return_Message= 'No Cart item is available'
SET @ErrorCode = 1
END
ELSE
BEGIN
-----------------------------------------------------------------------------
SELECT @UserID = ISNULL(UserID,0) FROM TxnCustomers WHERE CustomerID = @CustomerID
-----------------------------------------------------------------------------
SELECT @CartTotalAmount = CartTotalAmount, @CustomerCartID = CustomerCartID FROM TxnCustomerCart WHERE @CustomerID = CustomerID
SELECT @ErrorStep = 'Error on inserting data into TxnCustomerOrders';
INSERT INTO TxnCustomerOrders(CustomerID,OrderDate,OrderStatus,Ramarks,PaymentCategoryCode,CreatedBy,CreatedDatetime)
VALUES(@CustomerID,GETDATE(),'PRTRCVD','','Wallet',@UserID,GETDATE())
SET @CustomerOrderID = SCOPE_IDENTITY();
SELECT @ErrorStep = 'Error on generating PONumber';
SET @PONumber =dbo.fun_getPONumber(@CustomerID, @CustomerOrderID)
SELECT @ErrorStep = 'Error on inserting data into TxnPurchaseOrder';
INSERT INTO TxnPurchaseOrder (CustomerOrderID, PONumber, PODate, POAmount, PODocID, PODocPath, CreatedBy, CreatedDate)
VALUES (@CustomerOrderID, @PONumber, GETDATE(), @CartTotalAmount, REPLACE(@PONumber, '/' , '-'), REPLACE(@PONumber, '/' , '-') + '.pdf', @UserID, GETDATE())
SELECT @ErrorCode = 0, @Return_Message = 'Purchase order successfully created'
END
SET NOCOUNT OFF;
COMMIT TRAN
RETURN @ErrorCode -- =0 if success, <>0 if failure
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK
SELECT @ErrorCode = ERROR_NUMBER()
, @Return_Message = @ErrorStep + ' '
+ cast(ERROR_NUMBER() as varchar(20)) + ' line: '
+ cast(ERROR_LINE() as varchar(20)) + ' '
+ ERROR_MESSAGE() + ' > '
+ ERROR_PROCEDURE()
RETURN @ErrorCode -- =0 if success, <>0 if failure
END CATCH
votre sp est entouré par une autre transaction
OriginalL'auteur P. Praveen | 2016-03-08
Vous devez vous connecter pour publier un commentaire.
Vous devez également tenir compte des résultats de XACT_STATE() fonction. Vérifiez le bloc les Transactions non validables et XACT_STATE sur MSDN
ÉDITER PLUS TARD
J'ai changé d'avis au sujet d'une possible solution 🙂
Enfin, j'ai reçu votre situation reproduit. Look.
J'ai pris votre procédure, supprimé tous les code, sauf le code lié à la gestion des exceptions et
try\catch
logique et a ajouté l'expression de ce qui sera la cause de résolution de nom d'objet error (erreur fatale). Voici ce que j'aiOk, maintenant, si j'essaie d'exécuter cette procédure, j'ai obtenu le résultat suivant
avant
Msg 208, Niveau 16, État 0, la Procédure proc_PurchaseOrder_Create, à la Ligne 29
Nom d'objet non valide '##global_tmp_table'.
Msg 266, Niveau 16, État 2, la Procédure proc_PurchaseOrder_Create, à la Ligne 29
Nombre de transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Nombre précédent = 0, compteur = 1.
Donc, ce qui s'est passé? - Notre transaction reste ouverte - vous pouvez le vérifier en exécutant
print @@TRANCOUNT
dans la même fenêtrepourquoi c'est arrivé? - parce que le bloc catch ne peut pas attraper les erreurs fatales - à partir de la même MSDN l'article je l'ai mentionné plus tôt
Les types d'erreur suivants ne sont pas gérés par un bloc CATCH quand ils se produisent au même niveau d'exécution que la construction TRY...CATCH:
Les erreurs de compilation, comme les erreurs de syntaxe, qui empêchent un lot de course.
Les erreurs qui se produisent lors de la recompilation des instructions, telles que la résolution de nom d'objet erreurs qui se produisent après la compilation en raison de l'ajournement de la résolution de nom.
Avant que nous allons corriger cette situation, vous devez appeler
ROLLBACK
dans la fenêtre où vous avez essayé d'exécuter la procédure stockée pour enfin fermer notre transaction.Et comment nous pouvons résoudre ce problème? - nous avons juste besoin de
set XACT_ABORT ON
- vous pouvez trouver un exemple dans tous le même article dans le Utilisation de TRY...CATCH avec XACT_STATE blocDonc, finalement, notre procédure de test doit ressembler à ceci
Et maintenant, dans un cas d'erreur fatale moteur de base de données restaure automatiquement la transaction et vous aurez seulement le message d'erreur prévue
avant
Msg 208, Niveau 16, État 0, la Procédure proc_PurchaseOrder_Create, Ligne 31
Nom d'objet non valide '##global_tmp_table'.
deux ou trois choses, la première est dois-je les garder "SI @@TRANCOUNT > 0 ROLLBACK" tel qu'il est et la seconde est pourquoi/quand ce problème se passe.
Salut, @andrey, j'ai reçu votre solution et c'est exactement vous l'ai expliqué dans sql server. Mais le problème est que lorsque je l'appel de cette procédure à partir de mon C#.net à l'aide de entity framework 6 du code et de l'enregistrement des erreurs sur le fichier journal des erreurs suivantes
ERREUR [09 Mar 11:04:24][OLMPServices.Les contrôleurs.OrderManagementController.OrderPlacement(D:\VSS\Order Gestion du Cycle de vie du Portail\400_S6_ImplementationAndUnitaryTest_phase\Code Source\PMTO\Travail\PMTO.root\PMTO\OLMPServices\Controllers\OrderManagementController.cs:242)]- Système.Les données.SqlClient.SqlException (0x80131904): nombre de Transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Précédent count = 1, compteur = 0. Nombre de transactions après EXECUTE indique des différences de nombre de lancer et valider les déclarations. Précédent count = 1, compteur = 0.
Erreur sur l'insertion de données dans TxnOrderAddressDetails 8152 ligne: 49 String ou des données binaires d'être tronquée. > proc_PurchaseOrder_Create à OLMPBusiness.OrderManagementBusinessComponent.CreatePurchaseOrder(String authToken) D:\VSS\Order Gestion du Cycle de vie du Portail\400_S6_ImplementationAndUnitaryTest_phase\Code Source\PMTO\Travail\PMTO.root\PMTO\OLMPBusiness\OrderManagementBusinessComponent.cs:ligne à 198
OriginalL'auteur Andrey Morozov