Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 28 мар 2024, 10:17

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: TMemTableEh: Check access to nil value
СообщениеДобавлено: 15 ноя 2019, 08:24 
Не в сети

Зарегистрирован: 23 мар 2017, 13:41
Сообщений: 70
В файле MemTableDataEh.pas есть место, где происходит ошибка, если добавить новую запись, потом удалить ее и вызвать TMemTableEh.ApplyUpdates.

В методе TRecordsListEh.MergeChangeLog, есть проверка TMemoryRecordEh(DeltaList[i]), но аналогичной проверки при доступе к DeltaList[0] при DeltaList.Count = 1 нет.

Вполне возможно, что ошибка кроется глубже, так как мы имеет запись в DeltaList со значением nil, что само по себе несет потенциальную ошибку в разных местах.

Код:
procedure TRecordsListEh.MergeChangeLog;
var
  i: Integer;
  ViaUpdate: Boolean;
begin
  if DeltaList.Count = 0 then Exit;

  if DeltaList.Count > 1 then
  begin
    BeginUpdate;
    ViaUpdate := True;
  end else
    ViaUpdate := False;

  try
    if DeltaList.Count = 1 then
      // отсутствует проверка на nil
      TMemoryRecordEh(DeltaList[0]).MergeChanges
    else
    begin
      for i := 0 to DeltaList.Count-1 do
      begin
        if (TMemoryRecordEh(DeltaList[i]) <> nil) then
          TMemoryRecordEh(DeltaList[i]).InernalMergeChanges(False);
      end;
    end;
    FreeDeletedRecords;
    PackRecList;
    DeltaList.Clear;
  finally
    if ViaUpdate then
      EndUpdate;
  end;
end;


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TMemTableEh: Check access to nil value
СообщениеДобавлено: 27 ноя 2019, 13:50 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

На тестовом проекте ошибка не воспроизводиться.
Вы можете изменить проект так, чтобы ошибка стала воспроизводиться?


Вложения:
2019-11-27-TMemTableEh Check access to nil value.zip [2.42 KiB]
Скачиваний: 59
sshot-61.png
sshot-61.png [ 31.79 KiB | Просмотров: 772 ]

_________________
Best regards
EhLib support Team
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TMemTableEh: Check access to nil value
СообщениеДобавлено: 27 ноя 2019, 15:24 
Не в сети

Зарегистрирован: 23 мар 2017, 13:41
Сообщений: 70
Прошу прощения, что заранее не уточнил детали, чтобы получть ошибку, достаточно выполнить такой код:
Код:
  with TMemTableEh.Create(nil) do begin
    CachedUpdates := true;
    FieldDefs.Add('Name', ftString, 10, false);
    CreateDataSet();
    AppendRecord(['123']);
    Delete();
    ApplyUpdates(-1);
    Free();
  end;


Либо же если брать ваш пример, то нужно просто удалить ссылку на драйвер у мемтейбла, потому что при его наличии мы не попадаем в процедуру MergeChangeLog.
Код:
function TCustomMemTableEh.InternalApplyUpdates(AMemTableData: TMemTableDataEh; MaxErrors: Integer): Integer;
begin
  Result := 0;
  if DataDriver <> nil then
  begin
    Result := DataDriver.ApplyUpdates(AMemTableData);
  end else
    FRecordsView.MergeChangeLog;
end;


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TMemTableEh: Check access to nil value
СообщениеДобавлено: 27 ноя 2019, 17:23 
Не в сети

Зарегистрирован: 23 мар 2017, 13:41
Сообщений: 70
Мне кажется, что ошибка кроется в процедуре
Код:
procedure TRecordsListEh.DeleteRecord(Index: Integer);
...
    if ARec.FUpdateStatus = usInserted then
    begin
      if ARec.FUpdateIndex >= 0 then
        // тут мы убиваем ссылку на объект, но не убираем с коллекции
        FDeltaList.Items[Rec[Index].FUpdateIndex] := nil;
      Rec[Index].FUpdateIndex := -1;
      PersistDeleteRecord(Index);
    end else
...
end;


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TMemTableEh: Check access to nil value
СообщениеДобавлено: 28 ноя 2019, 10:00 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

Ошибку исправим в следующей сборке.
Спасибо за информацию.

А можете написать, как вы используете режим CachedUpdates = true без DataDriver в реальных задачах?

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TMemTableEh: Check access to nil value
СообщениеДобавлено: 28 ноя 2019, 12:42 
Не в сети

Зарегистрирован: 23 мар 2017, 13:41
Сообщений: 70
Мы это используем для того чтобы отправить скопом измененные строки,
либо через формат XML, либо массив объектов скормить через SOAP.

В основном это их-за того, что АдоДрайвер обрабатывает изменения по одной строке.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB