【问题标题】:How to use a RecordSet.Find with TADOQuery?如何将 RecordSet.Find 与 TADOQuery 一起使用?
【发布时间】:2015-06-26 14:04:16
【问题描述】:

在这个问题中:

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

【问题讨论】:

  • 我认为您至少迟到了 5 年才能进行此类迁移。为什么选择 ADO? FireDAC 似乎是 Delphi 最受支持的 DB 库(如果在谈到 Emb 时可以说“支持”的话)。

标签: delphi ado tadodataset


【解决方案1】:

您最好的选择是查看 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 的后代,因此RecordSet 与TADODataSet 相同使用没有问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2023-03-13
    • 2014-09-25
    • 2016-01-30
    • 2015-12-13
    • 2020-09-15
    • 2020-06-03
    相关资源
    最近更新 更多