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.
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.