gpt4 book ai didi

德尔福ADO : Locate with dataset filter on bug

转载 作者:行者123 更新时间:2023-12-03 15:47:58 26 4
gpt4 key购买 nike

我有一个简单的查询,它返回以下行:

Name  Value
Peter 1
Peter 2
Peter 3
John 1
John 2

应用过滤器:

 ADO.Filter := 'Name="John"';
ADO.Filtered := True; // Now, its only 2 rows in dataset
ADO.Locate('Value', 2);

光标应该指向“John 2”,但它指向“Peter 2”(已被过滤器过滤掉)。并且locate返回True。

在 Delphi 7、Rad studio XE 6 上尝试过。看来这个错误在过去 15 年里一直存在有什么解决办法吗?

最佳答案

TCustomADODataSet.Locate 的问题是它内部使用 Recordset.Clone并尝试在克隆记录集中查找记录,而不将过滤器设置为克隆记录集(请参阅 ADODB TCustomADODataSet.LocateRecord)。

摘自文档中的备注:

The Filter property of the original Recordset, if any, will not be applied to the clone. Set the Filter property of the new Recordset to filter the results. The simplest way to copy any existing Filter value is to assign it directly, as follows. rsNew.Filter = rsOriginal.Filter The current record of a newly created clone is set to the first record.

我一直在使用自己的简单Locate函数来过滤ADO数据集:基本上,存储当前书签,移动到第一条记录并迭代数据集直到找到匹配项。如果未找到匹配项,则恢复之前的书签。
波纹管是一个对我有用的非常有限的实现(为了完美的解决方案还有很多待办事项):

class function TData.Locate(DataSet: TDataSet; const KeyFields: string;
const KeyValues: Variant; Options: TLocateOptions): Boolean;
{ a very simple Locate function - todo: TLocateOptions & multiple KeyFields/KeyValues }
var
BM: TBookmarkStr;
begin
Result := False;
if DataSet.IsEmpty then Exit;
BM := DataSet.Bookmark;
DataSet.DisableControls;
try
DataSet.First;
while not DataSet.Eof do
begin
if DataSet.FieldByName(KeyFields).Value = KeyValues then
begin
Result := True;
Break;
end;
DataSet.Next;
end;
if not Result then DataSet.Bookmark := BM;
finally
DataSet.EnableControls;
end;
end;

另一个选项是修补 ADODB.pas TCustomADODataSet.LocateRecord 并设置 FLookupCursor.Filter 以匹配当前数据集过滤器。只要您将 ADODB.pas 修补为放置在项目文件夹中的新副本,此选项就可以接受。

另一种选择是使用 TCustomADODataSet.Recordset.Find方法(另请参阅:How to use a RecordSet.Find with TADOQuery?)。

关于德尔福ADO : Locate with dataset filter on bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28231727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com