Как программно удалить файл Access 2000 (*.mdb)?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Как программно удалить файл Access 2000 (*.mdb)?

Сообщение Loiste » 01.12.2005 (Чт) 16:27

Собственно, вопрос в теме. Как программно удалить ранее созданный файл Access 2000, имеющий расширение *.mdb?

зы:понимаю, вопрос ламерский))..пробовала File.Delete(path), но это не работает.

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 01.12.2005 (Чт) 19:01

А файл не открыт случаем? Просто не вижу причин, по которым еще не удалять его (ну разве что права...). Должно удалять...
Путь проверь, если не правильный, то эксепшена не будет никакого, может с толку сбить.

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 9:24

Путь перепроверила. Теперь удаляет. Но только если файл был создан до открытия приложения. Если же я создаю его, а потом сразу пытаюсь удалить, отладчик ругается. Говорит, что файл используется другим приложением. Что делать в этом случае?

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 02.12.2005 (Пт) 9:35

А ты, часом, не забыла закрыть файл перед удалением??
Max

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 10:27

Не знаю, может и забыла..вообще-то я программно создавала эту пустую базу Access. Как ее закрывать после создания я не знаю. Не подскажите?

Хотя, соединение с базой я закрывала.

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 02.12.2005 (Пт) 11:01

а КАК ты ее создала? :shock:
Закрой датаадаптер к созданной базе и попробуй удалить,
вот так например: Dispose
http://msdn.microsoft.com/library/rus/cpref/html/frlrfsystemdatacommondataadaptermemberstopic.asp
не выйдет тода попробуй закрыть коннекшн, а потом уже удалить.

самому интересно получится ли? ;)
Max

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 11:10

Создавала вот так:

Код: Выделить всё
Dim strDbName As String
        strDbName = Application.StartupPath.Remove(Application.StartupPath.Length - 4, 4) + "\db\" + DiscDBName
       
        Dim catConnection As ADOX.Catalog
        catConnection = New ADOX.Catalog
        catConnection.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)
        catConnection = Nothing
       
       
        Dim con As ADODB.Connection
        Dim strSQL As String
        con = New ADODB.Connection
        con.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)
        strSQL = "CREATE TABLE Razdeli (" & _
                 "Razd_ID int," & _
                 "Razdel VarChar(150));"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Topics (" & _
                 "Razd_ID int," & _
                 "Topic_ID int," & _
                 "Topic VarChar(150));"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Questions (" & _
                 "Topic_ID int," & _
                 "Quest_ID int," & _
                 "Var int," & _
                 "Question VarChar(150)," & _
                 "Ans_Num int);"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Answers (" & _
                 "Quest_ID int," & _
                 "Ans_ID int," & _
                 "Answer VarChar(150)," & _
                 "Ans_Key Bit);"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Variants (" & _
                 "ID int," & _
                 "Variant VarChar(150));"
        con.Execute(strSQL)
        con = Nothing
       


Как видно, датаадаптер для этого не нужен, так что и закрывать нечего.

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 02.12.2005 (Пт) 11:23

вау...
ну... что тут скажешь... ты значительно умнее меня! ;)
у меня все проще...

твой коннекшн держит базу, возможно пока не "отцепишься" не удалится файл?
так что попробуй перейти к плпну "В"
Max

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 02.12.2005 (Пт) 11:26

интересно, а если послать не закрывая коннект
SQL-команду
DROP DATABASE имя_базы?
Max

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 11:31

Я создаю пустые базы по нажатию кнопки...их может набраться несколько штук в ходе работы с приложением. А удаляю, если мне вдруг подумалось..например, что база мне не нужна. Это отдельный процесс, понимаешь?

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 02.12.2005 (Пт) 11:38

честно скажу: НЕТ (
давай, чтобы не заливать форум...
или аська


просто мне самому интересно! ))
Последний раз редактировалось kroskros 02.12.2005 (Пт) 11:46, всего редактировалось 1 раз.
Max

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 11:41

Послала тебе реквест в аську :)

Ребят, ну подскажите кто-нибудь? Может, после создания таблиц база остается каким-то образом открытой? Код привела выше.

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 02.12.2005 (Пт) 12:30

Черт, я совсем не знаток по базам в дот нет, но разве нет (в твоем случае) con.close?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 02.12.2005 (Пт) 13:21

Vinechka писал(а):Черт, я совсем не знаток по базам в дот нет, но разве нет (в твоем случае) con.close?


Это ADOX

Теряется ссылка на открытую базу данных и явно не уничтожается, тоесть, до двух сборок мусора.

Нужно получить ссылку на открытый конекшн и закрыть его.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 14:52

Поставила con.Close() перед con = Nothing. Не помогло. Наверно надо как-то закрыть ADOX соединение? Но везде пишут о закрытии ADODB соединений..а как отловить активное соединение?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 02.12.2005 (Пт) 15:13

Loiste писал(а):Поставила con.Close() перед con = Nothing. Не помогло. Наверно надо как-то закрыть ADOX соединение? Но везде пишут о закрытии ADODB соединений..а как отловить активное соединение?


State?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 02.12.2005 (Пт) 15:25

State это свойство. Оно показывает активно соединение или нет. Но когда я создаю новое и принудительно делаю его активным, оно ведь и так активное. Потом, я тут же его закрываю. Но все они почему-то все еще открыты..Уважаемые, можно попросить привести конкретно кусок кода по данному вопросу? Как правильно, и в какой последовальности все делать?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 02.12.2005 (Пт) 16:15

Код: Выделить всё
        Dim DB As ADODB.Connection
        Dim RS As ADODB.Recordset
        Dim App As String
        App = Application.StartupPath


        db = New ADODB.Connection()
        db.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        DB.Open("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & App & "\play.mdb;Mode=Share Deny None;")

        RS = New ADODB.Recordset()
        RS.Open("select * from file", DB, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)
        RS.Close() 'state рекордсета становится = 0
        DB.Close() 'state соединения становится = 0
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 05.12.2005 (Пн) 8:40

Я не открываю существующую таблицу, а создаю новые в новой же, только что созданной базе.

Пока что кусок данного кода выглядит так:

Код: Выделить всё
Dim strDbName As String
        strDbName = Application.StartupPath.Remove(Application.StartupPath.Length - 4, 4) + "\db\" + DiscDBName
        'creation of new database
        Dim catConnection As ADOX.Catalog
        catConnection = New ADOX.Catalog
        catConnection.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)

Dim con As ADODB.Connection
        Dim strSQL As String
        con = New ADODB.Connection
        con.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)

        catConnection.ActiveConnection = con

        strSQL = "CREATE TABLE Razdeli (" & _
                 "Razd_ID int," & _
                 "Razdel VarChar(150));"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Topics (" & _
                 "Razd_ID int," & _
                 "Topic_ID int," & _
                 "Topic VarChar(150));"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Questions (" & _
                 "Topic_ID int," & _
                 "Quest_ID int," & _
                 "Var int," & _
                 "Question VarChar(150)," & _
                 "Ans_Num int);"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Answers (" & _
                 "Quest_ID int," & _
                 "Ans_ID int," & _
                 "Answer VarChar(150)," & _
                 "Ans_Key Bit);"
        con.Execute(strSQL)
        strSQL = "CREATE TABLE Variants (" & _
                 "ID int," & _
                 "Variant VarChar(150));"
        con.Execute(strSQL)
        con.Close()
        con = Nothing
        catConnection = Nothing



То есть если оставить только выдержки, касающиеся соединений:

Код: Выделить всё
Dim catConnection As ADOX.Catalog
        catConnection = New ADOX.Catalog
        catConnection.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)

Dim con As ADODB.Connection
        Dim strSQL As String
        con = New ADODB.Connection
        con.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                             "Data Source=" & strDbName)

catConnection.ActiveConnection = con

con.Execute(strSQL)
        con.Close()
        con = Nothing
        catConnection = Nothing



Или мне следует вообще убрать это?

Код: Выделить всё
con = Nothing
catConnection = Nothing


Что в этой последовательности не так?

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 05.12.2005 (Пн) 13:26

Чето я не понял тебе таблицк надо удалить или всю базу (все таблицы)?

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 05.12.2005 (Пн) 13:43

файл *.mdb

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 05.12.2005 (Пн) 15:43

Ну я ж тебе говорю, у тебя походу в каталоге при Create создаётся конекшен, а ты его другим заменяешь, а так как это не Вб6, то оно остается висеть...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 06.12.2005 (Вт) 8:54

Да, дело действительно было так :) Спасибо за помощь!
Млин, вот если бы еще у меня форум вдруг не переставал грузиться без причины...
Представляешь, пост оставила...а зайти уже так и не смогла..Правда, за это время уже разобралась с проблемой :)

