Главная страница
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.014 c
3-70170
Oleon
2003-04-29 14:13
2003.05.22
Какие минусы при использовании IDENTITY для первичного ключа.


1-70363
FZ*XupypG
2003-05-10 04:08
2003.05.22
Сохранение типа TColor в текстовый файл и чтение его оттуда


1-70372
Nikos
2003-05-08 14:11
2003.05.22
Как правильно объявить массив объектов?


3-70106
romario
2003-04-29 10:20
2003.05.22
Как произвести обсчет?


3-70154
Belkova
2003-05-02 11:09
2003.05.22
Скролинг