Delphi 2010 MySQL Update через сбой ClientDataSet

Я использую Delphi 2010 и подключаюсь к базе данных MySQL с помощью dbexpress. Соединение работает на 100%, и я получаю свои данные. Проблема возникает, когда я пытаюсь обновить данные через dbGrid. Я проверяю все записи в таблице и проверяю их. При вызове метода ApplyUpdates я получал "Запись не найдена или изменена другим пользователем".

Меняя updateMode на DataSetProvider на upWhereKeyOnly, я сейчас нахожусь в ситуации, когда я получаю сообщение "Невозможно найти запись, ключ не указан". Я пробовал добавлять

BasysClientDataSet.FieldByName('idPolicy').ProviderFlags := [pfInUpdate, pfInWhere, pfInKey];

это к коду, но я получаю ту же ошибку. Я пытался добавить ProviderFlags в SQLQuery, но у меня нет такого поля "idPolicy"

3 ответа

Попробуйте установить флаг провайдера pfInKey для всех столбцов первичного ключа, как вы это делали, но не в наборе данных клиента, а в наборе исходных данных. Это помогло мне, даже когда я не понимаю, что, черт возьми, поля делают в наборе данных клиента, когда db express игнорирует эти настройки? Я бы сказал, это ошибка.

Попробуйте создать эту процедуру и использовать ее в провайдере BeforeUpdateRecord событие.

procedure SetOriginFlags(Source, Dest: TCustomClientDataSet);
var
  i: Integer;
begin
  for i := 0 to Source.FieldCount - 1 do
  begin
    if Dest.FindField(Source.Fields[i].FieldName) <> nil then
    begin
      Dest.FindField(Source.Fields[i].FieldName).ProviderFlags :=
        Source.Fields[i].ProviderFlags;
      if Dest.FindField(Source.Fields[i].FieldName).ProviderFlags <> [pfHidden] then
        Dest.FindField(Source.Fields[i].FieldName).Origin :=
          Source.Fields[i].FieldName;
    end;
  end;
end;

Попробуйте установить для свойства ResolveToDataSet компонента DataSetProvider значение True.

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