1

我们在 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 客户端库连接到服务器,这会不会有问题?之前我们将 BDE 与 Sybase 12.5 客户端库一起使用,所以我们没有遇到任何问题,现在我们发现 unidac 存在这个问题

4

2 回答 2

5

为了与您进行比较,null您需要is像这样使用运算符:

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

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

于 2011-08-23T15:27:29.747 回答
0

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

侧面思考:Sybase 12.5 是否有任何连接/客户端范围的配置在该版本中关闭并在 Sybase 15 版本中打开?

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

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

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

PS2:当然,UniDAC 使用的功能比 BDE(这是一个具有“小公分母”方法的中间件)更多的功能,它触及了 12.5 客户端库上的弱点。
另一点是,在 SQL Server(与 Sybase 有共同继承)中,raiseerror有一个severity参数。并且只有严重性 16+ (AFAIR) 消息被视为错误 - 也许 BDE 认为一切都是错误的,而 UniDAC 仅遵循文档。
这是一个非常疯狂的猜测。

于 2011-08-29T20:45:35.063 回答