使用 Delphi 中的 TClientDataSet 验证我的 Table 中是否存在数据
Verifying if data exists in my Table using TClientDataSet in Delphi
我正在尝试使用 TClientDataSet 验证 [特定] 数据是否存在于我的 table 中。我
我可以在 TClientDataSet 中执行此操作吗?
出于某种原因,我在这里避免使用查询。
下面显示了如何检查 TClientDataSet 是否包含任何数据以及如何查找它是否包含具有特定值的字段的记录(或包含多个字段中的值组合的记录)
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
Field : TField;
S : String;
begin
// Create 2 fields in the CDS
Field := TIntegerField.Create(Self);
Field.FieldName := 'ID';
Field.FieldKind := fkData;
Field.DataSet := CDS1;
Field := TStringField.Create(Self);
Field.FieldName := 'Name';
Field.Size := 40;
Field.FieldKind := fkData;
Field.DataSet := CDS1;
// Next, set up the CDS; it will be empty initially
CDS1.CreateDataSet;
if CDS1.IsEmpty then
ShowMessage('Is empty - no data')
else
ShowMessage('Something went wrong');
CDS1.IndexFieldNames := 'Name;ID';
CDS1.InsertRecord([1, 'One']);
CDS1.InsertRecord([2, 'Two']);
CDS1.InsertRecord([3, 'Three']);
ShowMessage('DataSet now contains ' + IntToStr(CDS1.RecordCount) + ' records');
S := 'Two';
if CDS1.Locate('Name', S, []) then
ShowMessage('Found record with Name = ' + S)
else
ShowMessage('Failed to find record with Name = ' + S);
// Following shows how to use Locate on more than one field
// Note: to use VarArrayOf, you need Variants in your uses list
if CDS1.Locate('ID;Name', VarArrayOf([1, 'one']), [loCaseInsensitive]) then
ShowMessage('Found record by multiple criteria');
end;
请注意,将 IndexFieldNames 设置为 'Name;ID' 是为了加快查找操作的速度,如果有很多记录。
您也可以使用 FindKey,它比 Locate 更快。
您必须为要验证的列激活一个索引。
例如:
CDS1.IndexFieldNames := 'Name;ID';
if CDS1.FindKey(['one',1]) then DoSomething;
Locate 不需要索引,但是对于FindKey 索引是必需的,创建它需要时间。因此,有时FindKey执行时的利润会因为创建索引的时间而丢失。
我正在尝试使用 TClientDataSet 验证 [特定] 数据是否存在于我的 table 中。我
我可以在 TClientDataSet 中执行此操作吗?
出于某种原因,我在这里避免使用查询。
下面显示了如何检查 TClientDataSet 是否包含任何数据以及如何查找它是否包含具有特定值的字段的记录(或包含多个字段中的值组合的记录)
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
Field : TField;
S : String;
begin
// Create 2 fields in the CDS
Field := TIntegerField.Create(Self);
Field.FieldName := 'ID';
Field.FieldKind := fkData;
Field.DataSet := CDS1;
Field := TStringField.Create(Self);
Field.FieldName := 'Name';
Field.Size := 40;
Field.FieldKind := fkData;
Field.DataSet := CDS1;
// Next, set up the CDS; it will be empty initially
CDS1.CreateDataSet;
if CDS1.IsEmpty then
ShowMessage('Is empty - no data')
else
ShowMessage('Something went wrong');
CDS1.IndexFieldNames := 'Name;ID';
CDS1.InsertRecord([1, 'One']);
CDS1.InsertRecord([2, 'Two']);
CDS1.InsertRecord([3, 'Three']);
ShowMessage('DataSet now contains ' + IntToStr(CDS1.RecordCount) + ' records');
S := 'Two';
if CDS1.Locate('Name', S, []) then
ShowMessage('Found record with Name = ' + S)
else
ShowMessage('Failed to find record with Name = ' + S);
// Following shows how to use Locate on more than one field
// Note: to use VarArrayOf, you need Variants in your uses list
if CDS1.Locate('ID;Name', VarArrayOf([1, 'one']), [loCaseInsensitive]) then
ShowMessage('Found record by multiple criteria');
end;
请注意,将 IndexFieldNames 设置为 'Name;ID' 是为了加快查找操作的速度,如果有很多记录。
您也可以使用 FindKey,它比 Locate 更快。 您必须为要验证的列激活一个索引。 例如:
CDS1.IndexFieldNames := 'Name;ID';
if CDS1.FindKey(['one',1]) then DoSomething;
Locate 不需要索引,但是对于FindKey 索引是必需的,创建它需要时间。因此,有时FindKey执行时的利润会因为创建索引的时间而丢失。