Ошибка 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 только следит за документацией.
Это очень дикая догадка.

Другие вопросы по тегам