2

在这个问题中:

Delphi ADO:在错误上使用数据集过滤器定位

描述了一个 ADO 错误,其中过滤器字符串在 .Locates 期间被忽略。

这给我们从 BDE 迁移带来了问题,因为我们有很多代码会根据用户输入更改过滤器。

我们曾期望 TADOQuery 提供有效的迁移路径。我们错了。

我们当然可以将我们当前的过滤器更改为 WHERE 语句,但这是大量的工作,并且有将过滤器字符串连接到无过滤器的 WHERE 语句等的风险。

上面链接的问题的公认答案表明使用TCustomADODataSet.Recordset.Find的可能性

我们可以安全地在 TADOQuery 中使用 RecordSet.Find 来实现 .Locates 吗?即RecordSet.Find 是否更新TADOQuery 放置在TADOQuery 周围的任何包装器?

如果是这样,有人可以显示从 Delphi XE5 到 RecordSet 的示例调用吗?我很难弄清楚这些论点。

4

1 回答 1

2

您最好的选择是查看 ADODB.pas 的源代码TCustomADODataSet.LocateRecord。您将看到如何Locate实施。

对于单个条件,它使用 RecordSetFind方法。对于多个条件,它使用该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的没有问题RecordSetTADODataSet

于 2015-06-29T10:02:34.050 回答