首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TADOQuery中使用RecordSet.Find?

如何在TADOQuery中使用RecordSet.Find?
EN

Stack Overflow用户
提问于 2015-06-26 22:04:17
回答 1查看 3.2K关注 0票数 2

在这个问题中:

Delphi ADO : Locate with dataset filter on bug

描述了在.Locates期间忽略筛选器字符串的ADO。

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

我们曾期望TADOQuery能提供一条可行的迁移路径。我们错了。

当然,我们可以将当前的筛选器更改为WHERE语句,但这需要大量的工作,并且有可能将筛选器字符串连接到没有筛选器的WHERE语句,等等。

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

为了实现.Locates,我们能在TADOQuery中安全地使用RecordSet.Find吗?也就是说,RecordSet.Find会更新TADOQuery在TADOQuery上放置的任何包装器吗?

如果是这样的话,谁可以展示一个从Delphi XE5到RecordSet find的示例调用?我搞不懂这些论点。

EN

回答 1

Stack Overflow用户

发布于 2015-06-29 18:02:34

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

对于单一条件,采用RecordSet - Find方法。对于多个条件,它使用Filter属性。

使用Find相当简单:

代码语言:javascript
复制
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是没有问题的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31075278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档