Hej,
kolega napisał w moim imieniu i troszkę chyba źle mu to wytłumaczyłem(rozmowa tel.).
Więc tak: Mam aplikacje w której używam Enterprise Library 4.0 dokładnie bloków:
Data access AB
Validation AB
Exception handling AB
Logging AB
Baza danych : sql server 2005 express edition
i teraz tak w aplikacji musze dodać pracownika i pobrac jego daneg i wstawic je do datagridview, robie to tak:
mam sobie procedurę która dodaj pracownika do tabeli "DodajPracownika" ktora w momencie uruchomienia dodaje pracownika i zwraca jego dane.
Ale jak wiadomo czasem zdarzają sie dziwne błędy np: unikalne pola wtedy występuje błąd i sie program sypie: wiec probowałem w miarę przewidzieć podczas pisania procedury co może sie sypnąć i skleciłem coś takiego:
create Procedure dbo.DodajPracownika
@PracownikImie VarChar(20)
, @PracownikNazwisko varchar(25)
, @PracownikLogin varchar(10)
, @PracownikKod varchar(6)
, @PracownikHaslo char(8)
, @PracownikIdDzialu int
, @PracownikDyrektor bit
, @PracownikPracownik bit
, @PracownikSekretariat bit
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRY
DECLARE @MESSAGE VARCHAR(500)
SET @MESSAGE = 'Nie można dodać pracownika'
IF (SELECT COUNT(*) From dbo.Pracownicy WHERE Login = @PracownikLogin) <> 0
BEGIN
SET @MESSAGE = @MESSAGE + 'Login istnieje w systemie.'
END
--jesli -1 przerywa moze dorzucic zliczanie bledow, i zczaic blok try catch
IF (SELECT COUNT(*) From dbo.Pracownicy WHERE KodPracownika = @PracownikKod) <> 0
BEGIN
SET @MESSAGE = @MESSAGE + 'Kod Pracownika jest obecnie używany.'
END
BEGIN TRY
INSERT INTO dbo.Pracownicy
(
Imie
,Nazwisko
,Login
,KodPracownika
,Haslo
,IdDzialu
,Dyrektor
,Pracownik
,Sekretariat
)
VALUES
(
@PracownikImie
,@PracownikNazwisko
,@PracownikLogin
,@PracownikKod
,@PracownikHaslo
,@PracownikIdDzialu
,@PracownikDyrektor
,@PracownikPracownik
,@PracownikSekretariat
)
DECLARE @PracownikId int
SELECT @PracownikId = SCOPE_IDENTITY()
--wykonujemy procedure ktora zwraca nam dane dotyczace dopiero dodanego pracownika
EXECUTE ShowEmployee @PracownikId
END TRY
BEGIN CATCH
RAISERROR(@MESSAGE, 16, 99)
END CATCH
END
Jak można powyżej zauważyć w razie wystapienia bledu zostanie wykonane: RAISERROR(@MESSAGE, 16, 99)
Teraz 1 pytanie czy to co zrobiłem powinno sie tak robić ?? dlatego że np: chciałbym użytkownikowi wysłać wiadomość ze "SET @MESSAGE = @MESSAGE + 'Login istnieje w systemie.'" więc łapie poniższy wyjatek i rzucam dalej
catch(SqlException ex)
Wszystko jest świetnie gdy wiadomość poleci z procedury, ale reszta sie komplikuj gdy np.: wyłączę serwer i próbując wywołać procedurę wyskoczy całkiem inny błąd który np nie chciałbym przedstawić użytkownikowi. I teraz nie wiem jak zrobić by moja aplikacja rozróżniała błędy generowane prze zemnie w moich procedurach, a błędy inne pochodzące z serwera???
Na razie zastanawiam sie czy nie sprawdzać po prostu czy wyjątek który został wyrzucone nie posiada np: RAISERROR(@MESSAGE, 16, 99) : severity na 16, a stanu na 99? co wy na to jakieś propozycję???
Mam nadzieje że jakoś to napisałem po ludzku;p
pozdrawiam.