ADO, Адонис, Критерии обновления - PullRequest
1 голос
/ 21 января 2009

На форме у меня есть Quantum Grid и некоторые редактирующие компоненты с поддержкой db. При добавлении новой записи в сетку, вводе некоторых значений редактирования как в сетке, так и в отдельных редактируемых компонентах, я получаю сообщение об ошибке:

EOleException: строка не может быть расположена для обновления. Некоторые значения могли быть изменены с момента последнего чтения

После некоторого поиска в Google я думаю, что изменение свойства «Обновить критерии» с adCriteriaAllCols на adCriteriaKey может быть правильным решением. Но как и когда я делаю это по запросу Adonis?

Ответы [ 6 ]

1 голос
/ 02 августа 2009

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

0 голосов
/ 12 апреля 2016

Это старый. но моя ситуация может случиться для кого-то еще. поэтому я отправляю этот ответ.

Эта ошибка произошла и для меня. Я использовал базу данных Access и использовал TADOTable в форме. связь была мастер-деталью, и я соединил все таблицы с IDE Designer вместе. мои таблицы были tbl_Floor, tbl_FloorParts, tbl_Seat, tbl_Floor которых был мастером tbl_FloorParts, а tbl_FloorParts был мастером tbl_Seat. Так что для решения этой ошибки я сделал этот трюк.

procedure Tfrm_Main.UpdateTblFloor(...);
var
  FID:Integer;
  q:TADOQuery
begin
  FID:=tbl_Floor.FieldByName('FID').AsInteger;
  tbl_Floor.Close;
  q:=TADOQuery.Create(nil);
  try
    q.Connection:=tbl_Floor.Connection;
    q.SQL.Add('Update [Floor]');
    q.SQL.Add(...);//Set Fields that needed to be updated
    q.SQL.Add('where [FID]='+IntToStr(FID));
    q.ExecSQL;  
  finally
    q.free;
  end;
  tbl_Floor.Open;
  tbl_Floor.Locate('FID',FId,[loPartialKey]);
end;

и я добавил эти события для tbl_Floor, tbl_FloorParts

procedure Tfrm_Main.tbl_FloorAfterOpen(DataSet: TDataSet);
begin
  tbl_FloorParts.Open;
end;

procedure Tfrm_Main.tbl_FloorBeforeClose(DataSet: TDataSet);
begin
  tbl_FloorParts.Close;
end;

procedure Tfrm_Main.tbl_FloorPartsAfterOpen(DataSet: TDataSet);
begin
  tbl_Seat.Open;
end;

procedure Tfrm_Main.tbl_FloorPartsBeforeClose(DataSet: TDataSet);
begin
  tbl_Seat.Close;
end;
0 голосов
/ 16 марта 2015

У меня была похожая проблема - обновление строки, в которой все значения были одинаковыми, привело бы к получаемой вами ошибке. Я добавил флаг «Option = 2» в конец моего соединения ado, и это решило проблему.

0 голосов
/ 25 сентября 2014

, если в вашем запросе есть таблица соединений:

TADOQuery нельзя редактировать и публиковать данные в базе данных sql.

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

0 голосов
/ 04 февраля 2012

На самом деле ADO предоставляет динамическое свойство для управления поведением на основе запросов (QBU). Большая часть кода описана в файле ADOInt.pas, соответствующее событие OnAfterOpen для свойств набора записей (любой TADODataSet) и OnCreate для свойств подключения (TADOConnection). Я полагаю, что «Критерии обновления» не являются решением в этом случае, так как они имеют дело с предложением WHERE для указания полей, которые будут использоваться для обновлений. Вы можете изменить «Обновить синхронизацию» следующим образом:

//After open a TCustomADODataSet
  TCustomADODataSet(DataSet).Properties['Update Resync'].Value :=
    adResyncAutoIncrement + adResyncUpdates + adResyncInserts;
0 голосов
/ 29 января 2009

Хотя я не использую Adonis, я полагаю, что есть возможность использовать тот же механизм, который TClientDataset (CDS) использует для идентификации полей, составляющих первичный ключ: свойство TField.ProviderFlags .

Я считаю, что это может быть хорошим местом, чтобы начать искать.

...