我们在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只遵循文档。
这是一个非常疯狂的猜测。