powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / PostgreSQL + DAO транзакция - теряются изменения
12 сообщений из 12, страница 1 из 1
PostgreSQL + DAO транзакция - теряются изменения
    #39090141
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги.

Переезжаем с Аccess на PostgreSQL. Вроде бы всё работает на первый взгляд удовлетворительно, но в одном месте наткнулся на опасную ошибку. При использовании транзакции код отрабатывает без ошибок, но запись в таблице не появляется! Поскольку транзакции используются в коде повсеместно, очень опасная тенденция. Код VBA такой
Код: vbnet
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.
Set wrkW = DBEngine.Workspaces(0)
  wrkW.BeginTrans
  On Error GoTo Err_1
'изменение в таблице СчетаДанные
  Set tb1 = CurrentDb.OpenRecordset("СчетаДанные")
  
  If Me.OpenArgs = "ADD" Then
    NomSF = NextNumId(6)
    If NomSF = -1 Then Err.Raise vbObjectError + 513, , "Неверный Id"
    tb1.AddNew
    tb1!Id = NomSF
  Else
    tb1.FindFirst "Id=" & Forms("фрмСчетаДанные")!Id
    If tb1.NoMatch Then
      MsgBox "Ошибка: не найдена запись в таблице СчетаДанные", vbCritical
      Exit Sub
    End If
    tb1.Edit
  End If
  
'Обновление полей аля 
'tb1!ЦенаПрайс = ПолеЦенаПрайс
'tb1!ЦенаПрайс2 = ПолеЦенаПрайс2
'tb1!ЦенаПрайс3 = ПолеЦенаПрайс3
  tb1.Update 
'Если сюда вставить wrkW.CommitTrans то запись в таблице благополучно появится.

'изменение в таблице Счета
CurrentDb.Execute "UPDATE Счета SET UpdateDate=Now(), UpdateUserID=" & GetGeneralParams(1) & " WHERE Id=" & Forms("фрмСчета")!Id, dbFailOnError
  
  wrkW.CommitTrans 
  wrkW.Close
'После этого комита, запись в таблице Счета обновляется, но записей о добавлении записи в СчетаДанные нет



В этом месте транзакция не критична, но в большинстве других мест это не так. Не понятно, почему пропадает часть изменений и как отследить, что записи не пропадают? Потому как в некоторых местах без специального исследования и не поймёшь, что что-то пошло не так и часть данных пропала по дороге. В другом месте нормально отрабатывали гораздо более длинные транзакции, но там были только рекордсеты, я так понимаю всё портит CurrentDb.Execute... Возможно, там не такой коннект как у СurrentDb.OpenRecordset, но я не уверен

Переписать под ADO единовременно не представляется возможным, ибо данные переносятся по кускам и некоторых таблиц на сервере ещё долго не будет... К тому же никто не гарантирует, что там это не будет работать точно так же.

В общем, мистика и жёпа - на дебаг всех форм и всех транзакции уйдут остатки молодости, нужно искать корень и системное решение.
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39090270
Попробуйте выполнить Set db = CurrentDb ( или Set db = wrkW.Databases(0) ) перед wrkW.BeginTrans и в коде использовать db.
Сколько записей за раз обновляет запрос? Может лучше открыть Recordset и внести изменения туда?
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39090301
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев )Попробуйте выполнить Set db = CurrentDb ( или Set db = wrkW.Databases(0) ) перед wrkW.BeginTrans и в коде использовать db.
Сколько записей за раз обновляет запрос? Может лучше открыть Recordset и внести изменения туда?

Через db не работает...
Конечно, если всё переделать в запросы или всё решить через рекордсеты, всё работает, но это значит, в первую очередь, что оригинальный код не работает, а это было основной целью... Если переписывать все транзакции - это очень много работы и не всегда это можно будет корректно переписать, чтобы всё работало в одной транзакции (некоторые - довольно длинные). Там много где проще с нуля переписать, чем переделать корректно...
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39090332
ШыфлЧерез db не работает... В смысле, вообще не работает или ничего не изменилось?
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39090363
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев )ШыфлЧерез db не работает... В смысле, вообще не работает или ничего не изменилось?

