![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO [D6, MSAccess]
BAYES © (2004-03-10 10:28:00)Привет!
Возник вопрос по сжатию(упаковки) *.mdb, а то что-то БД жутко разростаеться.
Поискал на других форумах, многие советуют создавать новый *.mdb и копировать туда данные. Imho это бред.
Может есть что-то вроде PackTable, но только для *.mdb???
sniknik (2004-03-10 13:52:00) [1]> Немного для себя упрастил.
вот это забыл
je:= Null;
а оно очень желательно (если больше с обьектом работать не будеш надо завершить), у меня оно даже в finally вынесено (отработает даже если выше случится глюк, делай так же).
про переименовку вроде уже прояснили, у меня в один каталг т.к. имя новое задается NewBase$$$.Mdb (то которого у меня точно не зададут, в принципе можно любое даже $$$.$$$) после переименовывается, а в тот же самый файл не пакуется файлы должны физически разными быть (нельзя новое и старое имя одно и тоже).
VLAD-MAL (2004-03-10 12:54:00) [2]DatabaseName = "db1.mdb"
''Закрыть БД
Db.Close
Screen.MousePointer = vbHourglass
''Сжать БД
DBEngine.CompactDatabase App.Path & "\" & CommonDatabaseName, App.Path & "\" & CommonDatabaseName & "_"
''Удалить старый файл и переименовать новый
Kill App.Path & "\" & DatabaseName
Name App.Path & "\" & DatabaseName & "_" As App.Path & "\" & DatabaseName
Screen.MousePointer = vbDefault
SPIRIT (2004-03-10 12:48:00) [3]Сжимает в новый
удаляет старый
переименовывает новый в старый..
делай также
DeleteFile('c:\data\db.mdb');
RenameFile('c:\data\1\db.mdb', 'c:\data\db.mdb');
BAYES (2004-03-10 12:43:00) [4]Да, вопросы по принципу.
Немного для себя упрастил.
var je: Variant;
old,new: string;
begin
old:='c:\data\db.mdb';
new:='c:\data\1\db.mdb';
DM.ADOConnection1.Close;
je:=CreateOleObject('JRO.JetEngine');
je.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+old+';',
'Provider=Microsoft.Jet.OLEDB.4.0;'
+'Data Source='+new+';');
Но это только если сжатие происходит в др. каталог.
В твоем коде как раз и предусматриваеться что бы сжатие происходило в одном каталоге. Но что-то не в силах высматреть его. Не затруднит тебя пояснить код?!
sniknik (2004-03-10 12:05:00) [5]> sniknik - твой код добавил больше вопросов чем ответов.
это из программы, "лишнее" убрать думаю не проблема.
не работает? то что? или просто вопросы по "принципу", ну так спрашивай.
BAYES (2004-03-10 11:48:00) [6]Пасиба, но я это(MSAccess) все знаю, мне как говориться программно. Вот разбираюсь с многоуважаемым sniknik.
sniknik - твой код добавил больше вопросов чем ответов.
YurikGl (2004-03-10 11:19:00) [7]А еще там есть галочка,"сжимать базу при закрытии"
sniknik (2004-03-10 10:34:00) [8]
function TDMod.PackAccess(BaseName: string): boolean;
var je: Variant;
sPath: string;
begin
result:= false;
if UpperCase(Copy(BaseName, Length(BaseName)-3, 4)) <> '.MDB' then BaseName:= BaseName + '.MDB';
if Pos(':\',BaseName) = 0 then BaseName:= GetCurrentDir+'\'+BaseName;
sPath:= ExtractFilePath(BaseName);
try
try
ADOConnection1.Close;
ADOConnection2.Close;
je:=CreateOleObject('JRO.JetEngine');
je.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+BaseName+';',
'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+sPath+'NewBase$$$.Mdb;'+
'Jet OLEDB:Encrypt Database=True');
DeleteFile(BaseName);
RenameFile(sPath+'NewBase$$$.Mdb', BaseName);
result:= true;
except
on E: Exception do DoIfError(E.Message);
end;
finally
je:= Null;
end;
end;
Я (2004-03-10 10:31:00) [9]1. Самое простое- воспользоваться MS Access (монопольно). Сервис - Служебные программы - Сжать и восстановить базу данных.
2. DAO