Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
БД открыта в монопольном доступе, это же пишется в сообщении об ошибке! А файл открывается только моей программой.

Отсюда можно сделать вывод, что соединение удерживаешь ты в коде.. Ищи где ты накосячил.. Ищи то место, где ты забываешь закрыть соединение..
В VB6 проблемы отконнектится не было.

а ты на чем пишешь, на 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. Открытие базы в монопольном режиме??? Строка подключения:
  1.  
  2. NameConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurDir() & "\" & "fb.mdb; Jet OLEDB:Database password=drf"
  3. Me.actConnect = New OleDb.OleDbConnection(NameConnect)
  4. Me.actConnect.Open()

Ответить

Номер ответа: 13
Автор ответа:
 dis



Вопросов: 1
Ответов: 10
 Профиль | | #13 Добавлено: 21.06.09 00:25
Try…Catch и задержка времени оказались не для моего случая.

У меня 2 вопроса:
1. а что означает:
Получить доступ к ядру ты сможешь через рефлексию

что ввести в гугле, чтобы разобраться!?
2. Открытие базы в монопольном режиме это как??? Мое подключение:
  1.  
  2. textConnect= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurDir() & "\" & "fb.mdb; Jet OLEDB:Database password=drf"
  3. NameConnect = New OleDb.OleDbConnection(textConnect)
  4. NameConnect.Open()

Ответить

Номер ответа: 14
Автор ответа:
 dis



Вопросов: 1
Ответов: 10
 Профиль | | #14 Добавлено: 21.06.09 00:36
На форуме SQL.ru есть ветка посвященная аксу и модеры там знающие.


Спасибо, попробую и там.

Ответить

Номер ответа: 15
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #15 Добавлено: 21.06.09 02:24
Прежде чем постить внимательно пролистай ихний ФАК.
В смысле FAQ :-)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам