Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

удалить и создать БД   Найти похожие ветки 

 
ыавпып   (2007-06-04 14:48) [0]

здраствуйте. подскажите пожалуйста как программно создать и удалить файл БД MSAccess? я так понимаю удалить можно просто вызвав DeleteFile? А вот как создать его?


 
Megabyte ©   (2007-06-04 14:55) [1]

Можно создать файл с расширением .mdb


 
Elen ©   (2007-06-04 15:00) [2]


> А вот как создать его?

А там же поля ты какие-то предполагаешь? или ты не имееш ввиду "создать базу"?


 
Anatoly Podgoretsky ©   (2007-06-04 15:02) [3]

Вопрос смутный, сначала про удаление и создание БД, а в сообщение уже речь идет об файлах.


 
ыавпып   (2007-06-04 15:23) [4]

наверное я непонятно объяснил, у меня есть БД которая сидит в файле glav.mdb, там есть таблицы, но самая главная это main_table, мне нужно удалить сам файл glav.mdb, и потом создать заново этот glav.mdb с таблицей main_table...
вопрос возник после вот этой темы http://delphimaster.net/view/2-1180444247/ теперь пытаюсь воплотить совет в жизнь...

> Megabyte

так к сожалению не получается: "неизвестный формат базы данных"...


 
Elen ©   (2007-06-04 15:29) [5]


> "неизвестный формат базы данных"

Естесственно. Ты создал файл, но не создал базу. Создай на Аксесе glav_null.mdb с нужными тебе таблицами и скопируй его в  glav.mdb. Потом если захочеш удалить  glav.mdb просто проведи копирование пустышки glav_null.mdb в glav.mdb. т.е. работать с созданным тобой "шаблоном базы"


 
Anatoly Podgoretsky ©   (2007-06-04 15:31) [6]

Зачем удалять БД и потом снова ее создавать, она уже создана


 
DVM ©   (2007-06-04 15:32) [7]

Причем пустышку можно вообще хранить в ресурсах программы если хочется.


 
ыавпып   (2007-06-04 15:37) [8]


> Anatoly Podgoretsky
просто данных много она становится очень можно так сказать емкой, а данные должны храниться только 10 дней, а если удалять таблицы то размер файла БД не уменьшается, а со временем например будет 50 таблиц а сам файл будет весить сотни мегабайт как будто у меня там миллион таблиц...


> DVM
а можете рассказать или дать ссылку как это делать?


 
DVM ©   (2007-06-04 15:40) [9]


> а если удалять таблицы то размер файла БД не уменьшается,

А выполнить стандартное сжатие не судьба?


 
DVM ©   (2007-06-04 15:41) [10]


{ **** UBPFD *********** by delphibase.endimus.com ****
>> Программное сжатие базы данных Access используя JRO (Jet Replication Objects)

Процедура позволяет сжать базу данных в формате Access,
используя JRO (Jet Replication Objects). Действие аналогичное
пункту меню в Access "Сервис -> Служебные программы ->
Сжать и восстановить базу данных".
Параметры:
* DatabaseName - путь к исходной (не сжатой) базе данных
* DestDatabaseName - путь к сжатой базе данных
(по умолчанию пустой - в этом случае исходная база заменяется сжатой)
* Password - пароль базы данных (по умолчанию пустой)

PS. этот код был написан в связи с тем что аналогичная процедура
через DAO у многих не работала (по пока неизвестным для меня причинам)

Зависимости: windows,SysUtils,ComObj,Dialogs (Dialogs можно исключить
используя MessageBox для вывода сообщения исключительной ситуации)
Автор:  savva, savva@nm.ru, ICQ:126578975, Орел
Copyright: Сапронов Алексей (Savva)
Дата:  9 сентября 2002 г.
***************************************************** }

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;
Пример использования:


...
db.Close;
CompactDatabase_JRO("c:\database.mdb",
"c:\Archiv\database_pack.mdb", "password");
db.open;
...



 
Sergey13 ©   (2007-06-04 15:46) [11]

> [9] DVM ©   (04.06.07 15:40)
> А выполнить стандартное сжатие не судьба?

А смысл? Что бы потом опять место выделять?

> [8] ыавпып   (04.06.07 15:37)

Че то ты напроектировал странного, ИМХО? Откуда таблицы плодятся? Что за предметная область?


 
Elen ©   (2007-06-04 15:51) [12]

А вот у меня вопрос на засыпку : В Фоксе есть специально предназначенная команда ZAP которая опустошает базу (ее таблицы), соответственно размер файла уменьшается. Я знаю что есть метод EmptyTable он должен это делать. Разве в Аксесе такого нет?


 
ыавпып   (2007-06-04 16:02) [13]


> Sergey13
просто практически каждую секунду круглосуточно будут добавляться запись, причем еще там по времени определяется когда и что, отсюда и таблиц так много... я конечно понимаю что структура базы данной у меня не идеальна, но я просто лучше ничего придумать не смог... наверное потому что с бд, начал работать буквально накануне...
вообщем [10] реально помогло, спасибо DVM...


 
Sergey13 ©   (2007-06-04 16:18) [14]

> [13] ыавпып   (04.06.07 16:02)

