Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.22;
Скачать: CL | DM;

Вниз

Как перехватить исключение из MS SQL сервера?   Найти похожие ветки 

 
AndrewK ©   (2003-04-29 09:53) [0]

Как перехватить исключение из MS SQL сервера?
Например, пользователь хочет выполнить хранимую процедуру к которой не имеет доступа. Сервер при попытке вызова выдает сообщение

"EXECUTE permission denied on object "spGetList", database "DB", owner "dbo"".

Как можно отловить такое сообщение и заменить его на что-то типа:

"Нет доступа"


 
Yuraz ©   (2003-04-29 09:57) [1]

хранимая проц. пишется так:
BEGIN
EXCEPTION
//здесь сообщение, которое посылаешь пользователю при ошибке
END;



 
NAlexey ©   (2003-04-29 10:08) [2]

>EXCEPTION
> //здесь сообщение, которое посылаешь пользователю при ошибке
>END
Ты не ошибаешся случаем? По моему это справедливо для Oracle но не для MSSQL?

тебе где его надо перехватить? На клиенте или на серевере?
Если на клиенте то обрабатывай try...except...end; если на сервере то @@ERROR и RAISEERROR...


 
AndrewK ©   (2003-04-29 10:41) [3]

Хочу это сделать на клиенте, но не получается.

Вот код
...
var E : Exception;
...
try
qUsers.Active := True;
except
ShowMessage(E.Message);
end;
...

если без try .. except .. end, то выдает сообщение "EXECUTE permission denied on ...", если с ним, то выдает пустую строку.
Как бы узнать код возвращаемой ошибки, или хотя бы строку для анализа.


 
sniknik ©   (2003-04-29 10:54) [4]

а так?
...
try
qUsers.Active := True;
except
on E: Exception do ShowMessage(E.Message);
end;
...
(если хочеш код лови EOSError)


 
NAlexey ©   (2003-04-29 11:33) [5]

>var E : Exception;
>try
> qUsers.Active := True;
>except
> ShowMessage(E.Message);
>end;
>если с ним, то выдает пустую строку.
Да, силен брат. А что же еще тебе должно выдаваться? E то еще и в помине нет. Это всеравно что такое вот:
var
S: String;
try
except
ShowMessage(S);
end;
И удивляться почему это у тебя пустую строку выдает.
>on E: Exception do ShowMessage(E.Message);
Вот это уже правильно, здесь E уже существует, и ты може шь к ниму обращаться, но on E: Exception слишком широко. Используй EDatabaseError и EADOError а в else или еще какие блоки обрабатывай другие ошибки.


 
AlexGof ©   (2003-04-29 11:51) [6]

Я отлавливал ошибки на ApplicationEvents вот таким макаром
procedure TGMenu.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
var Er : EOleException;
i : integer;
begin
If (E is EOleException) then
begin
Er:=E as EOleException;
case Er.ErrorCode of
-2147217911 : begin
Application.MessageBox("У вас недостаточно прав, для доступа к данным","",MB_OK+MB_ICONERROR);
end;
end;
end;

end;
код ошибки можно отловить в пошаговом режиме программы твоей, может это и неправильно, но работает....


 
sniknik ©   (2003-04-29 13:00) [7]

AlexGof © (29.04.03 11:51)
ну тут то тебе его передают параметром, другое дело, сам можеш так

try
qUsers.Active := True;
except
on E: Exception do ApplicationEvents1Exception(self, E);
end;

и там в процедуре оно будет
(кстати переменная лишняя по моему)
... case (E as EOleException).ErrorCode of ...
и можно убрать.


 
sniknik ©   (2003-04-29 13:03) [8]

и проверку тоже (в процедуре) тогда можно убрать, поставить
on E: EOleException do ApplicationEvents1Exception(self, E);
и все.


 
AndrewK ©   (2003-04-30 10:15) [9]

Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.05.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
1-70263
P.Kert
2003-05-12 13:09
2003.05.22
Вложенные меню


14-70481
GOOD
2003-05-01 02:33
2003.05.22
<B>прочитайте выписки из известных рассказов, газет, поэм</B>


14-70432
Ricks
2003-05-01 21:22
2003.05.22
Игра - танчики.


1-70316
sirsp
2003-05-08 12:34
2003.05.22
Как уменьшить размер DLL


3-70094
sdram
2003-05-03 09:26
2003.05.22
Как создать временную таблицу?