【发布时间】:2012-04-27 19:35:28
【问题描述】:
我在 Windows Server 2008 R2 上使用 Delphi-XE2 Enterprise、SQLServer 2008 R2。当引发 SQL 错误时,DataSnap 服务器会捕获它并将其返回给客户端应用程序。这一切都有效,除了它被截断为 256 个字符的错误消息。
引发错误时 DataSnap 服务器的堆栈跟踪显示,当使用 [file:Data.DBXDynalink]TDBXMethodTable.RaiseError() 方法通过 DBX 框架检索 SQL DB 错误时,SQL 错误消息被截断。 RaiseError() 方法中的以下代码行将 MessageLength 设置为 256,即使错误消息更长。因此返回给客户端的错误信息永远不会超过 256 个字符。
Status := FDBXBase_GetErrorMessageLength(DBXHandle, DBXResult, MessageLength);
FDBXBase_GetErrorMessageLength属于TDBXCommon_GetErrorMessageLength类型,定义为:
TDBXCommon_GetErrorMessageLength = function(Handle: TDBXCommonHandle; LastErrorCode: TDBXErrorCode; out ErrorLen: TInt32): TDBXErrorCode; stdcall;
有没有办法增加缓冲区大小以允许将更多的数据库错误发送到客户端(例如,512 个字符),或者这只是 DBX 框架的限制?
【问题讨论】:
-
您可能会变得笨拙并编辑组件源,但我不建议这样做。您应该尝试并接受限制。没有多少错误会超过 256,除非它们包含 sql 引用并且您肯定知道您在程序中的位置。抱歉,这不是您希望的答案,祝您好运。
-
我已经看过组件源码了。这似乎是一个外部调用来获取错误的 MessageLength,所以我认为除非 DBXDrivers.ini 文件(或类似文件)中有一个属性,否则我无能为力......我用一个包装 SQL 错误更人性化的错误。它们加起来超过了 256 个字符。这就是为什么我想将限制扩展到 512 之类的东西。
-
我原以为您的问题与"Reconcile Error: Has anyone had problems with truncated error messages?" 的问题重复。但是您的分析与该问题/答案作者的the analysis 有很大不同。所以我不确定..
-
感谢您的链接。我通读了它,我相信卡洛斯正在处理同样的潜在问题。我也怀疑 midas.dll。我相信他的解释是我一直在寻找的答案。谢谢 Sertac!
-
@James - 不客气!.. 遗憾的是,开发人员觉得必须满足于他们选择的合适的东西,否则编码没什么大不了的。跨度>
标签: sql-server delphi error-handling datasnap truncated