Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TUniTable странное поведение / 6 сообщений из 6, страница 1 из 1
13.09.2021, 22:14
    #40097381
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
Предыстория такова, что парсится json и на его основе в базу обновляются данные или добавляются.
Код: pascal
1.
2.
3.
4.
  unitable1.Append; // или unitable1.Edit;
  unitable1.FieldValues['Field1'] := 91;
  unitable1.FieldValues['Field2'] := '11000';
  unitable1.Post;


Все прекрасно до тех пор, пока не попадается таблица с автоинкрементным полем.
База - Actian / Pervasive.

Если использовать tUniQuery:
По таблице с автоинкрементным полем прекрасно идут запросы
insert into "aaa"(field1, field2) values(17, '') //такая вещь как ни странно в Pervasive допускается (если конечно номер не занят)
insert into "aaa"(field1, field2) values('text')

Прлучается, что UniTable вызывает какое-то автосозранение.
при вызове пост в любом случае ошибка (и в любом случае сохраняет, и созраняет также - елси не указан автоинткремент, то берет макс+1 или тот что указал).

Куда копать?
Спасибо.
В картинках ошибка идет сюда:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
procedure TDataSet.Post;
begin
  UpdateRecord;
  case State of
    dsEdit, dsInsert:
      begin
        DataEvent(deCheckBrowseMode, 0);
        DoBeforePost;
        CheckOperation(InternalPost, FOnPostError); // <-----
        FreeFieldBuffers;
        SetState(dsBrowse);
        Resync([]);
        DoAfterPost;
      end;
  end;
end;

procedure TDataSet.InternalPost;
begin
  CheckRequiredFields;
end;

procedure TDataSet.CheckRequiredFields;
var
  I: Integer;
begin
  for I := 0 to FFields.Count - 1 do
    with FFields[I] do
      if Required and not ReadOnly and (FieldKind = fkData) and IsNull then
      begin
        FocusControl;
        DatabaseErrorFmt(SFieldRequired, [DisplayName]{, Self}); // k.A. warum Self auskommentiert ist, aber f&#252;r die Fehlersuche w&#228;re es eigentlich besser, wenn es das nicht w&#228;re ... in XE auskommentiert und in 10.4 ganz weg o_O
      end;
end;

...

procedure DatabaseError(const Message: string; Component: TComponent = nil);
begin
  if Assigned(Component) and (Component.Name <> '') then
    raise EDatabaseError.Create(Format('%s: %s', [Component.Name, Message])) else
    raise EDatabaseError.Create(Message);
end;



procedure TDataSet.CheckOperation(Operation: TDataOperation; ErrorEvent: TDataSetErrorEvent);
var
  Done: Boolean;
  Action: TDataAction;
begin
  Done := False;
  repeat
    try
      UpdateCursorPos;
      Operation; // <------
      Done := True;
    except
      on E: EDatabaseError do
      begin
        Action := daFail;
        if Assigned(ErrorEvent) then ErrorEvent(Self, E, Action); // <------
        if Action = daFail then raise;
        if Action = daAbort then SysUtils.Abort;
      end;
    end;
  until Done;
end;



// unit DBConsts;
resourcestring
  SFieldRequired = 'Feld '#39'%s'#39' muss einen Wert haben'; 



Можно ли замутить с TuniQuery подобие мануального Append / Edit и Post , раз уж этото компонент работает.
Как вариант...

Спасибо.
...
Рейтинг: 0 / 0
14.09.2021, 00:21
    #40097410
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
bzums,

Интересно, я один не понял в чем же заключается ошибка?

Или я уже такой старый, что без текста ошибки отказываюсь принимать багррепорты?
...
Рейтинг: 0 / 0
14.09.2021, 06:52
    #40097428
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
В том все и дело, что ошибка происходит где-то глубоко, вижу только AV на строке Post.

CheckOperation(InternalPost, FOnPostError) где-то в этом вызове.

TDataSet.CheckOperation(Operation) в свою очередь вызывает метод Operaation ( откуда идёт необрабатывамое исключение ).

Сдается, что это баг ODBC, потому как воспроизводится в любом клиенте .
...
Рейтинг: 0 / 0
14.09.2021, 09:03
    #40097441
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
bzums,

посмотри на свойства поля. Там может быть что-то, связанное с автоинкриментом.
...
Рейтинг: 0 / 0
14.09.2021, 09:10
    #40097446
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
bzums,

Вы не привели ни SQL запрос, ни текст ошибки. Что вы хотите от нас?
...
Рейтинг: 0 / 0
14.09.2021, 09:14
    #40097453
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TUniTable странное поведение
Да не смог я добраться до текста ошибки.
Обновление до актуальной версии UniDAC решило проблему.
Всем большое спасибо.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TUniTable странное поведение / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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