Ошибка Raise не работает в компонентах Unidac с клиентскими библиотеками Sybase 12.5
Мы используем Unidac Stored Proc Component в Delphi 10 с драйверами Sybase 12.5
В Sybase proc мы поднимаем ошибку, как показано ниже, я обнаружил, что она возвращается снова, но не отображается сообщение об ошибке. Это не работает в Unidac или по какой-либо другой проблеме?
if @number <> null
begin
select @errmsg = 'Already active for location '
raiserror 20001 @errmsg
return 1
end
я выполняю сохраненный процесс в Delphi, как показано ниже
try
ExecProc;
except on E:Exception do
begin
ErrorMsg(EDatabaseError(ExceptObject).Message,0);
Exit;
end;
но все же мы не можем поймать исключение.
даже я пытался, как показано ниже.
try
UniStoredProc.StoredProcName := 'test';
UniStoredProc.ExecProc;
except
on E:EUniError do
ShowMessage(E.Message);
end
Тот же код работает нормально с клиентскими библиотеками Sybase 15
Мы используем сервер Sybase 15 и клиентские библиотеки Sybase 12.5 для подключения к серверу, это будет проблемой? Ранее мы использовали BDE с клиентскими библиотеками Sybase 12.5, поэтому у нас не возникло проблем, теперь мы нашли эту проблему с помощью unidac.
2 ответа
Для сравнения с null
вам нужно использовать is
Оператор вроде так:
if @number is not null
begin
select @errmsg = 'Already active for location '
raiserror 20001 @errmsg
return 1
end
Теперь он должен выполнить код внутри оператора if-then.
Кажется, ответ - это повторное развертывание приложений с использованием клиента Sybase 15 вместо 12.5. Поскольку вы уже отключили опции "ANSINULL", код в procs наверняка вызвал бы исключение. И они делают, при использовании Sybase 15.
Побочное мышление: есть ли у Sybase 12.5 какая-либо конфигурация подключения / клиентской области, которая была отключена в этом выпуске и включена "ON" в версии Sybase 15?
Если это не так, это ошибка в Sybase 12.5, которая исправлена в выпуске Sybase 15 (или даже до 13, я не знаю).
Вам не нужно ничего переписывать, просто перераспределите.
PS: мне никогда не нравилось развертывать приложение на сервере с клиентскими библиотеками, которые не совпадают по версии, всегда есть возможность открыть банку с червями... И это, очевидно, так.
PS2: Конечно, UniDAC использует больше функциональности, чем BDE (который был промежуточным ПО с подходом "второстепенный общий знаменатель"), который затронул это слабое место на клиентских библиотеках 12.5.
Другое дело, что в SQL Server (который имеет общее наследие с Sybase), raiseerror
иметь severity
параметр. И только сообщения серьезности 16+ (AFAIR) считаются ошибками - возможно, BDE решил, что все является ошибкой, где UniDAC только следит за документацией.
Это очень дикая догадка.