协调错误:有人遇到过错误消息被截断的问题吗?

2023-11-27

我再次来这里寻求帮助。这次我相信,鉴于我将涉及的问题的特殊性,很少有人会做出回应。我刚开始进入 DataSnap 的世界,但仍然有一些事情我不明白我将如何关联这个错误。

我的Delphi是XE(版本1,Update1)。我正在使用 Postgres,它会生成葡萄牙语(巴西葡萄牙语)的错误消息,因此错误消息带有重音。连接组件是ZeosLib包。

我正在使用“协调错误”对话框来显示更新应用程序产生的错误并进行测试,我尝试插入已存在的记录,从而违反了唯一键并显示协调错误对话框。

在对话框的备忘录中,出现的消息被截断,即剪切。一探究竟:

ERRO:  duplicar valor da chave viola a restrição de unicidade "uc_usu_va_login"
DETAIL:  Chave (va_login)=(admin) já existe.
CONTEXT:  comando SQL "INSERT INTO USUARIOS (VA_NOME
                           ,VA_LOGIN
                           ,CH

但实际上应该返回的是:

ERRO:  duplicar valor da chave viola a restrição de unicidade "uc_usu_va_login"
DETAIL:  Chave (va_login)=(admin) já existe.
CONTEXT:  comando SQL "INSERT INTO USUARIOS (VA_NOME
                               ,VA_LOGIN
                               ,CH_SENHA
                               ,VA_EMAIL)
                        VALUES (pVA_NOME
                               ,pVA_LOGIN
                               ,pCH_SENHA
                               ,pVA_EMAIL)"
    PL/pgSQL function "idu_usuarios" line 7 at comando SQL

我在服务器上做了调试,看看问题是否出在ZeosLib上,但是我发现服务器上生成的错误消息是完整的,证明ZeosLib没有截断消息。一切都是unicode。在我的程序和 ZeosLib 中,所有字符串都是 WideString(默认)。

大家知道,要在服务器上抛出异常,粗略地说,是通过DataSnap转发到客户端,而在客户端,TClientDataSet的Reconcile方法验证是否有问题,然后抛出著名的异常EReconcileError,可以是在 TClientDataSet 的 OnReconcileError 事件中处理,因此我相信该消息被 DataSnap 截断。

在客户端上,我调试 Reconcile 方法(DBClient.pas),并且在抛出异常之前,流程立即进入 cpp 源代码中的一个函数,我认为该函数是 midas.dll 库的一部分,更具体地说,是 MidasLib.obj,因为我是使用此策略,不必将 DLL 与我的应用程序一起分发。

Check(FDSBase.Reconcile_MD(FReconcileDataSet.FDSBase, FDeltaPacket, VarToDataPacket(Results), Integer(Self), RCB));

该调用是在 Delphi XE Update1 上的 DBClient.pas 单元的第 1952 行完成的。按 F7,调试器会输入源 C++ (cpp),因此我相信它位于 midaslib.obj 内。我对 C++ 不太了解,我按 Shift-F8 退出当前方法并返回下一条指令,该指令已经在事件 OnReconcileError 中了!因此,截断必须在我提到的函数内、cpp 源代码内、midaslib 内完成。

我的目的是使“协调错误”对话框不仅成为最终用户的工具,而且成为支持个人的工具,分别提供错误、详细信息和上下文的信息。这对发现问题有很大帮助。

现在的问题是让消息完整​​显示。有人遇到过这种消息被 midas 截断的问题吗?

另外一点 DSClient.pas 我可以在传递给异常时提取错误消息:

'Erro SQL: ERRO:  duplicar valor da chave viola a restrição de unicidade "uc_usu_va_login"'#$A'DETAIL:  Chave (va_login)=(admin) já existe.'#$A'CONTEXT:  comando SQL "INSERT INTO USUARIOS (VA_NOME'#$A'                           ,VA_LOGIN'#$A'                           ,CH'

如果删除引号并用空格(1 个字符)替换 #$A(1 个字符),您将看到该字符串正好有 255 个字符!

我还发现 dspickle.cpp 中的“GetErrorString”使用常量 DBIMAXMSGLEN,该常量在 bdetypes.h 中定义为 127(255 的一半)。由于我们身处 Unicode 世界,因此将这个值增加到 255 以便每个字符有两个字节不是一个问题吗?这只是一个猜测...

我把这个问题悬而未决,因为我缺乏理解 C++ 的知识:) 谁能帮忙,只需看看 dspickle.cpp 中的函数实现“GetErrorString”即可。有这样的:

