Форум: "Базы";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизКак перехватить исключение из 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c