我们在Delphi 10中使用Unidac存储的Proc组件和Sybase 12.5驱动程序
在Sybase proc中,我们提出了如下错误,我发现它正在重新调整,但它没有显示错误message.Isthis不工作在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存在的问题
发布于 2011-08-23 15:27:29
为了与null进行比较,您需要使用is操作符,如下所示:
if @number is not null
begin
select @errmsg = 'Already active for location '
raiserror 20001 @errmsg
return 1
end 现在,它应该在if-then语句中执行代码。
发布于 2011-08-29 20:45:35
答案似乎是使用Sybase 15客户端而不是12.5重新部署应用程序。由于您已经关闭了"ANSINULL“选项,procs中的代码肯定会产生异常触发。当他们使用Sybase 15的时候,他们就这样做了。
旁白思考: Sybase 12.5是否有任何连接/客户范围内的配置,在该版本中被关闭,并在Sybase 15版本中打开?
如果不是,这是Sybase 12.5版本中的一个bug,它在Sybase 15版本中得到了修正(甚至在13版之前,我不知道)。
你不需要重写任何东西,只需要重新部署。
PS:我从来不喜欢在服务器上部署不匹配版本的客户机库,总是有可能打开一罐蠕虫.很显然,情况就是这样。
PS2:当然,UniDAC比BDE使用更多的功能(BDE是一个具有“小公分母”方法的中间件),后者在12.5客户机库中触及了这个弱点。
另一点是,在Server (它与Sybase有共同的传统)中,raiseerror有一个severity参数。而且只有严重性16+ (AFAIR)消息才被认为是错误--也许BDE决定了一切都是错误,其中UniDAC只遵循文档。
这是非常狂野的猜测。
https://stackoverflow.com/questions/7163101
复制相似问题