С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/97: Рейтинг темы: голосов - 97, средняя оценка - 4.51
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137

Программно сжать и восстановить БД в Access

04.04.2008, 13:00. Показов 18587. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как программно сжать базу, как делает Access?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2008, 13:00
Ответы с готовыми решениями:

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

Как на С# программно сжать базу Access 2010
Здравствуйте Уважаемые Гуру! Собственно вопрос указан в названии темы сообщения программно сжать базу Access 2010 силами С# Как...

Сжать и восстановить БД из VB
Есть БД MSAccess. Она запаролена. Как из VB сжать и восстановить запароленную базу данных? Ещё. Не совсем нормально закрыл тему по...

25
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
04.04.2008, 13:45
Пример на Visual Basic .NET, но думаю будет понятно
Code
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
Private sSourceFile, sDestFile As String
Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
    If dlgOpen.ShowDialog = DialogResult.OK Then
        '///Используя OpenFileDialog, задаем путь до БД-источника
        txtOpen.Text = dlgOpen.FileName.ToString
    End If
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    dlgSave.InitialDirectory = System.IO.Path.GetTempPath
    If dlgSave.ShowDialog = DialogResult.OK Then
        '///Используя SaveFileDialog, задаем путь для предпологаемой сжатой БД
        txtSave.Text = dlgSave.FileName.ToString
    End If
End Sub
Private Sub btnCmDb_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCmDb.Click
    sSourceFile = txtOpen.Text
    sDestFile = txtSave.Text
    If sSourceFile.Length <> 0 And sDestFile.Length <> 0 Then
        Dim sConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                                sSourceFile & ";"
        Dim dConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                                sDestFile & ";"
        Dim jro As New JRO.JetEngine
        Try
            '///Сжатие
            jro.CompactDatabase(sConn, dConn)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            jro = Nothing
        End Try
    End If