Но меня слегка парит, когда вдруг ни с того, ни с сего у меня перестает грузиться форум, а вместо этого я наблюдаю картину маслом UserGate :evil:

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 06.12.2005 (Вт) 22:13

Если разобралась то поделись с другими, как это тебе удалось?
Когда я смотрел данную проблему, выяснил что файл держит
strDbName = Application.StartupPath.Remove(Application.StartupPath.Length - 4, 4) + "\db\" + DiscDBName
'creation of new database
Dim catConnection As ADOX.Catalog
catConnection = New ADOX.Catalog
catConnection.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strDbName)

Если точнее то файл держит сама система даже при полном уничтожениии данного объекта и при попытке создать данной функцией несколько файлов подряд, все они заняты системой. как освободить их я так и не додумался. Хотя через некоторое время ожидания часть файлов освобождается.

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 07.12.2005 (Ср) 0:23

temur
А нафига системе её держать? странно

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 07.12.2005 (Ср) 0:28

А кто его знает Kulip@tor, но реально не catConnection его держит. При закрытии приложения которое реализует все это поисходящее файл освобождается, но не при сброса catConnection. тем более я не зря указал
и при попытке создать данной функцией несколько файлов подряд, все они заняты

если не веришь проверь сам, убедишся.
Кстати это замеченно и неуловимым джо Sebas - ом немного выше.
Последний раз редактировалось temur 07.12.2005 (Ср) 0:45, всего редактировалось 1 раз.

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 07.12.2005 (Ср) 0:33

Да к стати данная проблема имеет распростронение не только здесь, бывало у меня и при создании файла через IO.File.Create тоже не удавалось не то что удалить даже изменить файл, до закрытия приложения. Но как в одной из тем такого рода было замеченно, что на другом компе все работает иначе, тоже правда. Поэтому я так и не знаю как справлятся с данной проблемой, если кто обьяснит как с этим боротся буду благодарен.

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 07.12.2005 (Ср) 3:07

temur
ya proboval potomu govoru 4to stranno. a s failami u menya vse ok. takoe bivaet toka kogda ne zakrivaew ego i ne osvobojdaew resurs.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 07.12.2005 (Ср) 23:15

Kulip@tor
temur

Ребята, это недетерминированное завершение, после cat=nothing cat остается в памяти.

Если вы потеряли ссылку на объект удерживающий ресурсы, то
GC.Collect - 2 РАЗА!!!!! спасёт
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 08.12.2005 (Чт) 0:05

Sebas
ponyatno. drugogo vibora net :) a 4e imenno toka posle 3 raza srabativaet?

След.

Вернуться в Visual Basic .NET

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

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

    TopList  
cron