Reputation: 135
I am trying to verify if [specific] data exists in my table using TClientDataSet. I
Is there a way that I can do this in TClientDataSet?
I am avoiding to use query for some reason here.
Upvotes: 0
Views: 2344
Reputation: 36
You can also use FindKey, which is faster than Locate. You must have an index active for the column you want to verify. For example:
CDS1.IndexFieldNames := 'Name;ID';
if CDS1.FindKey(['one',1]) then DoSomething;
Locate does not require an index, but for FindKey index is necessary and it takes time to create it. Therefore, sometimes the profit at the time of execution of FindKey is lost due to the time the index was created.
Upvotes: 1
Reputation: 30715
The following shows how to check whether a TClientDataSet contains any data and how to find whether it contains a record with a field having a specific value (or a record containg a combination of values in multiple fields)
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;
Note that setting the IndexFieldNames to 'Name;ID' is to speed up the Locate operation if there are a lot of records.
Upvotes: 2