С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
4 / 4 / 2
Регистрация: 10.05.2008
Сообщений: 22
MS Access

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

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

Студворк — интернет-сервис помощи студентам
Бд достигла размеров 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2008, 21:26
Ответы с готовыми решениями:

Сжатие звука с потерями и обратно (или иное сжатие с потерями)
Доброго всем времени суток. Столкнулся с такой проблемой, есть канал связи с маленькой скоростью на...

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

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

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

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

Сама процедура.
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  [ТС]
Спасибо за помощь. Все работает!

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

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

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

Добавлено через 20 минут
DeleteFile(PChar(Name)); - Зачем нужно PChar() У меня и без них работает?
0
 Аватар для MegaPiha
23 / 23 / 8
Регистрация: 10.03.2008
Сообщений: 125
29.06.2008, 13:35
Цитата Сообщение от Xes Посмотреть сообщение
На какой случей этот код?
Code
1
2
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  [ТС]
Усе разобрался.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
10.04.2024, 15:52
Ох и огород же мне в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2024, 15:52
Помогаю со студенческими работами здесь

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

Программное создание файла БД "Access"
Здравствуйте! Знаю как по определённому событию создать файл БД &quot;Access&quot;, таблицы и поля к...

Как скопировать данные из таблицы одной БД Access в такую же таблицу БД Access другой БД Access?
Как с помощью компонента AdoQuery (Delphi7) скопировать данные из таблицы одной БД Access в такую...

Сжатие
Привет всем! Может кто знает или у кого есть код извлечения файлов из архива LZMA например:...

Аналог Radmin-а, сжатие скрина
Пишу аналог радмина по локальной сети, необходимо быстро сжать скриншот до 1.5 - 2 метров (как...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «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. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru