Программное сжатие БД

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Программное сжатие БД

Сообщение gjghjc » 23.10.2003 (Чт) 16:29

Люди помогите советом!!!!!!!!!!

Нашел вот такой код

Код: Выделить всё
Dim srcString As String
Dim dstString As String
srcString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb"
dstString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db2.mdb;JET OLEDB:Engine Type=4"
Dim jro As jro.JetEngine     
Set jro = New jro.JetEngine
jro.CompactDatabase srcString, dstString
Set jro = Nothing

Подключаю, как сказано, Microsoft Jet and Replicatuion Objects 2.5 Library, запускаю.

В итоге ошибка "Выполнение операции невозможно; возможности данной версии недоступны в БД старого формата"
Преобразую БД в формат Access 2000 или 2002 все равно выскакивает эта ошибка
Пробую сделать это на базе данных используемой в моей программе
В этом случае код такой

Код: Выделить всё
Dim srcString As String
Dim dstString As String
srcString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Zbase.mdb;Persist Security Info=False;JET OLEDB:database password=1234"
dstString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Zbase.mdb;Persist Security Info=False;JET OLEDB:database password=1234;Engine Type=4"
Dim jro As jro.JetEngine       
Set jro = New jro.JetEngine
jro.CompactDatabase srcString, dstString
Set jro = Nothing

Получается еще интересней "Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности проверьте значения всех состояний OLE DB. Работа не выполнена."

В связи с этим возникает ряд вопросов

1. Какой еще более новый формат Бд нужен этой хреновине :shock: :shock:
2. Как проверить значения всех состояний OLE DB.
3. Как все таки сжать БД(Access) программно

Заранее большое спасибо.
Утро добрым не бывает!

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 30.10.2003 (Чт) 17:36

Ну неужели никто ни разу не сжимал базу кодом!!!!!!!!!
Хелп!!!!!!!!! аж горит!!!!!!!!
Утро добрым не бывает!

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 10.11.2003 (Пн) 20:26

А чем тебе DAO не нравится?
DBEngine.CompactDatabase

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.11.2003 (Вт) 10:20

Видимо человек не хочет таскать с собой всю библиотеку только ради сжатия базы данных. gjghjc, с JRO я не работал и по делу подсказать не могу. Мне кажется, ты со строкой коннекта накосячил.

Мне проще, я стараюсь по возможности обходиться DAO 3.6. Для работы на локальной машине она подходит гораздо больше. Хотя может я консерватор :)
Lasciate ogni speranza, voi ch'entrate.

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 12.11.2003 (Ср) 19:58

гы... тогда у меня тоже вопрос ... а как её таскать за собой эту ДАО 3.6?

Ем вилкой...

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 20.11.2003 (Чт) 11:01

2alibek если можно пример кода для DAO 3.6. И сразу вопрос а будет ли это дао работать с базой Access 2000.
Утро добрым не бывает!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 20.11.2003 (Чт) 12:02

Пример кода уже был приведен.

Код: Выделить всё
DBEngine.CompactDatabase


С 2000 Access работать будет.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 20.11.2003 (Чт) 14:31

Понял... Пошел пробовать.
Утро добрым не бывает!

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 02.12.2003 (Вт) 18:51

Пошел.... Попробовал.......
В результате имею еще ряд вопросов
1. Как быть в случае если на базе стоит пароль?
2. Объясните синтаксис DAO.CompactDatabase Source, Destination ,?,?,?
3. Например я хочу сделать так чтобы база сжималась каждый раз когда я выхожу из программы. Вопрос как правильно повесить это на событие Form_Unload. Потому как если я просто вешаю DAO.CompactDatabase на это событие прога ругается мол база открыта таким то пользователем и ты ничего с ней не сделаешь.
(Может лучше сжимать базу при загрузке программы еще до того как прога подключилась к БД)
Заранее спасибо за Ваши МУДРЫЕ советы :) :)
Утро добрым не бывает!

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 03.12.2003 (Ср) 13:17

