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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2010, 03:28   #1
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
Вопрос Удаление информации из файлов .mb: почему не происходит?

У меня в таблице хранятся фотографии в blob-поле, при добавлении фотографии в таблицу создается в той же папке файл <table name>.mb где хранятся эти фото. При удалении записей из таблицы размер этого файла не уменьшается....в чем проблема?
Удаляю так(там три сендера - предпросмотр 3-х фото из базы):
Код:
procedure TNewEdit.DelFoto(Sender: TObject);
var i,ButtonSelect:integer;
begin
 ButtonSelect:=Application.MessageBox('Óäàëèòü ôîòîãðàôèþ?','Ôîòîãðàôèè',mb_IconQuestion+mb_YesNo+mb_TaskModal);
 if (ButtonSelect=idYes) then
  begin
   DMUnit.Foto.First;
   if Sender=DelFoto1 then
    begin
     Foto1.Picture.Bitmap.FreeImage;
     Foto1.Picture:=nil;
     i:=DMUnit.Foto.MoveBy(FotoScroll.Position-1);
     DMUnit.Foto.Delete;
     DMUnit.Foto.Refresh;
     FotoScrollClick(self,btNext);
    end;
   if Sender=DelFoto2 then
    begin
     Foto2.Picture.Bitmap.FreeImage;
     Foto2.Picture:=nil;
     i:=DMUnit.Foto.MoveBy(FotoScroll.Position);
     DMUnit.Foto.Delete;
     DMUnit.Foto.Refresh;
     FotoScrollClick(self,btNext);
    end;
   if Sender=DelFoto3 then
    begin
     Foto3.Picture.Bitmap.FreeImage;
     Foto3.Picture:=nil;
     i:=DMUnit.Foto.MoveBy(FotoScroll.Position+1);
     DMUnit.Foto.Delete;
     DMUnit.Foto.Refresh;
     FotoScrollClick(self,btNext);
    end;
  end;
end;
Ruschel вне форума Ответить с цитированием
Старый 24.02.2010, 07:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Размер не уменьшается скорее всего потому что при удалении физически записи не удаляются а просто помечаются как удаленные.
Я точно не помню но по-моему есть SQL команда, которая вычищает удаленные записи окончательно, но это зависит от провайдера
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.02.2010, 17:13   #3
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
По умолчанию

у меня локальная база данных на основе BDE. Без SQL. У меня правда все происходит в режиме CachedUpdates/ApplyUpdates. Я пробовал без этого - все равно не удаляется физически из файла. Кто знает как бороться? Фотки не мало место едят, а если еще и удаляться не будут....то база разрастется
Ruschel вне форума Ответить с цитированием
Старый 25.02.2010, 08:52   #4
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Ruschel Посмотреть сообщение
у меня локальная база данных на основе BDE. Без SQL. У меня правда все происходит в режиме CachedUpdates/ApplyUpdates. Я пробовал без этого - все равно не удаляется физически из файла. Кто знает как бороться? Фотки не мало место едят, а если еще и удаляться не будут....то база разрастется
Не удаляются потому, что размер блоб поля может быть очень значительным и физическое удаление данных и переписывание всего файла может закончиться плачевно для него. Поэтому разработчики поступают просто. Они дописывают новые (или измененные) данные конец файла и в основной таблице только меняют ссылку на них. В FoxPro, например, упаковка БД выполняется в эксклюзивном режиме командой PACK, кажется. Причем, паковать там нужно отдельно основную таблицу и отдельно файл с блоб полями.

Думаю в Access происходит нечто подобное. Вот, нарыл в Гугле функцию для упаковки Accessa:

Код:
{
here is a function i have made to compact and repair an access database.
exclusive access to the db is required!!
}

uses
comobj;

function compactandrepair(db: string): boolean; {db = path to access database}
var
v: olevariant;
begin
result := true;
try
v := createoleobject('jro.jetengine');
try
v.compactdatabase('provider=microsoft.jet.oledb.4.0;data source='+db,
'provider=microsoft.jet.oledb.4.0;data source='+db+'x;jet oledb:engine type=5');
deletefile(db);
renamefile(db+'x',db);
finally
v := unassigned;
end;
except
result := false;
end;
end;
------
PS: Хмм... а почему я решил, что это Access? Впрочем, суть предложения от этого не меняется.
В эксклюзивном режиме создаем новую таблицу. Переносим данные из старой таблицы в новую.
Удаляем старую таблицу. Переименовываем новую.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 25.02.2010 в 09:54. Причина: Постскриптум
Andrei вне форума Ответить с цитированием
Старый 25.02.2010, 09:22   #5
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Цитата:
у меня локальная база данных на основе BDE. Без SQL.
Какой формат самого файла базы ?
Или какой провайдер используешь для доступа к базе ?
В зависимости от этого есть команды о которых говорил Stilet.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему происходит сброс переменной password? NSvirus PHP 2 10.11.2009 16:07
Удаление повторной информации из таблиц paratruper17 Microsoft Office Word 8 03.11.2009 10:31
Form Region-почему так происходит Nester Общие вопросы Delphi 3 14.09.2009 21:16
При запуске старых файлов ничего не происходит, даже форма с кнопками не появляется UserOK Общие вопросы Delphi 6 13.05.2008 12:30
Почему так происходит? Zeraim Общие вопросы Delphi 1 05.05.2008 14:10