如何使用记录集.使用TADOQuery查找



在这个问题中:

Delphi ADO:使用数据集过滤器查找错误

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

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

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

当然,我们可以将当前的过滤器更改为WHERE语句,但这是一项艰巨的工作,并且有可能将过滤器字符串连接起来以过滤较少的WHERE语句等。

对上述问题的公认答案表明,有可能使用TCustomADODataSet.Recordset.Find

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

如果是这样的话,有人能展示一个从DelphiXE5到RecordSet的调用示例吗?我很难弄清楚这些论点。

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

对于单个条件,它使用RecordSet Find方法。对于多个条件,它使用CCD_ 4属性。

使用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的后代,因此使用与TADODataSet 相同的RecordSet是没有问题的

最新更新