Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > зжатие БД


Автор: R0nin 5.5.2006, 22:50
В DRKB написано как зжать, НО у меня выдает ошибку
  Format(stAccessDB, [TempName]));           (ЗДесь)
Невозможно найти установленный ISAM   (Сообщение о ошибке)

Наверника надо его установить, но я не знаю что ето! 

Автор: Dynamic 6.5.2006, 07:54
ты так делал?
Код

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Программное сжатие базы данных Access используя DAO

Процедура позволяет сжать базу данных в формате Access, используя DAO.
Действие аналогичное пункту меню в Access "Сервис -> Служебные программы ->
Сжать и восстановить базу данных".
Параметры:
* DatabaseName - путь к базе данных
* Password - пароль базы данных

Зависимости: windows,SysUtils,Dialogs,DAO2000,ComObj
(Dialogs можно исключить используя MessageBox для вывода
сообщения исключительной ситуации)
Автор:       savva, [email protected], ICQ:126578975, Орел
Copyright:   Сапронов Алексей (Savva)
Дата:        31 мая 2002 г.
***************************************************** }

//перед вызовом процедуры базу надо закрыть, а после - открыть

procedure TData.CompactAccessDatabase(DatabaseName, Password: string);
var
  TempName: array[0..MAX_PATH] of Char; // имя временного файла
  TempPath: string; // путь
  Name: string;
  tmpDAO: _DBEngine;
  ClassID: TGUID;
  V35, V36: string; // версия DAO
begin
  V35 := 'DAO.DBEngine.35';
  V36 := 'DAO.DBEngine.36';
  try // получим ClassID
    try
      ClassID := ProgIDToClassID(v35);
    except
      try
        ClassID := ProgIDToClassID(v36);
      except
        raise; // что то нам неизвестное
      end;
    end;
    // получаем путь для временного файла
    TempPath := ExtractFilePath(DatabaseName);
    if TempPath = '' then
      TempPath := GetCurrentDir;
    //получаем имя временного файла
    GetTempFileName(PChar(TempPath), 'mdb', 0, TempName);
    Name := StrPas(TempName);
    DeleteFile(PChar(Name)); // этого файла не должно существовать :))
    if Password <> '' then
      Password := ';pwd=' + Password;
    tmpDAO := CreateComObject(ClassID) as _DBEngine;
    tmpDAO.CompactDatabase(DatabaseName, Name, 0, 0, Password);
    DeleteFile(PChar(DatabaseName)); // удаляем не упакованную базу
    RenameFile(Name, DatabaseName); // переименовываем упакованную базу
  except
    // выдаем сообщение об исключительной ситуации
    on E: Exception do
      ShowMessage(e.message);
  end;
  еnd;
Пример использования: 

...
db.Close;
CompactAccessDatabase('database.mdb', 'password');
db.open;
...



Добавлено @ 07:54 
или так?
Код

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Программное сжатие базы данных Access используя JRO (Jet Replication Objects)

Процедура позволяет сжать базу данных в формате Access,
используя JRO (Jet Replication Objects). Действие аналогичное
пункту меню в Access "Сервис -> Служебные программы ->
Сжать и восстановить базу данных".
Параметры:
* DatabaseName - путь к исходной (не сжатой) базе данных
* DestDatabaseName - путь к сжатой базе данных
(по умолчанию пустой - в этом случае исходная база заменяется сжатой)
* Password - пароль базы данных (по умолчанию пустой)

PS. этот код был написан в связи с тем что аналогичная процедура
через DAO у многих не работала (по пока неизвестным для меня причинам)

Зависимости: windows,SysUtils,ComObj,Dialogs (Dialogs можно исключить
используя MessageBox для вывода сообщения исключительной ситуации)
Автор:       savva, [email protected], ICQ:126578975, Орел
Copyright:   Сапронов Алексей (Savva)
Дата:        9 сентября 2002 г.
***************************************************** }

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;
Пример использования: 

...
db.Close;
CompactDatabase_JRO('c:\database.mdb',
  'c:\Archiv\database_pack.mdb', 'password');
db.open;
...

 

Автор: R0nin 6.5.2006, 09:45
Код


procedure TForm1.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 := 'c:\═ютр  яряър (2)\';
  OpenDialog1.Filter := 'MS Access о (*.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;

 

Автор: Dark Wanderer 14.5.2006, 19:23
R0nin, может глупый вопрос, но вы установили  Microsoft Jet and Replication Objects ?
Второй способ(первый не проверял) от Dynamic, у меня работает отлично. 

Автор: R0nin 15.5.2006, 17:03
установил! smile , я сделал как сказал Dynamic так заработало 

Автор: MacTep 29.10.2006, 15:02
На строке 61 второго кода от Dynamic
Код
V.CompactDatabase(Src, Dest); // сжимаем
вылезает ошибка, что данная база данных открыта пользователем Admin для онопольного доступа. Что делать? Ведь при вызове функции я закрываю базу данных и не держу ее открытой.

Автор: 7OH 10.12.2007, 16:39
Подскажите - а как мне сжать БД НЕ ACCESS ??
У меня используется FireBird + FibPlus 6.5 .
Сжатие приемлемо только программным методом - остальное пользователям не должно быть доступно.

Автор: R0nin 10.12.2007, 23:06
проблема аксеса, что при удалении данных, данные, не совсем удаляются, и мтод сжатия для нее это во первых почистить ее.

Для зжатия НОРМАЛЬНОЙ БД, если ничего не найдешь умнее, можешь тупа зарарить через сваю программу. Я бы взял какой нить досовский, чтоб меньше весил и вперед.
альтернатива, сжать файл по алгоритму, точно не помню названия, но поищи в гугле там есть! и сажмешь файл с бд,(но надо ли те лишний код?)

Лучше всего выше перечисленное годится для резервного копирования

Автор: mvb 11.12.2007, 06:45
Цитата(7OH @  10.12.2007,  16:39 Найти цитируемый пост)
Подскажите - а как мне сжать БД НЕ ACCESS ??
У меня используется FireBird + FibPlus 6.5 .
Сжатие приемлемо только программным методом - остальное пользователям не должно быть доступно. 


Поищи на сайте Devrace статью об использовании FIBBackupService/FIBRestoreService...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)