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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2007, 13:27   #1
Кот из Лета
 
Аватар для Кот из Лета
 
Регистрация: 26.12.2007
Сообщений: 6
По умолчанию уменьшить размер БД MS Access

Подскажите пожалуйста, можно ли какими либо средствами уменьшить размер БД MS Access? Разница между dBase и Access с одинаковыми данными примерно раз в 10 не в пользу последнего.
Кот из Лета вне форума Ответить с цитированием
Старый 29.12.2007, 04:38   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Нет, нельзя. Да бессмысленно это. Здесь совершенно разные подходы к организации БД. И, кстати, обрати внимание на тот факт, что файл с таблицей dBase увеличивается с каждой новой записью, а в Access это не так. Здесь эффект от страничной организации БД.
Баламут вне форума Ответить с цитированием
Старый 29.12.2007, 16:22   #3
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Сервис-> сжать и востановить
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 29.12.2007, 17:01   #4
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Если тебе нужно программно єто сделать, то вот код....:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function razmer_of_file:string;
var f:TFileStream;
    razmer:int64;
    full_path:string;
begin
 try
  full_path:=ExtractFileDir(Application.ExeName)+'\'+Form1.Edit1.Text;
  f:=TFileStream.Create(full_path,fmOpenRead);
 except
  ShowMessage('Такой файл не существует!');
  exit;
 end;
 razmer:=f.Size;
 f.Free;
 Result:=IntToStr(razmer)+' байт';
end;

procedure CompactDatabase(DatabaseName: string; Password: string = '');
const
 Provider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
 TempFile='temp.mdb';
var
 FullTempFileName: string;
 Src, Dest: WideString;
 V: Variant;
begin
 try
   Src := Provider + 'Data Source=' + DatabaseName;
   if DatabaseName='' then
   begin
    ShowMessage('Не указано имя базы данных, выполнение процедуры приостановленно.');
    exit;
   end;

   FullTempFileName := ExtractFileDir(Application.ExeName)+'\'+TempFile;

   // Этот файл не должен существовать 
   DeleteFile(PChar(FullTempFileName));
   Dest := Provider + 'Data Source=' + FullTempFileName;

   if Password <> '' then
   begin
     Src := Src + ';Jet OLEDBatabase Password=' + Password; 
     Dest := Dest + ';Jet OLEDBatabase Password=' + Password; 
   end; 

   V := CreateOleObject('jro.JetEngine');
   try
     V.CompactDatabase(Src, Dest); // сжимаем
   finally
     V := 0;
   end; 

     DeleteFile(PChar(DatabaseName)); // удаляем не упакованную базу
     RenameFile(FullTempFileName, DatabaseName); //  переименовываем упакованную базу

 except 
   // выдаем сообщение об исключительной ситуации 
   on E: Exception do
     ShowMessage(e.message);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Enabled:=false;
 Label3.Caption:= razmer_of_file;
 CompactDatabase(Edit1.Text);
 Label5.Caption:= razmer_of_file;
 Button1.Enabled:=true;
end;

end.
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 29.12.2007, 17:37   #5
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Хранить данные в разных таблицах, не пихать в таблицу тяжелую информацию.
Alar вне форума Ответить с цитированием
Старый 29.12.2007, 21:20   #6
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
Хранить данные в разных таблицах, не пихать в таблицу тяжелую информацию.
ну, человек спросил, я ответил... С базой работают юзера в большенстве случаев... И контролировать информацию,которую они вводят , очень сложно. Т.ч с такой проблемой мы часто встречаемся
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 30.12.2007, 02:32   #7
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Цитата:
Сообщение от Pitbull Посмотреть сообщение
Сервис-> сжать и востановить
И все-таки я настаиваю, уменьшить нельзя. С таким же успехом можно и в dbf-файле физически удалить записи, которые, как известно, лишь помечаются как удаленные. При прочих равных условиях (создать идентичные базы dBase и Access с нуля, абсолютно чистые) база Access будет больше. И тому есть причина, которую в общем-то я назвал. Сжатие и восстановление помогут лишь после интенсивной работы с базой, а именно в том случае, если оттуда удалялось много записей.
Баламут вне форума Ответить с цитированием
Старый 30.12.2007, 13:51   #8
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
И все-таки я настаиваю, уменьшить нельзя. С таким же успехом можно и в dbf-файле физически удалить записи, которые, как известно, лишь помечаются как удаленные. При прочих равных условиях (создать идентичные базы dBase и Access с нуля, абсолютно чистые) база Access будет больше. И тому есть причина, которую в общем-то я назвал. Сжатие и восстановление помогут лишь после интенсивной работы с базой, а именно в том случае, если оттуда удалялось много записей.

Попробуйте проделать описанное мной віше... И сравните размер, которій біл до сжатия и после... У меня сжимает в 2 раза...
в том то и дело, что и в access записи не удаляются , а помечаются на удаление... И как и в dbf они остаются в базе до тех пор , пока ві не віполните сжатие.... Тоесть другими словами сжатие - єто удаление помеченніх на удаление записей...
Я изложил свои місли так , как єто понимаю я... Есть модераторі, которіе могут меня поправить...
Такой же принцип и в dbf , после сжатия все помеченніе на удаление записи удаляться...
как подтверждение инфа из хелпа БДФ: dBASE or FoxPro: dBASE and FoxPro let users mark a record for deletion (as opposed to actually removing it from the table). The only way to permanently remove marked records is with DbiPackTable.

Или можно произвести єкспорт, тогда помеченніе на удаление данніе не конвертируются в новую базу.... Єто как вариант...
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 30.12.2007 в 14:08.
Pitbull вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как уменьшить размер .ехе файла? D7 dx+ Общие вопросы Delphi 28 16.03.2012 20:38
Как уменьшить размер PNG изображения? highklass Мультимедиа в Delphi 5 31.05.2008 16:24
Как изменить размер пакетов чтобы уменьшить исходящий трафик lubopit Операционные системы общие вопросы 1 21.02.2008 18:09
Уменьшить высоту картинки Domovoy Общие вопросы Delphi 1 26.12.2007 14:05