在Sybase 12.5客户端库的Unidac组件中不起作用



我们在Delphi 10和Sybase 12.5驱动程序中使用Unidac存储过程组件

在Sybase进程中,我们正在引发如下错误,我发现它正在返回,但没有显示错误消息。这在Unidac中不起作用还是有其他问题?

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

我在Delphi中像下面这样执行storedproc

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客户端库连接到服务器,这会有问题吗?早先我们在Sybase 12.5客户端库中使用BDE,所以我们没有遇到任何问题,现在我们在unidac

中发现了这个问题。

要与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"选项,那么进程中的代码当然会关闭产生了异常触发。当使用Sybase 15时,它们确实是这样做的。

侧面思考:Sybase 12.5有任何连接/客户端范围的配置在那个版本中被关闭,在Sybase 15版本中被打开?

如果不是,那么这是Sybase 12.5的一个错误,在Sybase 15版本(甚至是Sybase 15版本)中得到了纠正在13之前,我不知道)。

你不需要重写任何东西,只需要重新部署。

PS:我从来都不喜欢把应用部署到一个版本不匹配的服务器上,总是有可能打开一罐蠕虫…这显然是事实。

PS2:当然UniDAC使用了比BDE更多的功能(BDE是一个带有"小公分母"方法),触及了12.5客户端库的弱点。
另一点是,在SQL Server(有一个共同的遗产与Sybase), raiseerror有a severity参数。只有严重性为16+ (AFAIR)的消息才被认为是错误——可能是BDE决定一切都是错误的,而UniDAC只遵循文档。
这是一个非常疯狂的猜测。

相关内容

  • 没有找到相关文章

最新更新