delphi - 如何将 RecordSet.Find 与 TADOQuery 一起使用?

标签 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 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;

由于 TADOQueryTCustomADODataSet 后代,因此使用与 TADODataSet 相同的 RecordSet 没有问题

关于delphi - 如何将 RecordSet.Find 与 TADOQuery 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075278/

相关文章:

Delphi TWebBrowser 内存泄漏

vba - ADO 记录集未在 VBA 中保持打开状态 - "Operation is not allowed when the object is closed"

sql-server - 有没有办法使用普通 ADO 从 SQL Server 检索 View 定义?

delphi - 在Windows 8和Delphi XE3上使用SQL Server的ADO中,什么会导致“游标操作冲突”错误?

sql - ADODataSet 从连接表中删除

delphi - 将 TDictionary 排序到数组后正确处理它

Delphi 2010 - 属性向导或类似的东西,以避免手动编码 getter/setter

delphi - 如何将字段声明为可为空?

database - 将 Matlab 数组存储在 SQL Server varbinary 字段中

delphi - 构建 HTTP 服务器应用程序