4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
1

Программное сжатие базы Access

14.06.2008, 21:26. Показов 9341. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Бд достигла размеров 38 метров при том что она пуста, необходимо сжать БД. Подсказали на форуме такой код но с моими знаниями доума довести не могу. Помогите плиз.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TMainForm.ActionCompactAccessDBExecute(Sender: TObject); 
var 
JetEngine: Variant; 
TempName: string; 
aAccess: string; 
stAccessDB: string; 
SaveCursor: TCursor; 
begin 
stAccessDB := 'Provider = Microsoft.Jet.OLEDB.4.0;' + 
'Data Source = %s;Jet OLEDB: Engine type = '; 
stAccessDB := stAccessDB + '5'; {5 for Access 2000 and 4 for Access 97} 
OpenDialog1.InitialDir := oSoftConfig.ApplicationPath + 'Data\'; 
OpenDialog1.Filter := 'MS Access (r) (*.mdb)|*.mdb'; 
if OpenDialog1.execute and (uppercase(ExtractFileExt 
(OpenDialog1.FileName)) = '.MDB') then 
begin 
if MessageDlg('This process can take several minutes. Please wait till the end ' + 
#13 + #10 + 'of it. Do you want to proceed? Press No to exit.', mtInformation, 
[mbYes, mbNo], 0) = mrNo then 
exit; 
SaveCursor := screen.cursor; 
screen.cursor := crHourGlass; 
aAccess := OpenDialog1.FileName; 
TempName := ChangeFileExt(aAccess, '.$$$'); 
DeleteFile(PChar(TempName)); 
JetEngine := CreateOleObject('JRO.JetEngine'); 
try 
JetEngine.CompactDatabase(Format(stAccessDB, [aAccess]), 
Format(stAccessDB, [TempName])); 
DeleteFile(PChar(aAccess)); 
RenameFile(TempName, aAccess); 
finally 
JetEngine := Unassigned; 
screen.cursor := SaveCursor; 
end; 
end; 
end;
У меня выдает ошибку JetEngine := CreateOleObject('JRO.JetEngine') - не известный индификатор CreateOleObject, хотя библиотеку "Microsoft Jet and Replication Objects 2.6 Library" к проекту добавил.

Подскажите у кого есть время проверить этот код как вы его отладели?

Вот разговор с другого форума и отличная статейка про сжатие БД.

http://www.sql.ru/forum/actual... tid=567058

http://www.sql.ru/faq/faq_topic.aspx?fid=155
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2008, 21:26
Ответы с готовыми решениями:

Сжатие базы данных
Пытаюсь сжать базу данных (Access 2010). function TFormMain.compactandrepair(db: string):...

Программное создание базы данных
Помогите пожалуйста!!!!!!!!!У меня есть база данных из 7 таблиц, мне нужно эту базу сделать через...

Программное создание базы данных Paradox
Здравствуйте. Как программно создать базу данных Paradox? Подобно созданию Access: function...

Программное сжатие базы MS Access 97
Народ, подскажите, плиз, кто знает что-нибудь по данное теме... Очень нужно... Или ссылочку киньте,...

9
Почетный модератор
11527 / 4322 / 448
Регистрация: 12.06.2008
Сообщений: 12,421
14.06.2008, 21:36 2
...не известный индификатор CreateOleObject...
Что бы использовать CreateOleObject, нужно к Uses добавить ComObj
0
4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
14.06.2008, 22:36  [ТС] 3
Ок. Ситаксических ошибок не стало. Теперь когда выбрал базу ругаеться
Project Xes.exe raised exception class EOleException with message 'Heвoзмoжнo нaйти ycтaнaвливaeмый ISAM'.
Что такое ISAM и как решить возникшую проблемку?
0
23 / 23 / 8
Регистрация: 10.03.2008
Сообщений: 125
14.06.2008, 22:44 4
Можно для начала открыть базу в монопольном режиме выбрать "Сервис" там "Сжать и восстановить базу".
0
4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
15.06.2008, 07:52  [ТС] 5
Это я делал, она сжимаеться и не в монопольном режиме. Мне надо програмно сжать.

Добавлено через 5 минут
Ругаеться
Цитата:
Project Xes.exe raised exception class EOleException with message 'Heвoзмoжнo нaйти ycтaнaвливaeмый ISAM'.
Останавливеться на этой строчке:
JetEngine.CompactDatabase(Format(stAccessDB, [aAccess]), Format(stAccessDB, [TempName]));
0
23 / 23 / 8
Регистрация: 10.03.2008
Сообщений: 125
16.06.2008, 13:36 6
Попробуй этим способом.

Сама процедура.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Procedure CompactDatabase_JRO(DatabaseName:String;DestDatabaseName:String='';Password:String='');
Const
  Provider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
Var
  TempName : Array[0..MAX_PATH] of Char; 
  TempPath : String; 
  Name : String;
  Src,Dest : WideString;
  V : Variant;
