![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить исключение из MS SQL сервера? [D6, MSSQL]
AndrewK © (2003-04-29 09:53:00)Как перехватить исключение из MS SQL сервера?
Например, пользователь хочет выполнить хранимую процедуру к которой не имеет доступа. Сервер при попытке вызова выдает сообщение
"EXECUTE permission denied on object "spGetList", database "DB", owner "dbo"".
Как можно отловить такое сообщение и заменить его на что-то типа:
"Нет доступа"
AndrewK (2003-04-30 10:15:00) [1]Спасибо.
sniknik (2003-04-29 13:03:00) [2]и проверку тоже (в процедуре) тогда можно убрать, поставить
on E: EOleException do ApplicationEvents1Exception(self, E);
и все.
sniknik (2003-04-29 13:00:00) [3]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 ...
и можно убрать.
AlexGof (2003-04-29 11:51:00) [4]Я отлавливал ошибки на 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;
код ошибки можно отловить в пошаговом режиме программы твоей, может это и неправильно, но работает....
NAlexey (2003-04-29 11:33:00) [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 или еще какие блоки обрабатывай другие ошибки.
sniknik (2003-04-29 10:54:00) [6]а так?
...
try
qUsers.Active := True;
except
on E: Exception do ShowMessage(E.Message);
end;
...
(если хочеш код лови EOSError)
AndrewK (2003-04-29 10:41:00) [7]Хочу это сделать на клиенте, но не получается.
Вот код
...
var E : Exception;
...
try
qUsers.Active := True;
except
ShowMessage(E.Message);
end;
...
если без try .. except .. end, то выдает сообщение "EXECUTE permission denied on ...", если с ним, то выдает пустую строку.
Как бы узнать код возвращаемой ошибки, или хотя бы строку для анализа.
NAlexey (2003-04-29 10:08:00) [8]>EXCEPTION
> //здесь сообщение, которое посылаешь пользователю при ошибке
>END
Ты не ошибаешся случаем? По моему это справедливо для Oracle но не для MSSQL?
тебе где его надо перехватить? На клиенте или на серевере?
Если на клиенте то обрабатывай try...except...end; если на сервере то @@ERROR и RAISEERROR...
Yuraz (2003-04-29 09:57:00) [9]хранимая проц. пишется так:
BEGIN
EXCEPTION
//здесь сообщение, которое посылаешь пользователю при ошибке
END;