在这个问题中:
Delphi ADO : Locate with dataset filter on bug
描述了 ADO 错误,其中过滤器字符串在 .Locates 期间被忽略。
这给我们从 BDE 迁移带来了问题,因为我们有很多代码根据用户输入更改过滤器。
我们原本期望 TADOQuery 能够提供有效的迁移路径。我们错了。
我们当然可以将当前的过滤器更改为 WHERE 语句,但这需要大量工作,并且存在将过滤器字符串连接到无过滤器的 WHERE 语句等的风险。
对上述问题的接受答案表明可以使用 TCustomADODataSet.Recordset.Find
我们可以在 TADOQuery 中安全地使用 RecordSet.Find 来实现 .Locates 吗?即 RecordSet.Find 是否更新 TADOQuery 围绕 TADOQuery 放置的任何包装器?
如果是这样,有人可以展示从 Delphi XE5 到 RecordSet find 的示例调用吗?我无法弄清楚这些论点。
最佳答案
最好的选择是查看 ADODB.pas TCustomADODataSet.LocateRecord
的源代码。您将看到Locate
是如何实现的。
对于单个条件,它使用 RecordSet Find
方法。对于多种条件,它使用 Filter
属性。
使用Find
相当简单:
uses ..., ADODB, ADOInt;
procedure TForm1.Button1Click(Sender: TObject);
var
bm: TBookmarkStr;
begin
bm := ADODataSet1.Bookmark;
// for partial condition use e.g. ItemName LIKE 'He*'
ADODataSet1.Recordset.Find('ItemName = ''Hello''', 0, adSearchForward, adBookmarkFirst);
if ADODataSet1.Recordset.EOF then // not found
ADODataSet1.Bookmark := bm // restore bookmark
else
ADODataSet1.Resync([rmExact, rmCenter]); // set active record and trigger dataset change event
end;
由于 TADOQuery
是 TCustomADODataSet
后代,因此使用与 TADODataSet
相同的 RecordSet
没有问题
关于delphi - 如何将 RecordSet.Find 与 TADOQuery 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075278/