LoadString((HINSTANCE)hDll, iErrCode, pString, DBIMAXMSGLEN)

pString 是错误消息,DBIMAXMSGLEN = 127。


与其他人的意见相矛盾,我决定进一步调整,并最终弄清楚如何增加“协调”错误消息中的字符数。我认为问题出在 midas.dll 中,或者更具体地说,问题出在构成 midas dll 的源中,因为同一组源可以创建 MidasLib,它不需要 midas dll。为了解决这个问题,我必须安装 Delphi C++ 个性来编译 midas。

找到错误所在行后,我发现竟然还有QC要求维修(http://qc.embarcadero.com/wc/qcmain.aspx?d=84960)这似乎被 Embarcadero 的工作人员忽略了,因为“解决方案”是“推迟到下一个版本”(推迟到下一个版本),但请求是从 2010 年开始的,我正在使用 Delphi XE,在我看来应该有解决方案,但在这里我自己纠正;)

问题出在“DSBASE”类的“Clone”方法内部,位于源“ds.cpp”的第 2133 行(Delphi XE,Update1)。下面是代码块。红线是有问题的线:

// Set the third field for the error string.
LdStrCpy((pCHAR)pFldDes->szName, szdsERRMESSAGE);
pFldDes->iFldType = fldZSTRING;
pFldDes->iUnits1 = 255; // Increased on request.. DBIMAXMSGLEN;
pFldDes++;

请注意,问题线非常有趣。它的常量值为 255,它限制错误消息的大小和注释“根据请求增加”。另请注意,注释旁边有一个常量DBIMAXMSGLEN,我发现并已经怀疑它是造成问题的原因,但由于它没有被使用,我改变了值DBIMAXMSGLEN但错误消息总是没有变化。值得一提的是,后面有一个分号(;)DBIMAXMSGLEN这让我认为之前(我不知道什么时候)这一行是我修复之后的一行:

pFldDes->iUnits1 = DBIMAXMSGLEN;

就好像有人故意将字段值设置为 255,从而删除了之前真正动态且看似更正确的实现。更换线路后,我增加了DBIMAXMSGLEN至 1024。DBIMAXMSGLEN被声明为“bdetypes.h”作为定义。更正后,该行是这样的:

#define DBIMAXMSGLEN         1024           // Max message len

在“ds.cpp”和“bdetypes.h”中进行这两项更改后,我进行了构建、测试,结果符合预期:错误消息在“协调”对话框中完整呈现。

对于那些想尝试的勇敢者,如果他们看到过这个问题,你需要MIDAS的源代码,如果我没记错的话,MIDAS是从2010年开始随Delphi一起提供的。祝你们好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协调错误:有人遇到过错误消息被截断的问题吗? 的相关文章

随机推荐

  • 将 @font-face 与 ABCPDF 一起使用?或者有其他方法将字体转换为 PDF 吗?

    我们有一个大型应用程序成功使用 ABCPDF NET 和 HTML 样式文本 我们习惯于使用 Windows 中未安装但存储在文件系统其他位置的文件中的字体添加文本 我们这样做是为了每个用户都可以上传自己的字体并将其与输出一起使用 我们使用
  • 即使设置了权限且外部存储处于 MEDIA_MOUNTED 状态,也无法写入 SD 卡

    在尝试将文件写入 SD 卡时 我得到java io FileNotFoundException filename Read only file system 例外 遗憾的是 这里发布的许多解决方案都没有帮助我 我已设置权限 外部存储处于 M
  • 如何以编程方式与应用程序交互

    我可能很快就会从事一些项目 在这些项目中 我需要从文件中获取数据并以编程方式将该数据输入到另一个第三方 不是我自己的 应用程序中 一个问题 我不知道如何做到这一点 我需要输入数据 例如时间表上的时间 任何人都可以引导我朝正确的方向发展以获取
  • 如何制作完美的方形图像/按钮

    我正在为 Android 设计一个基本的数独游戏 我想要一个 4x4 的表格 其中所有单元格都是正方形 我正在尝试使用 16 个按钮TableLayout 我的方式看起来像这样 它们的形状是矩形 my xml
  • 如果文件权限大于755,如何在Perl中检查?

    对于unix文件 我想知道Group或World是否对该文件有写权限 我一直在思考这些问题 my fpath orion properties my info stat fpath my retMode info gt mode retMo
  • 如何中断正在等待recv函数的线程? [复制]

    这个问题在这里已经有答案了 我有一个套接字侦听器 它挂在 recv 函数上 size t recvLen recv sock buf 512 0 我想通过中断来终止该线程 MSDN 说 发出阻塞 Winsock 调用时 比如recv Win
  • 根据key从多维数组中删除元素

    如何从给定键的多维数组中删除元素 我希望这是贪婪的 以便它删除数组中与我传入的键匹配的所有元素 到目前为止 我可以遍历多维数组 但我无法取消设置我需要的键因为我没有参考它 function traverseArray array keys
  • 从 Swift 中的“共享扩展”内部访问“UIApplication”的“共享”变量

    我需要从扩展内部执行我的主机应用程序 在Objective C我用过这个 Get UIApplication class name through ASCII Character codes NSString className NSStr
  • 如何在没有 mkl 的情况下安装 scipy

    现在我正在研究 Python 3 5 并尝试使用 Heroku 部署我的 Web 应用程序 当我尝试在线发布它时 Numpy mkl 与 Heroku 不兼容 它只能找到普通版本的 Numpy 所以我卸载 Numpy mkl 并安装普通的
  • grunt:可以为插件重新定位“node_modules”吗?

    如果我安装任何 grunt 插件 默认情况下它会添加到项目目录根目录中名为 node modules 的文件夹中 我的问题 是否可以将整个文件夹 以及所有插件 移动到另一个位置 但仍在我的项目文件夹中 比如说 build node modu
  • 使用 selenium 的 send_keys() 发送表情符号

    我想发送一个 heart 带有硒的表情符号send keys from selenium import webdriver from selenium webdriver support ui import WebDriverWait dr
  • Ruby on Rails:以表单形式提交数组

    我有一个模型 它的属性是数组 我从表单提交中填充该属性的正确方法是什么 我知道表单输入的名称包含括号的字段会根据输入创建哈希值 我是否应该在控制器中逐步执行它以将其按摩到数组中 使其不那么抽象的示例 class Article serial
  • 如何使用 Google 地图 API 获取本地业务结果

    是否有任何 google Yahoo Bing API 可以根据某个位置的邮政编码 地理代码提供本地业务结果 如果是 请告诉我 如果 Google 地图有此类服务 请告诉我在哪里可以获得相关参考信息 披露 我在 SerpApi 工作 是否有
  • 我应该采取哪些步骤来保护我的 Google 地图 API 密钥?

    我已为我的域获取了 Google 地图 API 密钥 我获取密钥时提供的示例显示了请求参数中嵌入的密钥 例如 我知道请求中的引荐来源网址字段必须与我的域匹配 使我的密钥在脚本标签等中可见是否安全 或者我还应该采取其他步骤吗 考虑到该密钥必须
  • javascript fizzbuzz switch 语句

    我目前正在参加关于 Javascript 的代码学院课程 并且我被 FizzBu zz 任务困住了 我需要从 1 到 20 数 如果这个数字可以被 3 print fizzbuzz 整除 可以被 5 print buzz 整除 可以被两个
  • Unity 和 ASP.NET WebForms - 没有为此对象定义无参数构造函数

    有谁有关于如何使 Unity 1 2 或 2 0 与 ASP NET WebForms 一起工作的好例子吗 我以为我已经弄清楚了 但显然我错过了一些东西 现在我收到错误 没有为此对象定义无参数构造函数 我记得几年前遇到过这个错误 我只是不记
  • 如何使用openpyxl读取xlsx颜色信息

    我正在使用 openpyxl 读取 Excel 文件 对于我的应用程序 我需要读取 xlsx 文件中单元格的背景颜色 但我找不到如何加载这些颜色信息 我尝试使用 cell style fill color index 但它只返回 FFFFF
  • MVC 2 beta 2 的 MicrosoftMvcJQueryValidation.js 正确版本在哪里?

    MicrosoftMvcJQueryValidation jsASP NET MVC 2 使用它进行客户端验证 该文件存在问题 无法正常工作 想知道是否版本错误 我使用的版本来自 futures 的来源 MicrosoftMvcJQuery
  • “window.open”被 Firefox 阻止

    I use window open并在文档中调用它ready事件 但它被 Firefox 中的弹出窗口阻止程序阻止 然后我将其添加到函数中 并从按钮调用该函数 然后触发按钮单击 但没有成功 function abcd function ab
  • 协调错误:有人遇到过错误消息被截断的问题吗?

    我再次来这里寻求帮助 这次我相信 鉴于我将涉及的问题的特殊性 很少有人会做出回应 我刚开始进入 DataSnap 的世界 但仍然有一些事情我不明白我将如何关联这个错误 我的Delphi是XE 版本1 Update1 我正在使用 Postgr