У меня есть отключенный набор записей, который получает данные с диска, на который я ранее их сохранил с помощью 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;