Tapahtumien virheiden käsitteleminen

Valmis

Jäsennetty poikkeusten käsittely käyttää TRY/CATCH-rakennetta virheiden testaamiseen ja virheiden käsittelemiseen. Käytettäessä poikkeusten käsittelyä tapahtumissa on tärkeää sijoittaa COMMIT- tai ROLLBACK-avainsanat oikeaan paikkaan suhteessa TRY/CATCH-lohkoihin.

Vahvistustapahtumat

Kun käytät tapahtumia jäsennettyjen poikkeusten käsittelyssä, sijoita VAHVISTUSTAPAHTUMA TRY-lohkoon seuraavan koodiesimerkin mukaisesti:

BEGIN TRY
 BEGIN TRANSACTION
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION
END TRY 

Palautustapahtuma

Kun sitä käytetään jäsennettyjen poikkeusten käsittelyssä, sijoita PALAUTUSTAPAHTUMA CATCH-lohkon sisälle seuraavan koodiesimerkin mukaisesti:

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	ROLLBACK TRANSACTION;
END CATCH;

XACT_STATE

Jos haluat välttää aktiivisen tapahtuman peruuttamisen, käytä XACT_STATE funktiota. XACT_STATE palauttaa seuraavat arvot:

Palautusarvo Merkitys
1 Nykyisellä pyynnöllä on aktiivinen, sitoutuneen käyttäjän tapahtuma.
0 Ei aktiivista tapahtumaa.
-1 Nykyisellä pyynnöllä on aktiivinen käyttäjätapahtuma, mutta on ilmennyt virhe, jonka vuoksi tapahtuma on luokiteltu ei-valtuuttamattomaksi tapahtumaksi.

XACT_STATE voi tarkistaa ennen ROLLBACK-komentoa, onko tapahtuma aktiivinen.

Seuraava koodi näyttää CATCH-lohkossa käytettävän XACT_STATE funktion niin, että tapahtuma peruutetaan vain, jos käyttäjätapahtuma on aktiivinen.

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.SimpleOrders(custid, empid, orderdate) 
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.SimpleOrderDetails(orderid,productid,unitprice,qty) 
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	IF (XACT_STATE()) <> 0
    	BEGIN
        ROLLBACK TRANSACTION;
    	END;
	ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;