Wyjatki i procedury przechowywane

0

Witam

Mam taki problem mianowicie ma program, ktory jest zbudowany w architekturze 3 wartowej(warstwa prezestacji, biznesowa i dostepu do bazy danych). Program laczy sie z baza danych, i wukonuje tam rozne operacje, ale mniejsza o to. W programie korzystam z procedur przechowywanych. I tu jest moj problem. Jak rozdzielić wyjatki rzucane przeze mnie (throw) od tych,ktore zostana zwrocone z bazy danych(np z powodu brak procedury itp.)??

Za odpowiedz z góry dziękuje :-)

0

możesz jaśniej bo nie bardzo kumam. Chyba wiesz gdzie rzucasz własny wyjątek, a gdzie może wystąpić wyjątek w bazie

0

Jak rozdzielić wyjatki rzucane przeze mnie (throw) od tych,ktore zostana zwrocone z bazy danych(np z powodu brak procedury itp.)??

catch(SqlException ex) {


}
0

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.

0

i oto rozwiązanie:D
kiedy wyrzuci nam wyjątek SqlException jest tam właściwość "Number" błąd o numerze "50000" to błędy rzucane przez RAISERROR mają właśnie ta wartość, zagłębiając sie w dokumentacje, google można znaleźć opis innych błędów.

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1