Tom*_*Tom 2 delphi ado firedac
我们正在Delphi XE5(即将成为DX)中将近200万行代码从BDE迁移到SQL Server.
我们遇到了一个大问题.
我们一直在使用ADO,但微软未能在同时具有单引号和井号的字符串上实现.Locate.例:
TADOQuery1.Locate('FieldName', '2x4'' 10#', [])
Run Code Online (Sandbox Code Playgroud)
失败了:
参数类型错误,超出可接受的范围,或彼此冲突.
Microsoft的ADO文档声明这将失败.我们可以在ADODB.pas中看到它发生.对于简单的一个变量定位和定位包含多个变量.
我们没有选择在WHERE字符串的标准查询中进行这些定位,因为它们处于紧密循环中.
问题:FireDAC有这个问题吗?有人可以帮我们一个忙,实际上尝试以上.在FireDac中定位吗?
从ADO迁移到Firedac会遇到什么令人不快的"惊喜"?
谢谢.
我创建在XE8简约FireDAC应用包括TFDConnection,TFDQuery,和TFDGUIxWaitCursor,与TFDquery连接到TDataSource,TDBGrid和TDBNavigator.我连接TFDConnection到MS SqlServer 2014数据库,并编辑了一个数据行以包含您的测试值
2x4' 10#
在VARCHAR(80)列中.
调用.First,然后.Locate将的FDQuery成功所在的行,当我打电话.Locate只包含您的测试值的列,当它是两场调用的一部分.
所以,它至少值得自己测试一下.你Locate上周提到你在类似的查询中有过XE8 .
至于其他不愉快的惊喜,我想不出任何副手.我所能记得的是,当我们在2002年左右通过OLEDB驱动程序+ Ado抛弃Sql Server 2000时,摆脱BDE是一种幸福.我很高兴我们选择了我们所做的校对,Latin1_General_CI_AI,其中CI = Case Insensitive和AI = Accent Insensitive.
我对FireDAC的主要保留意见是,虽然它似乎比TAdoxxx之类的"原生"对象更好地处理这些事情,但它似乎从它们中抽象出来,我怀疑你可能很难在不幸的事情,你做了一些与它有关的问题.当然,它现在在EMBA的手中,可能会说一些关于从中修复bug修复的内容(特别是因为它们现在似乎限制了更新订阅上的bug修复更新),尽管作者似乎非常积极地支持它线上.
顺便说一句,我不确定你的"微软失败"是什么观察.我测试AdoQuery.Locate了对ADODB.Pas的修改' GetFilterExpr我在我的答案中发布了你的其他q并且它工作正常,所以也许你是基于别的东西.
感兴趣的是,我决定看看是否Recordset可以使用ADOInt.Pas 对象来做类似的事情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;
Run Code Online (Sandbox Code Playgroud)
当然,这样做的几个显而易见的局限性是,这RecordSet.Find是一个过程而不是返回布尔值的函数,并且它不区分大小写(尽管这是因为我的服务器排序是,我不知道) .