Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2018, 23:06   #1
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию Cжатие базы данных Access

Нужно сжать базу данных.
Использую вот эту процедуру:

Код:
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;
ADOConnection1:
ConnectionString : Provider=Microsoft.Jet.OLEDB.4.0;Us er ID=Admin;Data Source=motor.mdb;Mode=ReadWrite;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;
Connected : true
Mode : cmReadWrite

Вызываю при закрытии програмы в FormClose:
Код:
    ADOConnection1.Close;
    CompactDatabase_JRO('motor.mdb', '','');
Выдает ошибку "...Попытка открыть базу данных, откритую пользователем Админ на машине КОМПЬЮТЕР для монопольного доступа. ПОвторите попытку, когда база освободится..."
Ошибку пишет здеся - V.CompactDatabase(Src,Dest);
И из IDE, и если закрыть Делфи.

Если вызывать в FormCreate:
Код:
    ADOConnection1.Close;
    CompactDatabase_JRO('motor.mdb', '','');
    ADOConnection1.Open;
То из IDE таже ошибка, а если закрыть Делфи - то работает.
Вопрос. Хотелось бы все таки сжимать при закрытии программы.
Подскажите, как это сделать.
Спасибо.
yorri вне форума Ответить с цитированием
Старый 12.02.2018, 23:24   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
То из IDE таже ошибка, а если закрыть Делфи - то работает.
Нечего базу в ide соединенной держать. Соединение программно нужно делать, а в ide по пионески очень ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.02.2018, 23:34   #3
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нечего базу в ide соединенной держать. Соединение программно нужно делать, а в ide по пионески очень ))
Если сделать Connected : false - все равно ошибка таже.

Последний раз редактировалось yorri; 13.02.2018 в 01:58.
yorri вне форума Ответить с цитированием
Старый 13.02.2018, 01:54   #4
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Сделал програмное подключение.
Код:
ADOConnection1 := TADOConnection.Create(Self);
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=motor.mdb;Mode=ReadWrite;Persist Security Info=False;';

ADOConnection1.LoginPrompt := False;
ADOConnection1.Provider:='Microsoft.Jet.OLEDB.4.0';
ADOConnection1.Connected := True;

ADOTable1.ConnectionString:=ADOConnection1.ConnectionString;
ADOQuery1.ConnectionString:=ADOConnection1.ConnectionString;
ADOTable1.Active:=True;
ADOQuery1.Active:=True;
Та же ошибка... непойму

Последний раз редактировалось yorri; 13.02.2018 в 01:58.
yorri вне форума Ответить с цитированием
Старый 13.02.2018, 09:09   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А зачем ADOConnection динамически создаешь? У тебя же есть созданный в ide. Вот в нем и сделай Connected = False. А при старте программы обычно ConnectionString подправляют для настройки путей и Connected в True
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.02.2018, 09:50   #6
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем ADOConnection динамически создаешь? У тебя же есть созданный в ide. Вот в нем и сделай Connected = False. А при старте программы обычно ConnectionString подправляют для настройки путей и Connected в True
Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем ADOConnection динамически создаешь? У тебя же есть созданный в ide. Вот в нем и сделай Connected = False. А при старте программы обычно ConnectionString подправляют для настройки путей и Connected в True
Делал так. Ошибка.
Решил динамически попробовать - тоже самое. Как то странно все это...
yorri вне форума Ответить с цитированием
Старый 13.02.2018, 09:51   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Выдает ошибку "...Попытка открыть базу данных, откритую пользователем Админ на машине КОМПЬЮТЕР для монопольного доступа.
Код:
ADOConnection1.Connected := True;

ADOTable1.ConnectionString:=ADOConnection1.ConnectionString;
ADOQuery1.ConnectionString:=ADOConnection1.ConnectionString;
// налицо установка ВТОРОГО и третьего подключения к БД

ADOTable1.Connection:=ADOConnection1;  // а надо бы использовать "старое" подключение
.....
и сделать это лучше до запуска программы( т.е. при проектировании форм) в ObjectInspector
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.02.2018 в 09:57.
evg_m вне форума Ответить с цитированием
Старый 13.02.2018, 10:43   #8
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
ADOConnection1.Connected := True;

ADOTable1.ConnectionString:=ADOConnection1.ConnectionString;
ADOQuery1.ConnectionString:=ADOConnection1.ConnectionString;
// налицо установка ВТОРОГО и третьего подключения к БД

ADOTable1.Connection:=ADOConnection1;  // а надо бы использовать "старое" подключение
.....
и сделать это лучше до запуска программы( т.е. при проектировании форм) в ObjectInspector
Спасибо. Ввечером попробую.
А ADOConnection можно использовать визуальный компонент или лучше создавать програмно?
...
(выходить, если "при проектировании форм в ObjectInspector") - тогда визуальный компонент; правильно я понял?)
yorri вне форума Ответить с цитированием
Старый 13.02.2018, 11:23   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
А ADOConnection можно использовать визуальный компонент или лучше создавать програмно?
да любой какой есть.
если есть заранее установленный на форму, то его и подключить не грех сразу же.
а настроить соединение можно когда угодно.
если создаете сами в программе, то и подключать придется там же(в программе).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.02.2018, 22:39   #10
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
да любой какой есть.
если есть заранее установленный на форму, то его и подключить не грех сразу же.
а настроить соединение можно когда угодно.
если создаете сами в программе, то и подключать придется там же(в программе).
Не работает. Все та же ошибка. Хоть плач... :-|

ADOConnection1 - поставил на форму. Ничего в ObjectInspector в нем не правил.

FormCreate
Код:
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=motor.mdb;Mode=ReadWrite;Persist Security Info=False;';
ADOConnection1.LoginPrompt := False;
ADOConnection1.Provider:='Microsoft.Jet.OLEDB.4.0';
ADOConnection1.Connected := True;

ADOTable1.Active:=True;
ADOQuery1.Active:=True;
ADOTable1 и ADOQuery1 -> Active:=false, Connection:=ADOConnection1;

FormClose
Код:
ADOConnection1.Connected:=False;
CompactDatabase_JRO('motor.mdb', '','')
Тут хотел уже отправлять сообщение, но попробовал еще вот что.
Прописал сжатие не FormClose, а в FormDestroy
И работает все отлично, без ошибок.
Всем Большое спасибо!

Последний раз редактировалось yorri; 13.02.2018 в 22:42.
yorri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файл базы данных Access alcatraz_kms C# (си шарп) 1 15.10.2017 11:16
C++ Базы данных. Экспорт данных из access в существующий шаблон word hunter24 Помощь студентам 1 07.11.2016 18:35
Базы данных Access в Delphi Shaggrath Помощь студентам 2 22.04.2012 07:15
Базы данных access schwartz Помощь студентам 2 13.12.2011 01:42
Базы данных в access Ruska882009 Помощь студентам 2 13.02.2009 21:55