Как скопировать запись из одного запроса в отключенный набор записей с неизменными основными значениями? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть отключенный набор записей, который получает данные с диска, на который я ранее их сохранил с помощью AdoQuery.SaveToFile. После вызова AdoQuery.LoadFromFile я пытаюсь синхронизировать c текущие данные базы данных с кэшированной версией имеющихся у меня данных. база данных, которой нет в моей кэшированной версии. Затем я пытаюсь добавить эти записи из базы данных в свой отключенный набор записей. Я копирую значение каждого поля из фактических данных в свою постоянную версию, но проблема возникает в основном поле. Это не позволяет мне присвоить значение полю только для чтения, и даже если я удалю флаг только для чтения, значение не будет успешно сохранено, когда я его отправлю. Если я это сделаю, оно окажется равным нулю вместо фактического значения для основного поля. * Вот пример, над которым я работаю, который локально удаляет записи, которых нет в базе данных, а затем пытается скопировать новые записи.

procedure TForm1.ResyncDataset;
var
 loSourceList,loLocalCache:TADOQUery;
 i:Integer;
 loToInsert:TStringList;
 lsSQL:String;
begin

  loLocalCache := TADOQuery.Create(nil);
  loLocalCache.Connection := ADOConnection1;
  loLocalCache.CursorLocation := clUseClient;
  loLocalCache.LockType := ltBatchOptimistic;
  loLocalCache.LoadFromFile('testcache');

  loSourceList := TADOQuery.Create(nil);
  loSourceList.Connection := ADOConnection1;
  loSourceList.SQL.Text := 'Select ReportID from Reports';
  loSourceList.Open;

  //delete what should not be in our local cache
  loLocalCache.First;
  While not loLocalCache.Eof do
  begin
    if not loSourceList.Locate('ReportID',loLocalCache.FieldByName('ReportID').AsString,[]) then
    begin
      loLocalCache.Delete;
    end else
    loLocalCache.Next;
  end;
  
  //get what should be inserted in our local cache
  loSourceList.First;
  While not loSourceList.Eof do
  begin
    if not loLocalCache.Locate('ReportID',loSourceList.Fields[0].AsString,[]) then
    begin
      if not assigned(loToInsert) then
        loToInsert := TStringList.Create;
      loToInsert.Add(loSourceList.Fields[0].AsString);
    end;
    loSourceList.Next;
  end;

  //Get the full records from the IDs above
  if assigned(loToInsert) Then
  begin
    lsSQL := 'Select * from Reports WHERE ReportID in (';
    for i := 0 to loToInsert.Count-1 do
      lsSQL := lsSQL + loToInsert[i] + ',';
    lsSQL := Copy(lsSQL,0,Length(lsSQL)-1);
    lsSQL := lsSQL + ')';

    loSourceList.SQL.Text := lsSQL;
    loSourceList.open;

    while not loSourceList.Eof do
    begin
      loLocalCache.Append;
      for i := 0 to loSourceList.FieldCount-1 do
      begin
        //this causes zeros
        if loLocalCache.Fields[i].ReadOnly then
          loLocalCache.Fields[i].ReadOnly := False;
        loLocalCache.Fields[i].Value := loSourceList.Fields[i].Value;
      end;

      //loLocalCache.UpdateBatch;
      loLocalCache.Post;
//      loLocalCache.Recordset.Resync(adAffectCurrent, adResyncAllValues);
      loSourceList.Next;

    end;
  end;

  loLocalCache.SaveToFile('testcache');

  loSourceList.Free;
  loLocalCache.Free;
  loToInsert.Free;  
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...