Как читать значения полей потомка TDataSet, не перемещая его курсор

Я вижу, что возможность читать значения записей из потомка TDataSet без необходимости перемещать курсор - большое улучшение для людей, работающих с приложениями баз данных.

Я искал долго и упорно на эту тему, но ближе всего можно найти в XE7 TFDMemTable, где вы можете прочитать значения полей с операторами, как это:

FirstName := fdsPeople.Table.Rows.ItemsI[i].GetValues('FirstName', True);

где

  1. fdsPeople = экземпляр TFDMemTable
  2. я = целое число, относящееся к индексу записи
  3. FirstName является строковой переменной

Есть ли уже способ достичь этого с помощью TDataSet, о котором я не знаю? Если нет, как мы можем запросить эту функцию?

2 ответа

Вы можете клонировать курсор из своего набора данных в другие наборы данных, если ваш потомок набора данных поддерживает эту функцию курса. (AnyDAC - TADMemTable или FireDAC - TFDMemTable, а TClientDataset поддерживают эту функцию).

Это означает, что наборы данных могут обмениваться данными, но у них разные курсоры! (вы можете пройти по одному набору данных, не мешая другим наборам данных)

пример:

procedure MyCloneCursor(ASourceDS, ADestDS: TFDMemTable)
begin
 ADestDS.FieldDefs.Assign(ASourceDS.FieldDefs);
 ADestDS.CreateDataset;

 ADestDS.CloneCursor(ASourceDS, false {Reset}, false {KeepSettings});
end;

Имейте в виду, что KeepSettings относится к наборам данных, клонированным курсором. KeepSettings, если true, указывает, что набор данных, клонированный курсор, сохранит свои настройки, а если он равен false, примет настройки из набора данных, из которого был клонирован курсор.

Если вы хотите клонировать фильтр, индексы, главный источник, основные поля, статус "только для чтения" исходного набора данных... затем вызовите CloneCursor следующим образом

CloneCursor(SourceDataset, False, False);

Для обширной документации по этому вопросу, читайте курсоры Cary Jensen's Cloning ClientDataSet

Предполагая, что вы хотите сказать, что не хотите, чтобы пользователь видел, что вы на самом деле перемещаете курсор, вы можете сделать что-то вроде этого:

var
  BM: TBookmark;
begin
  BM := Dataset.GetBookmark;
  Dataset.DisableControls;
  try
    // Simulate moving the cursor around, reading data etc.
    Dataset.Last;
    Dataset.First;
    Dataset.GotoBookmark(BM)
  finally
    Dataset.EnableControls;
  end;
end;

Это предполагает, что у вас, конечно, есть двунаправленный набор данных.

Другие вопросы по тегам