应该是Ado的bug了。
设为fgPredicate时的确出错,其他值正常。
我试着直接加入
if (DataModule2.AdoQuery1.LockType = ltBatchOptimistic) then
begin
DataModule2.AdoQuery1.Filtered := True;
// DataModule2.AdoQuery1.FilterGroup := fgPredicate;
DataModule2.ADOQuery1.Recordset.Filter := 4;
DataModule2.ADOQuery1.First;
end;
出错相同。进AdoDB单元查看
追踪到TCustomADODataSet.SetFilterGroup
procedure TCustomADODataSet.SetFilterGroup(const Value: TFilterGroup);
begin
CheckBrowseMode;
inherited SetFilterText('');
FFilterGroup := Value;
if (FFilterGroup <> fgUnassigned) and Filtered then
begin
Recordset.Filter := Integer(FilterGroupValues[FFilterGroup]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
First;
end;
end;
而FilterGroupValues[fgPredicate]的值正是4。
FilterGroupValues: array[TFilterGroup] of TOleEnum = ($FFFFFFFF {Unassigned},
adFilterNone, adFilterPendingRecords, adFilterAffectedRecords,
adFilterFetchedRecords, adFilterPredicate, adFilterConflictingRecords);
const
adFilterNone = $00000000;
{$EXTERNALSYM adFilterNone}
adFilterPendingRecords = $00000001;
{$EXTERNALSYM adFilterPendingRecords}
adFilterAffectedRecords = $00000002;
{$EXTERNALSYM adFilterAffectedRecords}
adFilterFetchedRecords = $00000003;
{$EXTERNALSYM adFilterFetchedRecords}
adFilterPredicate = $00000004;
{$EXTERNALSYM adFilterPredicate}
adFilterConflictingRecords = $00000005;
{$EXTERNALSYM adFilterConflictingRecords}
其他值均正常。
在追踪RecordSet的Filter属性
Recordset15 = interface(_ADO)
['{0000050E-0000-0010-8000-00AA006D2EA4}']
。。。。。。。。。。。。
property Filter: OleVariant read Get_Filter write Set_Filter;
。。。。。。。。。。
function Get_Filter: OleVariant; safecall;
procedure Set_Filter(Criteria: OleVariant); safecall;
。。。。。。。。。。。。。
到Set_Filter就看不到代码了。
// ********************************************************************* //
// Type Lib: C:/PROGRAM FILES/COMMON FILES/SYSTEM/ADO/MSADO15.DLL //
// IID/LCID: {00000200-0000-0010-8000-00AA006D2EA4}/0 //
// PASTLWTR : $Revision: 1.6 $ //
// HelpString: Microsoft ActiveX Data Objects 2.1 Library //
// Version: 2.1 //
// ********************************************************************* //
所以我想是Ado的问题了,可惜不知道在Set_Filter里它是怎么处理Filter=4的。
既是Ado的问题,那我想使用原生Ado对象也应该出相同错误。(just guess,no action)
只是不知道Broland的测试员怎么没发现?!!
也许升级Ado可以解决!
(个人意见,仅供参考)