Juke
Juke

Reputation: 135

Verifying if data exists in my Table using TClientDataSet in Delphi

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

Answers (2)

Jacek Kłodziński
Jacek Kłodziński

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

MartynA
MartynA

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

Related Questions