如何在TADOQuery中使用RecordSet.Find?

时间:2015-06-26 14:04:17

标签: delphi ado tadodataset

在这个问题中:

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的样本调用吗?我无法弄清楚这些论点。

1 个答案:

答案 0 :(得分:2)

您最好的选择是查看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;

由于TADOQueryTCustomADODataSet后代,使用与RecordSet

相同的TADODataSet是没有问题的