Копирование записей набора данных клиента в таблицу базы данных

Чего я пытаюсь добиться, чтобы вставить / скопировать записи из tClientDataSet в таблицу базы данных (база данных - Sybase ASA).

У меня также есть форма с сеткой cxgrid, в которой я могу видеть записи с компакт-дисков, поэтому я знаю, что в ней есть записи.

По нажатию кнопки я делаю следующее:

with dmData.cds do
  begin
    Close;
    Open;
    First;
    while not (EOF) do
    begin
      dmData.qry1.Open;
      dmData.qry1.Insert;
      dmData.qry1.FieldByName('field1').AsString := dmData.cds.FieldByName('field1').AsString;
      dmData.qry1.FieldByName('field2').AsString := dmData.cds.FieldByName('field2').AsString;
      dmData.qry1.FieldByName('field3').AsString := dmData.cds.FieldByName('field3').AsString;
      dmData.qry1.Post;
      Next;
    end;
  end;

Я не получаю никаких ошибок после того, как это сделано, но при просмотре таблицы базы данных не вставляются записи.

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

1 ответ

Решение

Кажется, вы пытаетесь сделать работу, которая TClientDataSet делает для вас. Чтобы все это работало, вам нужны три компонента:

  1. Экземпляр набора данных, способный общаться с вашим сервером данных, уже настроенный для этого
  2. Экземпляр TDatasetProvider ссылаясь на предыдущий набор данных, используя Dataset имущество
  3. Экземпляр TClientDataSet ссылаясь на предыдущего провайдера, используя ProviderName имущество

После всех записей в TClientDataset (CDS) были обновлены, вы звоните ApplyUpdates(0) отправить их провайдеру. Когда вы вызываете этот метод, CDS создает пакет данных с именем Delta с записями, которые необходимо сохранить, и отправляет его поставщику.

Поставщик не знает, как сохранить записи, существующие в Delta, поэтому он работает с набором данных, который вы ему присвоили. Для каждой записи в дельте соответствующая операция выполняется над набором данных, поэтому сервер данных начнет получать команды.

В конце провайдер уведомляет CDS, что все в порядке (это называется согласованием), в конечном итоге возвращая ключи, сгенерированные во время операций вставки. Эти ключи появятся в CDS.

После этого состояние измененных записей будет очищено, чтобы не сообщать об ожидающих изменениях (что-то, чего не делал ваш код).

Я рекомендую вам прочитать больше о DataSnap, чтобы действительно освоить его. Помощь Delphi имеет достаточно информации об этом.

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