End Sub
На делфях:
Code
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{****************************************************
>> Программное сжатие базы данных Access используя JRO (Jet Replication Objects)
 
Процедура позволяет сжать базу данных в формате Access, используя JRO (Jet Replication Objects). Действие аналогичное пункту меню в Access "Сервис -> Служебные программы -> Сжать и восстановить базу данных".
Параметры:
* DatabaseName - путь к исходной (не сжатой) базе данных
* DestDatabaseName - путь к сжатой базе данных (по умолчанию пустой - в этом случае исходная база заменяется сжатой)
* Password - пароль базы данных (по умолчанию пустой)
 
PS. этот код был написан в связи с тем что аналогичная процедура через DAO у многих не работала (по пока неизвестным для меня причинам)
 
Зависимости: windows,SysUtils,ComObj,Dialogs (Dialogs можно исключить используя MessageBox для вывода сообщения исключительной ситуации)
 
Автор:      savva, savva@nm.ru, 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;
Учтите, что может потребоваться монопольный режим доступа.
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
05.04.2008, 23:24  [ТС]
Благодарю....попробую..
А задать монопольный доступ к базе как сделать или указать?
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 11:41  [ТС]
АУУУ!!!
Код Delphi ругается на Application.CreateOleObject!!! В чём ошибка??
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
07.04.2008, 11:57
А какая ошибка мы должны догадаться?
В uses указан Comobj?
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 14:45  [ТС]
Undeclared Identifier 'CreateOleObject'

В uses добавил CombObj - не знает такой файл.
Я наверное название не так указал???
Исправил...
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
07.04.2008, 14:46
Цитата Сообщение от Perun
В uses добавил CombObj - не знает такой файл.
Цитата Сообщение от mik-a-el
В uses указан Comobj?
Найдите 10 отличий.
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 14:58  [ТС]
А в Builder какую-нибудь библиотеку надо подключать??
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 15:03  [ТС]
Всё работает в Delphi. Только непонятно одно обстоятельство.
Я сжал базу программно и с помощью Access: результат разный. Причём Access размер базы сжимает меньше, чем программно
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
07.04.2008, 15:11
Цитата Сообщение от Perun
Я сжал базу программно и с помощью Access: результат разный. Причём Access размер базы сжимает меньше, чем программно
На сколько меньше?
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 15:44  [ТС]
была -564 кб
Программно: стала 512 кб
Access: стала 528 кб
Это нормально?
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
07.04.2008, 15:50
Цитата Сообщение от Perun
Это нормально?
Если она корректно распаковывается, то плюс-минус 15 кб значения не имеет.
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
07.04.2008, 16:00  [ТС]
Хорошо, а как код Delphi преобразовать
V.CompactDatabase(Src,Dest);// сжимаем
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
09.04.2008, 09:06  [ТС]
Так по синтаксису Builder'a кто-нибудь ответит?
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
09.04.2008, 11:52  [ТС]
На код хоть посмотрите!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (Password != "")
         {
          Src = Src + ";Jet OLEDB:Database Password=" + Password;
          Dest = Dest + ";Jet OLEDB:Database Password=" + Password;
         }
 
      V = Variant::CreateObject("jro.JetEngine");
      try
        {
         AnsiString com = "CompactDatabase(" + Src + ","+ Dest + ")";
         V.OleFunction(com);// В ЭТОМ МЕСТЕ ОШИБКА - НЕИЗВЕСТНОЕ ИМЯ EOleSysError
         //V.CompactDatabase(Src,Dest);// сжимаем
        }
      __finally
        {
          V = 0;
        }
      if (DestDatabaseName == "") // т.к. выходная база не указана
          {
           DeleteFile(PChar(DatabaseName.c_str())); //то удаляем не упакованную базу
           RenameFile(Name,DatabaseName.c_str()); // и переименовываем упакованную базу
          }
В дельфях код работает нормально
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
09.04.2008, 12:03
Программное сжатие базы данных Access используя JRO (Jet Replication Objects)
Программное сжатие базы данных Access используя DAO
Использование Jet and Replication Objects

Еще:

Code
1
2
3
4
5
WideString paths, pathd;
  ................
 Variant V;
 V=CreateOleObject("Access.Application");
 V.OlePropertyGet("DBEngine").OleFunction("CompactDatabase", paths, pathd);
Или так

Code
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
void __fastcall TfrmMain::mnuPackDBClick(TObject *Sender)
{
WideString WSCurrConn, WSTempDB;
TBookmark Bookmark;
 
WSCurrConn        = dmMain->acMain->ConnectionString;
Bookmark          = adsMain->GetBookmark();
adsMain->Close();
dmMain->acMain->Close();
mnuCreateBackupClick(Sender);
 
Variant JE = Variant::CreateObject ("JRO.JetEngine");
 
try
 {
  JE.OleFunction ("CompactDatabase",  WSCurrConn,
   "Provider=Microsoft.Jet.OLEDB.4.0;Password="";Mode=ReadWrite;Data Source=temp.mdb");
  if(FileExists("temp.mdb"))
   {
    CopyFile("temp.mdb", "base.mdb", false);
    DeleteFile("temp.mdb");
   }
 }
__finally
 {
  JE                = Unassigned;
  dmMain->acMain->Open();
  adsMain->Open();
  if( adsMain->BookmarkValid(Bookmark) )
   adsMain->GotoBookmark(Bookmark);
 }
}
Или так

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall LFunction::CompactMdb(AnsiString LPath, AnsiString LPwd)  {
  AnsiString FName = LPath;
  AnsiString Ext = ExtractFileExt(LPath);
  AnsiString FNameNotExt = LPath.SubString(1,LPath.Pos(Ext) - 1);
  if(Ext.LowerCase() == ".mdb")  {
    if(!FileExists(FNameNotExt + ".ldb"))  {
      TJetEngine * JetEngine = new TJetEngine(NULL);
      WideString Source = "Provider=Microsoft.Jet.OLEDB.4.0; \
                           Jet OLEDB:Database Password=" + LPwd + "; \
                           Data Source=" + FName + ";";
      WideString Dest =   "Provider=Microsoft.Jet.OLEDB.4.0; \
                           Jet OLEDB:Database Password=" + LPwd + "; \
                           Data Source=" + FNameNotExt + "te1.mdb;";
      JetEngine->CompactDatabase(Source.c_bstr(), Dest.c_bstr());
      DeleteFile(FName);
      RenameFile(FNameNotExt + "te1.mdb",FName);
    delete JetEngine;
    }
  }
}
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
09.04.2008, 13:14  [ТС]
В 1 примере что такое :
paths, pathd;
0
Администратор
 Аватар для mik-a-el
87822 / 53143 / 249
Регистрация: 10.04.2006
Сообщений: 13,761
09.04.2008, 13:15
А по определению OleFunction не догадаться?
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
09.04.2008, 13:15  [ТС]
И где прочитать про работу с объектами Variant применительно к офисным приложениям, Word,Access,Excel и т.д.????
0
5 / 5 / 3
Регистрация: 22.02.2008
Сообщений: 137
09.04.2008, 13:17  [ТС]
Похоже на источник и данных и конечную БД??
Я прав?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2008, 13:17
Помогаю со студенческими работами здесь

Не получается сжать и восстановить БД
Доброго времени суток! Народ, может кто сталкивался с подобной проблемой? При попытке сжать и восстановить данные выдает &quot;Ошибочный...

Сжать и восстановить связанную базу
Ситуация такая: база разделена на две части - клиентскую и серверная. В клиентской - формы, запросы и т.п. В серверной - таблицы и данные. ...

Функция сжать и восстановить базу данных
Здравствуйте друзья. Хочу функцию сжать и восстановить базу данных повесить на кнопку закрытия базы, чтобы каждый раз при закрытии базы она...

Как можно программно сжать БД из нее же?
У меня такой вопрос: как можно программно сжать БД из нее же? т.е. находясь в ней. Метод CompactDatabase объекта DBEngine ругается, что...

Как программно при закрытии сжать базы
Подскажите пожалуйста как программно при закрытии сжать базы. Спасибо!


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru