powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TUniTable странное поведение
6 сообщений из 6, страница 1 из 1
TUniTable странное поведение
    #40097381
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предыстория такова, что парсится 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
TUniTable странное поведение
    #40097410
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums,

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

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

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

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

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

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

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


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