Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 13.02.2018, 00:06   #1
yorri
Пользователь
 
Регистрация: 17.04.2015
Сообщений: 19
Репутация: 10
По умолчанию 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 вне форума   Ответить с цитированием
Старый 13.02.2018, 00:24   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,753
Репутация: 6211
По умолчанию

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

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

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

Сделал програмное подключение.
Код:

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 в 02:58.
yorri вне форума   Ответить с цитированием
Старый 13.02.2018, 10:09   #5
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,753
Репутация: 6211
По умолчанию

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

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

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

ADOConnection1.Connected := True;

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

ADOTable1.Connection:=ADOConnection1;  // а надо бы использовать "старое" подключение
.....

и сделать это лучше до запуска программы( т.е. при проектировании форм) в ObjectInspector
__________________
программа — запись алгоритма на языке понятном транслятору

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

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:

ADOConnection1.Connected := True;

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

ADOTable1.Connection:=ADOConnection1;  // а надо бы использовать "старое" подключение
.....

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

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

Цитата:
Сообщение от 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 в 23:42.
yorri вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


17:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru