我们在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存在这个问题
答案 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只关注文档。