Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

База встроена в EXE [D7, ADS]


kyn66 ©   (2006-03-31 11:30:00) 

Уважаемые коллеги! Один человек написал программу используя в качестве механизма Advantage Local Server. Если раньше базы с индексами лежали на диске, то теперь у него программа состоит из одного ЕХЕ-шника и ессно библиотек этого самого ADS. Каким образом он смог вставить базу в программу? По ресурсам видно, что имена таблиц, поля и т.д. в программе есть. Но данные где?


Сергей М.   (2006-03-31 16:30:00) [1]


> kyn66 ©   (31.03.06 16:03) [13]


Если ты расчитываешь работать с таблицами той самой БД с использованием TDataSet-интерфейса, то разумным будет использование класса TClientDataSet, и , соответственно, хранение в ресурсах твоего РЕ-модуля табличных данных в формате, генерируемом средствами метода TClientdataset.SaveToStream.

После старта приложения в этом случае следует создать объект TResourceStream, который прочитает из соотв.ресурса РЕ-модуля данные, требуемые для работы TClientDataSet, после чего ты грузишь эти данные в TClientDataSet вызовом его метода LoadFromStream().


Сокол   (2006-03-31 16:21:00) [2]

> kyn66 ©   (31.03.06 16:03)
Нет, не видны.
Объясню еще раз.
Пишешь программу, создающую обыкновенный Unit со его стандартной стр-рой, естественно.
Далее, программа создает  элемент типа record, а далее - массив элементов этого типа. Например вот так :
TMyRec = record
 Обявляешь эл-ты и их типа как нужно для одной записи в исодной БД
end;
Далее объявляешь
RexArr = array[0..Кол-во записей в таблице БД]

Далее, в прогшрамме генерации кода, вытаскивешь данные из БД и формируешь по ним код для процедуры инициализации массива в создаваемом юните.
Например так (это пишешь в программе генрации юнита):
AssignFile(F,'Unit1.pas'')
Reset(f);
 i := 0;
MyQuery.Open;
while not MyQuery.Eof do
   begin
    Writeln(f,' RexArr[' + IntToStr(i)+'].Поле1 := ' + '''' + MyQuery.Fields[1].AsString + '''';
     MyQyery.Next;
      Inc(i)
    end;

Ну и в том же духе.
Так ты полуишь файл юнита с готовым и заполненным справочником из БД


kyn66   (2006-03-31 16:03:00) [3]

> Сокол
И что тогда, в процессе инициализации, таблицы заполняются значениями из массивов и работаем как с обычными данными? А как с полями быть? Получается, что

 кол-во массивов = Кол-во_таблиц * кол-во_полей_в_каждой_таблице ???

Но эти массивы, хоть как-то должны быть видны в ресурсах?


Сокол   (2006-03-31 15:44:00) [4]

> kyn66 ©   (31.03.06 15:14)
Это не столь сложно, как кажется. Просто разово пишется средство генерации нужного исходного кода, которое читает данные из старой БД, оформляет их в виде паскалевского массива,или, если нужно, пишет процедуру его заполнения, чтобы нельзя было их в 16-тиричном редакторе изменить (имею в виду - выловить в ехе-шнике), после чего все это оформляется в структуру простого Дельфёвского юнита, добавляется в проект, компилируется, и, - вуаля, БД в ехе-файле программы.


kyn66   (2006-03-31 15:14:00) [5]

Да не нужно их выковыривать. Просто и я так хочу сделать, тока не знаю как. А насчет массивов... Мне каацца занатта будет делать массивы по 500000 записей, да несколько.... ;-)


ANB   (2006-03-31 15:05:00) [6]


> kyn66 ©   (31.03.06 14:29) [9]
> Дело в том, что данные в этой проге не модифицируются, только
> отображается готовый справочный набор.

Эти справочники тогда при желании он вообще мог в массивы запихать.

А зачем их выковыривать ?


kyn66   (2006-03-31 14:29:00) [7]

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


Сергей М.   (2006-03-31 13:53:00) [8]

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


kyn66   (2006-03-31 13:46:00) [9]

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


kyn66   (2006-03-31 13:45:00) [10]

> 13 метров


Sergey13   (2006-03-31 13:22:00) [11]

2[3] kyn66 ©   (31.03.06 13:12)
>  КУда деются 50 метров данных ???
А размер EXE-шника какой?


Сергей М.   (2006-03-31 13:16:00) [12]


> базы как-бы внутри ЕХЕ-шника


Ну а что тут удивительного ?
лежат эти самые "базы" там. предположим, в кач-ве каких-то ресурсов, по необходимости грузятся в память, и СУБД-движок работает непосредственно с их образами в памяти ... При этом все выполненные изменения исчезают после завершения работы приложения ..


kyn66   (2006-03-31 13:12:00) [13]

> Плохиш
Не совсем понятен ход мысли. Что и куда выкладывать? Первое, что пришло в голову, так это распаковка на диск баз из программу в некую временную папку. После завершения работы - убрка базы с диска. Я отслеживал всякими прогами - ничего никуда не распаковывается. Т.е. базы как-бы внутри ЕХЕ-шника. Да и по ресурсам ничего конкретно не видно. Ведь если я звук вкладываю в прогу - расковыряв ресурсы, я это увижу. А тут какая-то мистика вааще. КУда деются 50 метров данных ???


Плохиш   (2006-03-31 12:35:00) [14]


> kyn66 ©   (31.03.06 11:30)
> Если раньше базы с индексами лежали на диске, то теперь
> у него программа состоит из одного ЕХЕ-шника и ессно библиотек
> этого самого ADS.

В таком случае запусти эту программу на компьтере, где она ещё ни разу не инсталлировалась.
Если будет работать, то выкладывай её куда-нибуть. У АДС о такой возможности не написано.


Sergey13   (2006-03-31 11:45:00) [15]

У Advantage вроде можно работать с каким то собственным форматом баз. Может это тот случай? Пошукай среди "библиотек этого самого ADS" - может это и не библиотеки вовсе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо