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.