Страница: 1 | 2 |
Вопрос: Как полностью отсоединиться от файла бд access!
Добавлено: 18.06.09 20:43
Автор вопроса: dis
Закрываю соединение с бд. Пытаюсь произвести сжатие бд, но вылезает ошибка: "Попытка открыть базу данных, открытую пользователем '..' на машине '..' для монопольного доступа. Повторите попытку, когда база данных освободится".
NameConnect.Close() ' отсоединение от NameMDB
Dim Jro As JRO.JetEngine
Jro = New JRO.JetEngine
lJro.CompactDatabase(NameMDB, NameCopyMDB)
Jro = Nothing
Не сталкивался с этим, неужели Close не достаточно для освобождения файла бд???
..подсоединение к бд было стандартным: NameConnect.Open()
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #1
Добавлено: 18.06.09 21:01
В 4-ой строке опечатка, исправляю:
Jro.CompactDatabase(NameMDB, NameCopyMDB)
Но вопрос остается не решенным!
Номер ответа: 2
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #2
Добавлено: 19.06.09 03:49
Ни одного совета
Может вопрос слишком простой!? Пытаюсь разобраться уже 2 недели.
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 19.06.09 07:59
Да конечно простой.. Чудес на свете не бывает! Для выполнения метода CompactDatabase, нужен экслюзивный доступ, раз ты его получить не можешь, значит кто то или что то держит соеденение к БД.. Это может быть кто угодно.. например Access, к примеру ты просматривал записи в БД и оставил Access открытым и свернутым. Либо в твоем коде где то еще держится соеденение открытым или еще какая то программа юзает эту БД. Кроме того, есть такое понятие как пул соеденений (не знаю правда применимо ли оно к Access) при котором вызов метода Close() не приводит к удалению соеденения, а лишь к его закрытию и помещению в пул для скорейшего доступа к БД в следующий раз. Пул так же не даст возможность открыть БД в режиме монопольного доступа. Лучше всего попробовать занулить NameConnect после закрытия.. В любом случае косяк у тебя..
Номер ответа: 4
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #4
Добавлено: 19.06.09 12:06
А этот "Пул" еще как-нибудь можно принудительно закрыть???
Пробовал:
NameConnect = Nothing
..НЕ ПОМОГАЕТ!
С файлом БД соединяюсь один раз при запуске программы, и рассоединяюсь при закрытии. Больше подсоединений к бд нет.
И вот пытаюсь отсоедениться во время работы программы, не получается.
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 19.06.09 12:38
Вот при соеденении попробуй открыть БД в монопольном режиме.. Если не выйдет, значит ищи кто еще юзает эту БД.. если же получится, значит косяк у тебя в коде и ты где то не закрываешь соединение..
Номер ответа: 6
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #6
Добавлено: 19.06.09 23:51
...что косяк у меня, даже не сомневаюсь
БД открыта в монопольном доступе, это же пишется в сообщении об ошибке! А файл открывается только моей программой.
В VB6 проблемы отконнектится не было.
Мне кажется, грамотные программеры с access не связываются и найти ответ будет не просто
Все равно спасибо! А есть смысл задать этот вопрос на форуме: vbnet, "Работа с данными"??? Или там все те же!?
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 20.06.09 21:46
Отсюда можно сделать вывод, что соединение удерживаешь ты в коде.. Ищи где ты накосячил.. Ищи то место, где ты забываешь закрыть соединение..
а ты на чем пишешь, на NET? Есди это, так то зачем ты напрямую юзаешь com-объект??? Получить доступ к ядру ты сможешь через рефлексию..
Вот тут я как то показывал как это можно сделать..
http://kbyte.ru/Code/Show.aspx?id=120&lang=ru
Номер ответа: 8
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #8
Добавлено: 20.06.09 22:21
Пишу на vb.net (vb2005), раньше юзал vb6. Соединений с базой больше нет - это железно!
Твоего примера так с хода не понимаю! Даже языка не пойму
зачем ты напрямую юзаешь com-объект??? Получить доступ к ядру ты сможешь через рефлексию..
..извини, но я ничего не понял, мне бы попроще!
Нарыл, что команда NameConnect.Close() только запускает процесс отсоединения и не отслеживает само время процесса. Типа, прога работает дальше, но для реального отсоединения требуется время!
Может исправляется с помощью обработчика ошибок Try…Catch, а может отслеживанием времени задержки.
..думаю как это реализовать.
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 20.06.09 22:29
Попробуй вызвать что то типа NameConnect.Dispose()
Номер ответа: 10
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #10
Добавлено: 20.06.09 22:39
NameConnect.Dispose() и NameConnect=Nothing не срабатывают ни вместе ни по отдельности
Года пол назад, натыкался в одном из форумов на компактный код решения, но было не надо!
Номер ответа: 11
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #11
Добавлено: 21.06.09 00:17
На форуме SQL.ru есть ветка посвященная аксу и модеры там знающие.
Номер ответа: 12
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #12
Добавлено: 21.06.09 00:23
Try…Catch и задержка времени оказались не для моего случая.
У меня 2 вопроса:
1. а что означает:
что ввести в гугле, чтобы разобраться!?
2. Открытие базы в монопольном режиме??? Строка подключения:
Номер ответа: 13
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #13
Добавлено: 21.06.09 00:25
Try…Catch и задержка времени оказались не для моего случая.
У меня 2 вопроса:
1. а что означает:
что ввести в гугле, чтобы разобраться!?
2. Открытие базы в монопольном режиме это как??? Мое подключение:
Номер ответа: 14
Автор ответа:
dis
Вопросов: 1
Ответов: 10
Профиль | | #14
Добавлено: 21.06.09 00:36
Спасибо, попробую и там.
Номер ответа: 15
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #15
Добавлено: 21.06.09 02:24
Прежде чем постить внимательно пролистай ихний ФАК.
В смысле FAQ