В смысле работает, но данные теряются...
Заметил ещё одну хрень - если db.Execute происходит раньше, чем tb1.Update, то данные не теряются... Короче, в рамках существующего приложения - жуткий рандомный баг :(
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39092689
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Включил логи на стороне сервера, посмотреть что посылает Ассеss. Выяснилось, что строка
Код: vbnet
1.
CurrentDb.Execute "UPDATE Счета SET UpdateDate=Now(), UpdateUserID=" & GetGeneralParams(1) & " WHERE Id=" & Forms("фрмСчета")!Id, dbFailOnError


посылается на сервер 2 раза, один раз в виде
Код: plsql
1.
UPDATE "public"."Счета" SET UpdateDate= ,UpdateUserID=11 WHERE ("Id" = 38903 ) 


что вызывает ошибку на сервере и откат транзакции, но Access эту ошибку не выдаёт, а посылает следом запрос вида
Код: plsql
1.
2.
UPDATE "public"."Счета" SET "UpdateUserID"=$1,"UpdateDate"=$2 WHERE "Id" = $3
ПОДРОБНОСТИ: параметры: $1 = '11', $2 = '2015-11-02 12:04:47', $3 = '38903'


который проходит, но уже в новой транзакции, которую Jet воспринимает как исходную, и делает вид, что всё нормально.

Вопросы, собственно, таковы
1) Почему возникает первый, не валидный запрос?
2) Как сделать его валидным/отключить?
3) Почему не возникает ошибки, а данные теряются "по тихому"?

Подозреваю, что где-то должна быть настройка, параметр или галочка, которая всё исправит...
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39093251
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шыфл,

м-да, пока что помогло удаление параметра dbFailOnError, теперь строка
Код: vbnet
1.
CurrentDb.Execute "UPDATE Счета SET UpdateDate=Now(), UpdateUserID=" & GetGeneralParams(1) & " WHERE Id=" & Forms("фрмСчета")!Id


для сервера выглядит как
Код: plsql
1.
2.
3.
4.
5.
ОТМЕТКА:  оператор: SELECT "public"."Счета"."Id" FROM "public"."Счета" WHERE ("Id" = 38903 ) 
ОТМЕТКА:  выполнение _PLAN0E353468/_PLAN0E353468: SELECT "Id","UpdateUserID","UpdateDate"  FROM "public"."Счета"  WHERE "Id" = $1
ПОДРОБНОСТИ:  параметры: $1 = '38903'
ОТМЕТКА:  выполнение _PLAN0E3536D0/_PLAN0E3536D0: UPDATE "public"."Счета" SET "UpdateUserID"=$1,"UpdateDate"=$2 WHERE "Id" = $3
ПОДРОБНОСТИ:  параметры: $1 = '11', $2 = '2015-11-02 23:46:48', $3 = '38903'


Но зато не падает, и транзакция срабатывает корректно. Что б в МS так жили, как их Jet запросы генерирует... Или может я зря на Jet? Может это драйвер чудит?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
PostgreSQL + DAO транзакция - теряются изменения
    #39508193
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шыфл,

На каком решении остановились? Что вызывало проблему?
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39508318
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nebo,
Убрали из всех запросов параметр
Код: vbnet
1.
 dbFailOnError


Похоже, что драйвер для PG его не правильно воспринимает.
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39508439
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШыфлNebo,
Убрали из всех запросов параметр
Код: vbnet
1.
 dbFailOnError


Похоже, что драйвер для PG его не правильно воспринимает.

А так всё работает нормально? да?

На днях читал, ссылка где-то утонула, что луче всего использовать view.
Что Аксесс якобы что-то делает с запросами.
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39508441
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл

The PostgreSQL ODBC driver is actively developed and an Access front-end combined with PostgreSQL server, in my opinion makes a great option on a LAN for rapid development. I have been involved in a reasonably big system (100+ PostgreSQL tables, 200+ Access forms, 1000+ Access queries & reports) and it has run excellently for a few years, with ~20 users. Any queries running slow because Access is doing something stupid can generally just be solved by using views, and any really data-intensive code can easily be moved into PostgreSQL functions and then called from Access.

https://stackoverflow.com/questions/37991/using-ms-access-odbc-to-connect-to-a-remote-postgresql
...
Рейтинг: 0 / 0
PostgreSQL + DAO транзакция - теряются изменения
    #39508463
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeboШыфлNebo,
Убрали из всех запросов параметр
Код: vbnet
1.
 dbFailOnError


Похоже, что драйвер для PG его не правильно воспринимает.

А так всё работает нормально? да?
На днях читал, ссылка где-то утонула, что луче всего использовать view.
Что Аксесс якобы что-то делает с запросами.

Я уже не в проекте, но знаю, что всё работает почти 2 года уже. Некоторые запросы и отчёты тупят, их по-тихоньку переписывают в процедуры на PgPL/SQL.
Идея была перенести таблицы из Акса в PG так, чтобы код Акса этого не заметил. Это вцелом удалось без особых проблем, подготовка таблиц, миграция и первичные тесты заняли где-то месяцa два. Пару особо жутких запросов пришлось сразу переделать, потому что view на view на view работало очень медленно. Некоторые конструкции, типа Recordset.MoveFirst и dbFailOnError пришлось исключись, кое-где пришлось добавить первичные ключи (где не было). Но всё запустилось, дальше они сами - я уехал в Чехию. Пару раз созванивались с ИТ директором - всё работает, благодарствует. По-тихоньку переписывают каскады view в pgPL/SQL a формы под WPF.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / PostgreSQL + DAO транзакция - теряются изменения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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