begin
  try
      Src := Provider + 'Data Source=' + DatabaseName;
      if DestDatabaseName<>'' then
          Name:=DestDatabaseName
      else begin
          TempPath:=ExtractFilePath(DatabaseName);
          if TempPath='' Then TempPath:=GetCurrentDir;
          GetTempFileName(PChar(TempPath),'mdb',0,TempName);
          Name:=StrPas(TempName);
      end;
      DeleteFile(PChar(Name));
      Dest := Provider + 'Data Source=' + Name;
      if Password<>'' then begin
          Src := Src + ';Jet OLEDB:Database Password=' + Password;
          Dest := Dest + ';Jet OLEDB:Database Password=' + Password;
      end;
      V:=CreateOleObject('jro.JetEngine');
      try
          V.CompactDatabase(Src,Dest);
      finally
          V:=0;
      end;
      if DestDatabaseName='' then begin 
          DeleteFile(PChar(DatabaseName)); 
          RenameFile(Name,DatabaseName); 
      end;
  except
    on E: Exception do ShowMessage(e.message);
  end;
end;
Пример вызова.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMain.Button3Click(Sender: TObject);
Var path,db,db1:string;
begin
   GetDir(0,path);
   db:=path+'\Table\newBD.mdb';
   With DM do begin
      ADOconnection1.Close;
   end;
   CompactDatabase_JRO(db,'','');
   With DM do begin
      ADOconnection1.Open;
      TblMain.Open;
      TblName.Open;
      .... открываем таблицы
   end;
end;
1
4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
29.06.2008, 00:13  [ТС] 7
Спасибо за помощь. Все работает!

Только для себя разобраться хочу в таких строках.
На какой случей этот код?

Delphi
1
2
if TempPath='' then
        TempPath:=GetCurrentDir;
В какой ситуации функция возвратит пустую строку?
GetCurrentDir -- что за функция?
GetDir(0,path); - И что это за функция? Судя по косякам возникших у меня, возвращаяе путь последнего котолога из которого был запущен (открыт) любой предыдущий файл через эту программу.

Еще раз спасибо за рабочий код.

Добавлено через 20 минут
DeleteFile(PChar(Name)); - Зачем нужно PChar() У меня и без них работает?
0
23 / 23 / 8
Регистрация: 10.03.2008
Сообщений: 125
29.06.2008, 13:35 8
Цитата Сообщение от Xes Посмотреть сообщение
На какой случей этот код?
Код
if TempPath='' then
        TempPath:=GetCurrentDir;
В какой ситуации функция возвратит пустую строку?
Функция ExtractFilePath(DataBaseName) возвращает пустую строку если имя DataBaseName не содержит ни имена каталогов ни имя диска.

Цитата Сообщение от Xes Посмотреть сообщение
GetCurrentDir -- что за функция?
Эта функция возвращает полное имя текущего каталога.

Цитата Сообщение от Xes Посмотреть сообщение
GetDir(0,path); - И что это за функция? Судя по косякам возникших у меня, возвращаяе путь последнего котолога из которого был запущен (открыт) любой предыдущий файл через эту программу.
Эта процедура записывает в переменную path имя текущего каталога на диске указанном в первом параметре ( 0 - текущий диск)).

Цитата Сообщение от Xes Посмотреть сообщение
DeleteFile(PChar(Name)); - Зачем нужно PChar() У меня и без них работает?

В данном случае просто вызывается процедура DeleteFile из модуля Windows. Если не использовать PChar то будет вызываться из модуля SysUtils.
0
4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
29.06.2008, 16:00  [ТС] 9
Усе разобрался.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 189
10.04.2024, 15:52 10
Ох и огород же мне в 2008г был предложен.
Спустя 16 лет опять возникла эта задача.
Все гораздо проще и читабельнее:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function CompactDatabase_JRO(DatabaseName: string; Password: string = ''): Boolean;
var
  Src, Dest: WideString;
  V: Variant;
begin
  try
    var TempName := ExtractFilePath(DatabaseName) + 'mdbPunchCAM';
    DeleteFile(TempName);
    const Provider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
    Src := Provider + 'Data Source=' + DatabaseName;
    Dest := Provider + 'Data Source=' + TempName;
    if Password <> '' then begin
      Src := Src + ';Jet OLEDB:Database Password=' + Password;
      Dest := Dest + ';Jet OLEDB:Database Password=' + Password;
    end;
 
    V := CreateOleObject('jro.JetEngine');
    try
      V.CompactDatabase(Src, Dest);
    finally
      V := 0;
    end;
 
    DeleteFile(DatabaseName);
    RenameFile(TempName, DatabaseName);
  except
    ShowMessage('{C6CDA928-9093-4441-9855-6A1CA4992E4F}');
    Result := False;
    Exit;
  end;
  Result := True;
end;
0
10.04.2024, 15:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2024, 15:52
Помогаю со студенческими работами здесь

Программное сжатие базы Access
Доброго времени суток, уважаемые форумчане. Пытаюсь программно сжать базу данных, но все мои...

Программное сжатие БД Ms Access
В Access есть функция 'Сжать/Восстановить БД'. Как это сделать программно, с помощью кода из ВБ?...

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

Программное создание базы Access с созданием отдельного .MDW
Есть проблемка. Пытаюсь создать базу new.mdb, что бы паралельно создавался new.mdw по указанным...

Сжатие базы
Как сжать базу данных access 2016, не закрывая ее?

Сжатие и восстановление базы
Доюрый день. Помогите мне, пожалуйста, в решении следующей задачи: Имеется база данных с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru