Ошибка Raise не работает в компонентах Unidac с клиентскими библиотеками Sybase 12.5 - PullRequest
1 голос
/ 23 августа 2011

Мы используем 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 ]

5 голосов
/ 23 августа 2011

Для сравнения с null вам нужно использовать оператор is следующим образом:

if @number is not null
begin
  select @errmsg = 'Already active for location ' 
  raiserror 20001 @errmsg 
  return 1 
end 

Теперь он должен выполнить код внутри оператора if-then.

0 голосов
/ 30 августа 2011

Кажется, что ответ - это повторное развертывание приложений с использованием клиента 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 только следит за документацией.
Это ОЧЕНЬ ДИКИЙ догадка.

...