Потеря записей в бд Access

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Потеря записей в бд Access

Сообщение ger_kar » 22.09.2013 (Вс) 18:47

Приложение на VB6
Подключение к СУБД Access 2003 (MS JET 4.0)
Используемый компонент ADO DB.

При работе с базой данных иногда (достаточно редко) возникает глюк, при котором добавляемые записи не сохраняются в таблицах базы данных. Причем, после того как этот глюк проявляется, все записи добавляемые после этого момента в базу доступны только в текущей сессии подключения к базе данных, которая совпадает по времени с работой приложения. И получается следующее: глобальный объект ADODB.Connection создается при запуске приложения, далее идет подключение к базе и в дальнейшем приложение использует это соединение. Все прекрасно работает, но в один прекрасный момент (который может проявиться раз в месяц, а то и реже) происходит глюк и после закрытия приложения, данных, которые добавлялись, изменялись и т.п. в базе данных нет как нет. При работе приложения глюк никак не проявляется, никаких исключений не происходит, с добавленными данными можно работать и пр., но как только закрыл приложение, то данным каюк. Такое ощущение, что данные есть в кэше, а в сам файл mdb не прописываются. Причем поле счетчика увеличивается и после нормального добавления следующей записи ( в следующем сеансе работы) можно даже по отсутствующим идентификаторам точно посчитать какое количество записей было утеряно.

В принципе конечно можно каждый раз при использовании ADODB.Connection делать реконнект, или вообще создавать/уничтожать ADODB.Connection, но такой вариант мне жутко не нравится, так как он не соответствует принципу лени. Да и вообще непонятно что глючит, то ли сам провайдер, то ли ADO. Может кто уже сталкивался с подобным?
Бороться и искать, найти и перепрятать

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Потеря записей в бд Access

Сообщение HandKot » 23.09.2013 (Пн) 6:54

Очень похоже на поведение при работе с транзакциями. Т.е открыли, поработали, не сделали коммит транзакции и все вернулось на круги своя.
I Have Nine Lives You Have One Only
THINK!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 23.09.2013 (Пн) 8:51