При такой нагрузке сжимать файл точно ни к чему. Просто будет тратиться дополнительное время на выделение дискового пространства в следующий раз при нехватке места. Просто прибивай периодически данные (если они не нужны) в таблицах (или сами таблицы, если они динамически содаются) и все.


 
Anatoly Podgoretsky ©   (2007-06-04 16:31) [15]

Я не уверен, что Акцесс повторно использует место.


 
Sergey13 ©   (2007-06-04 16:34) [16]

> [15] Anatoly Podgoretsky ©   (04.06.07 16:31)

Что, серьезно? Он работает как DBase - просто помечает и все?


 
DVM ©   (2007-06-04 16:35) [17]


> Он работает как DBase - просто помечает и все?

да


 
Sergey13 ©   (2007-06-04 16:41) [18]

> [17] DVM ©   (04.06.07 16:35)

Аксес пал в моих глазах. 8-)

> [13] ыавпып   (04.06.07 16:02)

Тогда мои советы - ф топку. 8-)


 
Anatoly Podgoretsky ©   (2007-06-04 18:25) [19]

> Sergey13  (04.06.2007 16:34:16)  [16]

Я же написал, что не уверен, но мои наблюдения показывают, что это так и размер будет расти не только после вставки/удаления, но и при простом редактирование записи.
Акцесс делает безопасную "транзакцию" - сначала создается копия, потом удаляется старая запись, за счет этого очень высокая живучесть для файл-серверной БД

Но я не могу документировано это подтвердить.


 
Anatoly Podgoretsky ©   (2007-06-04 18:27) [20]

> Sergey13  (04.06.2007 16:41:18)  [18]

А зря, они сумели создать живучею БД.
Меня другое не устраивает - это очень жидкий набор функций при работе через JET
В самом Акцесс набор функций великолепный, но это все VBA


 
DVM ©   (2007-06-04 22:35) [21]


> Меня другое не устраивает - это очень жидкий набор функций
> при работе через JET

А меня не устраивает 2 Гб ограничение на файл. Откуда это глупое ограничение?


 
Anatoly Podgoretsky ©   (2007-06-05 00:01) [22]

> DVM  (04.06.2007 22:35:21)  [21]

Fat + Int32


 
DVM ©   (2007-06-05 00:03) [23]


> Fat + Int32

Ну это дела файловой системы. Почему я могу создать файл больше двух гиг, а акцесс до текущей версии так и не научилась?


 
Anatoly Podgoretsky ©   (2007-06-05 01:02) [24]

> DVM  (05.06.2007 00:03:23)  [23]

Преемственность и никто не будет переводить на 64 битную математику. Кроме того Акцесс должен работать и на Win9x где это физическое ограничение.


 
Zesik ©   (2007-06-05 02:14) [25]

слушай а попробуй использовать другую СУБД
вот например на SQL severe элементарно удалять каждые 10 дней твои таблицы и создавать новые, а если напишешь тригер,тогда база вообще будет работать без твоего вмешательства


 
ыавпып   (2007-06-05 09:48) [26]


> Zesik

я с access только разобрался, а с SQL Server, я даже не знаю как работать, да и нету его у меня, я даже не знаю как там БД создать, никогда не работал с БД, а тут пришлось, если можно саму БД создать программно(т.е. файл) без установки дистриба MSSQL то можно попробовать с ней поработать... но тогда я попрошу помощи, как создать эту БД программно? или не стоит и рыпаться?


 
ЮЮ ©   (2007-06-05 10:02) [27]

не стоит и рыпаться.
Ибо SQL Server - это прежде всего сервер. Его и прсят создать и базу, и таблицы в ней, и записи в них. И без дистриба не обойтись :)


 
Anatoly Podgoretsky ©   (2007-06-05 10:02) [28]

> ыавпып  (05.06.2007 09:48:26)  [26]

Без установки движка нельзя, ни с MSSQL, ни с access
Движок бесплатно раздает Микрософт
Создавать базу почти везде одинаково - CREATE DATABASE name


 
crypt ©   (2007-06-05 14:40) [29]

Удалено модератором


 
DVM ©   (2007-06-05 15:17) [30]


> А как сделать, что бы из  Memo все переводилось в БД?

как это


 
crypt ©   (2007-06-05 15:23) [31]

Удалено модератором


 
Sergey13 ©   (2007-06-05 15:37) [32]

> [31] crypt ©   (05.06.07 15:23)

А это обязательно спрашивать в конце чужого, накак не связанного с твоим вопросом, топика?


 
crypt ©   (2007-06-05 15:52) [33]

Это же вопрос по БД! У меня спросили "как это" - я ответил!!!



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
2-1181184636
D@Nger
2007-06-07 06:50
2007.07.01
Обмен данными между родительским MDI и дочерними


15-1180355653
Vendict
2007-05-28 16:34
2007.07.01
Разыскивается антивирус


15-1180936975
G_M_S
2007-06-04 10:02
2007.07.01
Сессия...


15-1180528252
homm
2007-05-30 16:30
2007.07.01
DOS атака


15-1180798178
Иксик
2007-06-02 19:29
2007.07.01
Парк советского периода