delphi - ADO 与 Firedac 报价标志在 .Locate

标签 delphi ado firedac

我们正在将近 200 万行代码从 BDE 迁移到 Delphi XE5(即将成为 DX)中的 SQL Server。

我们遇到了一个大问题。

我们一直在使用 ADO,但刚刚被 Microsoft 未能实现 .Locate 所困扰,该字符串同时包含单引号和井号。示例:

TADOQuery1.Locate('FieldName', '2x4'' 10#', []) 

失败:

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Microsoft 的 ADO 文档指出这将失败。我们可以在 ADODB.pas 中看到它发生。对于简单的一个变量定位和包含多个变量的定位。

我们无法选择使用 WHERE 字符串在标准查询中执行这些定位,因为它们处于紧密循环中。

问题:FireDAC 有这个问题吗?有人可以帮我们一个忙并实际尝试上述操作吗?在 FireDac 中查找?

从 ADO 迁移到 Firedac 时我们可能会遇到哪些令人不快的“意外”?

谢谢。

最佳答案

我在 XE8 中创建了一个简约的 FireDAC 应用程序,其中包含 TFDConnectionTFDQueryTFDGUIxWaitCursor,以及 TFDquery > 连接到 TDataSourceTDBGridTDBNavigator。我将 TFDConnection 连接到 MS SqlServer 2014 数据库,并编辑数据行以包含您的测试值

2x4' 10#

在 VARCHAR(80) 列中。

当我调用 .Locate 时,调用 .First,然后调用 FDQuery.Locate 成功找到了该行> 仅在包含测试值的列上并且当它是两字段调用的一部分时。

所以,至少值得你自己测试一下。您提到上周在类似的 Locate 查询中您有 XE8。

至于其他令人不愉快的意外,我暂时想不出什么。我所能记得的就是,当我们在 2002 年左右放弃 BDE,通过 OLEDB 驱动程序 + Ado 转而使用 Sql Server 2000 时,摆脱了 BDE 真是一种幸运的解脱。我很高兴我们选择了我们所做的排序规则,Latin1_General_CI_AI,其中 CI = 不区分大小写,AI = 不区分重音。

我对 FireDAC 的主要保留意见是,虽然它似乎比 TAdoxxx 等“本地”对象更好地处理这些事情,但它似乎与它们相距甚远,我怀疑您可能很难让官方完成任何事情万一你确实被它的一些问题绊倒了。当然,它现在掌握在 EMBA 手中,这可能会说明从他们那里榨取错误修复(特别是因为他们现在似乎将错误修复更新限制在更新订阅上),尽管作者似乎确实非常积极地支持它上线。

顺便说一句,我不确定您的“微软失败”基于什么观察。我测试了 AdoQuery.Locate 并修改了 ADODB.Pas 的 GetFilterExpr 我在对您的其他问题的回答中发布了它,它工作正常,所以也许您基于它别的东西。

出于兴趣,我决定看看 ADOInt.Pas Recordset 对象是否可用于执行与 Locate 类似的操作,并且它可以而且工作得很好与您的搜索值 2x4' 10# 以及我使用的其他测试模式:

procedure TForm1.TestRecordSetFind;
var
  Expr : String;
begin
  Expr := 'applicant = ' + QuotedStr(edLocate.Text);
  if cbMultiField.Checked then begin
    Expr := '(' + Expr + ') and (country = ''EP'')';
  end;
  Memo1.Lines.Add(Expr);
  AdoQuery1.RecordSet.Find(Expr, 0, adSearchForward, adBookmarkFirst);
  AdoQuery1.Resync([]);
end;

当然,这样做有几个明显的限制,即 RecordSet.Find 是一个过程而不是返回 bool 值的函数,而且它不区分大小写(尽管无论是那是因为我的服务器排序规则是,我不知道)。

关于delphi - ADO 与 Firedac 报价标志在 .Locate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829912/

相关文章:

delphi - 断开连接后恢复处于 dsInsert 状态的 TADOQuery

sql - Delphi ADOQuery 在另一个 ADOQuery 插入后没有拾取记录

sqlite - 执行包含 BLOB 数据的数组 DML 命令是否可能且有意义?

mysql - Firemonkey 移动应用程序和远程 MySQL

sql-server - 更新后检索列的值?

delphi - 隐藏无参数创建并重新引入?

delphi - case语句中未初始化的变量

azure - 自托管集成运行时的水平/垂直扩展

delphi - 提示指令的语法规范

delphi - 检测图片中的多个形状并计算中间位置