Да по поведению совпадает с незавершенными транзакциями. Как если бы была одна транзакция, начинавшаяся сразу после коннекта, и не завершенная при закрытии соединения с базой. Но в том то и дело, что такой транзакции нет :( , а те транзакции, которые имеются в приложении завершаются вполне нормально, да и к тому же они не носят такого глобального характера. Может глюк в самом ADO?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.09.2013 (Пн) 11:28

А там нет чего-нибудь типа автоматического оборачивание соединения в транзацкию?
Оно вообще корректно закрывается при закрытии программы, или просто уничтожается вместе с ней?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Потеря записей в бд Access

Сообщение HandKot » 23.09.2013 (Пн) 13:11

ger_kar писал(а):Да по поведению совпадает с незавершенными транзакциями. Как если бы была одна транзакция, начинавшаяся сразу после коннекта, и не завершенная при закрытии соединения с базой. Но в том то и дело, что такой транзакции нет :( , а те транзакции, которые имеются в приложении завершаются вполне нормально, да и к тому же они не носят такого глобального характера. Может глюк в самом ADO?

про глюк ничего подобного не слышал
для проверки, перед выходом из приложения сделайте
Код: Выделить всё
MsgBox CStr(MyConnection.BeginTrans)

должно вернуть 1
I Have Nine Lives You Have One Only
THINK!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 23.09.2013 (Пн) 15:33

Ну вообще ADO так не делает. Имеется ввиду оборачивания соединения в транзакцию. И до разрыва соединения все данные заносятся в базу. Я конечно доподлинно не знаю как оно там все устроено. Для меня ADO - некий черный ящик, но предполагаю, что работает все следующим образом: При внесении изменений в базу они кэшируются и находятся в памяти и параллельно записываются в файл mdb. Таким образом при обращении к этим данным они берутся из памяти, а не из файла. А при наступлении глюка у кого-то из парочки провайдер MS JET + ADODB приключается жуткий склероз, и данные в файл не попадают. Причем склероз видимо очень глубокий, так как никаких сообщений или исключений не возникает. Соответственно данные вроде как есть, но по завершении приложения просто растворяются, а в файле их нет и никогда не было.

Приложение закрывается корректно
Код: Выделить всё
'Обработка, закрытие и уничтожение объекта Connection
    If Not g_oConnection Is Nothing Then
        If g_oConnection.State <> adStateClosed Then g_oConnection.Close
        Set g_oConnection = Nothing
    End If


Но даже если погасить его через диспетчер задач или просто учинить End, без нормального завершения, все прекрасно работает. Проблема то еще и в том, что глюк довольно редкий и его поймать очень сложно.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 23.09.2013 (Пн) 15:36

ger_kar писал(а):для проверки, перед выходом из приложения сделайтеКод: Выделить всёMsgBox CStr(MyConnection.BeginTrans)должно вернуть 1
Не понял, а в чем смысл начинать транзакцию перед заурытием приложения? Типа если вернулось 1 то транзакции не было, а если больше, то типа фантомная транзакция началась?
Бороться и искать, найти и перепрятать

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Потеря записей в бд Access

Сообщение HandKot » 24.09.2013 (Вт) 6:54

ger_kar писал(а):
ger_kar писал(а):для проверки, перед выходом из приложения сделайтеКод: Выделить всёMsgBox CStr(MyConnection.BeginTrans)должно вернуть 1
Не понял, а в чем смысл начинать транзакцию перед заурытием приложения? Типа если вернулось 1 то транзакции не было, а если больше, то типа фантомная транзакция началась?


да, проверка на это
учитывая, что ошибка плавающая, то может писать это в файл, а потом при наступлении ошибки его посмотреть
I Have Nine Lives You Have One Only
THINK!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.09.2013 (Вт) 11:30

А как насчёт вложенных транзакций? Или в Access'е их нет?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 24.09.2013 (Вт) 12:55

Qwertiy писал(а):А как насчёт вложенных транзакций? Или в Access'е их нет?

Есть до 5 уровней вложенности. Нигде это порог вроде не превышается.
HandKot писал(а):учитывая, что ошибка плавающая, то может писать это в файл, а потом при наступлении ошибки его посмотреть
Ну сделал ведение лога, что-бы хоть понять какие операции предшествуют глюку. Лично я сам его на своем компе дома так и не смог воспроизвести. Проверял версии MDAC они совпадают с моими, а больше даже не знаю что и думать.
Бороться и искать, найти и перепрятать

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Потеря записей в бд Access

Сообщение HandKot » 27.09.2013 (Пт) 7:11

ger_kar писал(а):Ну сделал ведение лога, что-бы хоть понять какие операции предшествуют глюку. Лично я сам его на своем компе дома так и не смог воспроизвести. Проверял версии MDAC они совпадают с моими, а больше даже не знаю что и думать.

будем ждать. ничего другого не остается. даже в инете пока ничего подобного не встречал

ЗЫЖ еще мелькнула идея о внешних ключах и каскадном удалении.
I Have Nine Lives You Have One Only
THINK!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 27.09.2013 (Пт) 19:32

Ну вообще связи между таблицами настроены так, чтобы каскадно ничего не удалялось. Может действительно каким то образом начинается транзакция, которая в конечном итоге не завершается. Хотя где это может происходить даже не представляю, все перепроверил несколько раз. На текущий момент сделал тотальный вывод в лог разной информации, в том числе о начале, завершении и откате транзакций, теперь нужно подождать пока ошибка поймается :)
Бороться и искать, найти и перепрятать

ramozel
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 05.04.2015 (Вс) 18:06
Откуда: Россия

Потеря записей в бд Access

Сообщение ramozel » 05.04.2015 (Вс) 22:15

Мне нужно чтобы, все записи удалялись нажатием одной кнопки, а не скакать по таблицам в поисках нужных записей.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 15.04.2015 (Ср) 16:07

Что значит все записи? Все записи из таблицы, а может вообще все записи из БД, а может нужно чтобы удалялись все записи связанные отношением с удаляемой? Если последнее, то можно просто настроить связи между таблицами с каскадным удалением.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.04.2015 (Ср) 16:45

on delete cascade?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Потеря записей в бд Access

Сообщение ger_kar » 15.04.2015 (Ср) 22:21

Он самый. Или же настройка в самом Access в графическом режиме.
Бороться и искать, найти и перепрятать


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 113

    TopList