powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Firedac master-detail ошибка сохранения blob
6 сообщений из 6, страница 1 из 1
Firedac master-detail ошибка сохранения blob
    #39705755
jeykey84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Постараюсь описать проблему.
Используется среда разработки Embarcadero® Delphi 10.1 Berlin Version 24.0.25048.9432
БД: Oracle 10.2
На сервере приложений при помощи FireDac (FDQuery) используется связка Master-detail (FDQuery1 -> DataSource -> FDQuery2)
На клиент все это дело передается через один TDataSetProvider.
На клиенте разворачивается соответственно в ClientDataSet1 (master) и ClientDataSet2 (detail)
В detail редактируется Blob поле, после чего у master вызыватся метод ApplyUpdate.
Вот тут и начинается проблема.
Если детейл редактируется у первой записи мастера, то изменения успешно сохраняются в БД,
если же перейти, например, на третью запись мастера и у нее отредактировать детейл, то Blob поле в БД становится пустым.
Докопался до такого кода в юните FireDAC.Comp.DataSet
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TFDDataSet.PSUpdateRecord(AUpdateKind: TUpdateKind; ADelta: TDataSet): Boolean;
  ...
begin
  ...
    case AUpdateKind of
    ukModify:
      if LocateRecord then begin
        Edit;
        CopyRecordBase(ADelta, True);
        Post;
        Result := True;
    end;
  ...  
end;


При успешном редактиовании Blob поля у первой записи мастера условие LocateRecord = True
Но если редактировать детейл например у третьей записи мастера условие LocateRecord = False и код уходит в юнит Datasnap.Provider
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TSQLResolver.GenUpdateSQL(Tree: TUpdateTree; SQL: TStrings;
  Params: TParams; Alias: string);
  ...  
  SQL.Add(string.Format(' %s%s%s%1:s = EMPTY_BLOB(),', [PSQLInfo(Tree.Data).QuotedTableDot,          { Do not localize }
	 PSQLInfo(Tree.Data).QuoteChar, Field.Origin]));  
  ...
end;


Вот тут Blob и зануляется.
Сам метод LocateRecord уходит в юнит FireDAC.DatS в метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function TFDDatSRow.CompareData(AColumn: Integer; ABuff1: Pointer;
begin
  ...
  dtBCD,
  dtFmtBCD:
    begin
      Result := BcdCompare(PBcd(ABuff1)^, PBcd(ABuff2)^); 
      if Result > 0 then
        Result := 1
      else if Result < 0 then
        Result := -1
      else
      begin
        E := GetBCDDiff(ABuff1, ABuff2);
        if E > 0.0000000000001 then
          Result := 1
        else if E < -0.0000000000001 then
          Result := -1
        else
          Result := 0;
      end;
    end;
  ...
end;


Очевидно, что при успешном редактировании PBcd(ABuff1)^ и PBcd(ABuff2)^ равны, а при неуспешном - различны.
Дальше я уже не знаю, что и делать)
Я вот что думаю, может у FDQuery есть какая-то волшебная галоча, которая исправляет эту проблему?
Сам я ее к сожалению не нашел(
PS: Причем на Firebird такой проблемы нет.
...
Рейтинг: 0 / 0
Firedac master-detail ошибка сохранения blob
    #39705813
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще дать простой тестовый пример.
Можно попробовать установить FormatOptions.DataSnapCompatibility в True.
...
Рейтинг: 0 / 0
Firedac master-detail ошибка сохранения blob
    #39705821
jeykey84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievПроще дать простой тестовый пример.
Можно попробовать установить FormatOptions.DataSnapCompatibility в True.

Установил, не изменилось.
Простой тестовый пример прикладываю.
Таблички в БД создал для примера:
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE Z_MASTER (
  MASTER_ID NUMBER(10, 0),
  NAME      VARCHAR2(255 CHAR),
  CONSTRAINT PK_Z_MASTER_MASTER_ID PRIMARY KEY (MASTER_ID)
)


Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE Z_DETAIL (
  DETAIL_ID NUMBER(10, 0),
  MASTER_ID NUMBER(10, 0),
  BLOB_DATA BLOB,
  NAME      VARCHAR2(255 CHAR),
  CONSTRAINT PK_Z_DETAIL_DETAIL_ID PRIMARY KEY (DETAIL_ID)
)


Спасибо)
...
Рейтинг: 0 / 0
Firedac master-detail ошибка сохранения blob
    #39706387
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это баг в FireDAC. Патч присоединил.
...
Рейтинг: 0 / 0
Firedac master-detail ошибка сохранения blob
    #39706954
jeykey84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,
спасибо, все работает.
...
Рейтинг: 0 / 0
Firedac master-detail ошибка сохранения blob
    #39706967
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЭто баг в FireDAC. Патч присоединил.Просто любопытно, этот патч пойдет в основную ветку?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Firedac master-detail ошибка сохранения blob
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]