Ошибка 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 

я выполняю storeproc в 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


person SSE    schedule 23.08.2011    source источник
comment
Что говорят ребята из Unidac?   -  person Michael Riley - AKA Gunny    schedule 30.08.2011
comment
Они говорят, что с Юнидаком проблем нет... для них он работает, а для меня нет...   -  person SSE    schedule 30.08.2011
comment
Попробуйте создать образец vmdk (VMWare) и отправить им аналогичную конфигурацию плюс недорогую версию Sybase, аналогичную вашей (у SQL Server есть экспресс-версия, не знаю, Sybase). Чтобы они могли воспроизвести проблему, если это их проблема...   -  person Fabricio Araujo    schedule 15.10.2011


Ответы (2)


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

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

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

person Johan    schedule 23.08.2011
comment
Я уже пробовал, это не вариант, мы уже установили параметр, поэтому он переходит в if claase, но не возвращает ошибку. - person SSE; 24.08.2011
comment
@stupid, сравнивать с null можно только с помощью is. Это стандартный SQL. - person Johan; 24.08.2011
comment
@stupid, есть еще один способ вызвать исключение, выбрать из несуществующей таблицы. вот так: select * from table_error_already_active_for_location Если попробовать то вылезает ошибка? - person Johan; 24.08.2011
comment
Я могу зафиксировать ошибку, возникающую с клиентскими библиотеками Sybase 15, но не с библиотеками Sybase 12.5. Есть ли какие-либо проблемы с библиотеками Syb 12.5 @Johan.. Мы переходим с BDE на Unidac ранее в BDE: ‹› null разрешен, поэтому разрешить это мы отключили ansinull ... и еще одна вещь, когда я выбираю из таблицы, она не компилируется ... я думаю, это неправильное решение. - person SSE; 25.08.2011
comment
Я предполагаю, что Unidac с драйверами Sybase 12.5 не может идентифицировать поднятые исключения. Есть ли способ изменить в delphi, а не в proc.. потому что у нас есть около 120+ процессов с этой проблемой. - person SSE; 25.08.2011

Кажется, ответ заключается в повторном развертывании приложений с использованием клиента Sybase 15 вместо 12.5. Поскольку вы уже отключили параметры «ANSINULL», код в procs наверняка вызвал бы срабатывание исключения. И они делают это при использовании Sybase 15.

Со стороны: есть ли в Sybase 12.5 какая-либо конфигурация соединения/клиента, которая была отключена в этом выпуске и включена в версии Sybase 15?

Если это не так, то это ошибка Sybase 12.5, которая исправлена ​​в выпуске Sybase 15 (или даже раньше, в 13, я не знаю).

Вам не нужно ничего переписывать, просто передислокируйте.

PS: Мне никогда не нравилось деплоить приложение на сервер с клиентскими либами, которые не совпадают по версии, всегда есть возможность открыть банку с червями... И это случай, видимо.

PS2: Конечно, UniDAC использует больше функций, чем BDE (который был промежуточным программным обеспечением с подходом «меньший общий знаменатель»), который затронул это слабое место в клиентских библиотеках 12.5. с Sybase), raiseerror имеют параметр severity. И только сообщения серьезности 16+ (AFAIR) считаются ошибками - возможно, BDE решила, что все является ошибкой, тогда как UniDAC только следует документации.
Это ОЧЕНЬ ДИКАЯ догадка.

person Fabricio Araujo    schedule 29.08.2011
comment
Спасибо за довольно интересные предположения. Повторное развертывание приложения с sybase 15 может повлиять на другие приложения, работающие на драйверах syb 12.5. Я полагаю, что проблема связана с Syb 12.5, но до сих пор не могу найти решение :( - person SSE; 30.08.2011
comment
На сайте Sybase ничего нет в базе знаний? - person Fabricio Araujo; 30.08.2011