3. Конечно, ругается. Надо закрыть коннекцию сначала. Ты ее как открывал? Как коннектился к базе?
Если у тебя есть объект коннекции, то MyConnection.Close
2. Если ты не хочешь ничего менять в настройках базы, которую компактишь, то ничего из параметров тебе не нужно. Там можно порядок сортировки поменять (локаль базы), зашифровать данные... В общем, сходи в МСДН. Единственно только, рз у тебя база запаролена, то в последнем параметре укажи ";pwd=CoolPassword". Попробуй, по крайней мере :) Если хочешь, поменять пароль, то напиши в таком же синтаксисе в 3-м параметре ";pwd=NewPassword"

То есть твой код будет выглядеть так:
DBEngine.CompactDatabase Source, Destination, , ,";pwd=CoolPassword"

1. Ответ уже был.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 03.12.2003 (Ср) 23:13

Конект к базе осуществляется примерно так

Это находится в Форм_Лоад
Код: Выделить всё
Set FormName = MainForm
Abon = 1
PathBase = App.Path & "\"

SQLSelect = "SELECT streetid, street "
SQLFrom = "FROM street_base "
SQLOrder = " ORDER BY street "
SQLstr = SQLSelect & SQLFrom & SQLOrder

InitADO

Set DG1.DataSource = Adodc1
Do Until Adodc1.Recordset.EOF
cboStreetName.AddItem Adodc1.Recordset.Fields("Street")
cboStreetName.ItemData(cboStreetName.NewIndex) = Adodc1.Recordset.Fields("StreetId")
Adodc1.Recordset.MoveNext
Loop
cmdNewClient.Caption = "Добавить нового" & vbCrLf & "абонента в базу"

If Day(Now) > 20 Then Mname = MonthName(Month(Now), False): Mname1 = MonthName(Month(Now) - 1, False) Else Mname = MonthName(Month(Now) - 1, False): Mname1 = MonthName(Month(Now) - 2, False)
MainForm.mnuOne.Caption = "За " & Mname
MainForm.mnuTwo.Caption = "За " & Mname1



Код: Выделить всё
Public Sub InitADO()
With Adodc1
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & PathBase & "StreetBase.mdb;Persist Security Info=False;JET OLEDB:database password=1234"
.CommandType = adCmdText
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.RecordSource = SQLstr
.Refresh
End With
End Sub


За ответ на вопрос №2 большое спасибо приду домой попробую
Утро добрым не бывает!

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 04.12.2003 (Чт) 12:14

Ага. Значит коннекцию у тебя сам контрол adodc открывает. Есть предположение, что закроет он ее, когда разрушится. А разрушается он после Form_Unload. Попробуй сжатие базы повесить на Form_Terminate. Только не обращайся к контролам формы здесь, а то форма обратно загрузится.

А вообще, я бы не доверяла в таких вещах VB. Я бы создала глобальный объект коннекции (ADODB.Connection) и с ним бы работала.

Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & PathBase & "StreetBase.mdb;Persist Security Info=False;JET OLEDB:database password=1234"
cnn.CursorLocation = adUseClient
cnn.Open

Тогда в нужный момент можно выполнить cnn.Close.

Adodc инициализировала бы рекордсетом.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 04.12.2003 (Чт) 22:45

Adodc инициализировала бы рекордсетом.

Немного непонятно. Если можно кусочек кода :oops: :oops:
Утро добрым не бывает!

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 05.12.2003 (Пт) 11:27

Да пожалуйста!

Код: Выделить всё
Dim rst As New ADODB.Recordset
rst.Open "Select * from Employees", cnn, adOpenStatic, adLockOptimistic

Set Adodc1.Recordset = rst


А вообще, на Form_Terminate сжатие работает ;)

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 08.12.2003 (Пн) 18:23

2Rainbow Да на Form_Terminate сжатие работает просто на УРА БОЛЬШОЕ спасибо за помощь.
Утро добрым не бывает!


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

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

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

    TopList