使用Sybase 12.5客户端库的Unidac组件中是否出现Raise错误

时间:2011-08-23 14:58:16

标签: delphi delphi-2010 sybase devart unidac

我们在Delphi 10中使用Unidac Stored Proc组件和Sybase 12.5驱动程序

在Sybase proc中,我们发出如下错误,我发现它正在重新启动,但它没有显示错误消息。这不适用于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 Client库连接到服务器,这会有问题吗?之前我们使用BDE和Sybase 12.5客户端库,所以我们没有遇到任何问题,现在我们发现unidac存在这个问题

2 个答案:

答案 0 :(得分:5)

要与null进行比较,您需要使用is运算符,如下所示:

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

现在它应该在if-then语句中执行代码。

答案 1 :(得分:0)

似乎答案是使用Sybase 15 Client而不是12.5重新部署应用程序。 由于您已经关闭了“ANSINULL”选项,因此procs中的代码肯定会 产生了异常触发。他们在使用Sybase 15时也这样做。

侧面思考:Sybase 12.5具有任何连接/客户端范围的配置 在该版本中被关闭并在Sybase 15版本中变为“ON”?

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

您无需重写任何内容,只需重新部署即可。

PS:我从来不喜欢将应用程序部署到服务器上,客户端库与版本不匹配, 总是有可能打开一罐蠕虫......这显然是这种情况。

PS2:当然,UniDAC使用的功能比BDE更多(BDE是一个中间件 触及12.5个客户群上的弱点的“小公分”方法 另一点是,在SQL Server(与Sybase有共同的遗产)中,raiseerror具有 一个severity参数。只有严重程度为16+(AFAIR)的消息才被视为错误 - 可能是BDE 决定一切都是错误,UniDAC只关注文档。
这是一个非常狂野的猜测。