Проверка наличия данных в моей таблице с помощью TClientDataSet в Delphi - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь проверить, существуют ли [конкретные] данные в моей таблице, используя TClientDataSet. I

Есть ли способ сделать это в TClientDataSet?

Я по какой-то причине избегаю использовать запрос.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Ниже показано, как проверить, содержит ли TClientDataSet какие-либо данные и как найти, содержит ли он запись с полем, имеющим заданное значение c (или запись, содержащую комбинацию значений в нескольких полях)

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» должна ускорить операцию Locate, если записей много.

0 голосов
/ 25 февраля 2020

Вы также можете использовать FindKey, который быстрее, чем Locate. У вас должен быть активный индекс для столбца, который вы хотите проверить. Например:

CDS1.IndexFieldNames := 'Name;ID';
if CDS1.FindKey(['one',1]) then DoSomething;

Locate не требует индекса, но для FindKey индекс необходим, и для его создания требуется время. Поэтому иногда прибыль во время выполнения FindKey теряется из-за времени создания индекса.

...