Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
ВнизБаза встроена в EXE Найти похожие ветки
← →
kyn66 © (2006-03-31 11:30) [0]Уважаемые коллеги! Один человек написал программу используя в качестве механизма Advantage Local Server. Если раньше базы с индексами лежали на диске, то теперь у него программа состоит из одного ЕХЕ-шника и ессно библиотек этого самого ADS. Каким образом он смог вставить базу в программу? По ресурсам видно, что имена таблиц, поля и т.д. в программе есть. Но данные где?
← →
Sergey13 © (2006-03-31 11:45) [1]У Advantage вроде можно работать с каким то собственным форматом баз. Может это тот случай? Пошукай среди "библиотек этого самого ADS" - может это и не библиотеки вовсе.
← →
Плохиш © (2006-03-31 12:35) [2]
> kyn66 © (31.03.06 11:30)
> Если раньше базы с индексами лежали на диске, то теперь
> у него программа состоит из одного ЕХЕ-шника и ессно библиотек
> этого самого ADS.
В таком случае запусти эту программу на компьтере, где она ещё ни разу не инсталлировалась.
Если будет работать, то выкладывай её куда-нибуть. У АДС о такой возможности не написано.
← →
kyn66 © (2006-03-31 13:12) [3]> Плохиш
Не совсем понятен ход мысли. Что и куда выкладывать? Первое, что пришло в голову, так это распаковка на диск баз из программу в некую временную папку. После завершения работы - убрка базы с диска. Я отслеживал всякими прогами - ничего никуда не распаковывается. Т.е. базы как-бы внутри ЕХЕ-шника. Да и по ресурсам ничего конкретно не видно. Ведь если я звук вкладываю в прогу - расковыряв ресурсы, я это увижу. А тут какая-то мистика вааще. КУда деются 50 метров данных ???
← →
Сергей М. © (2006-03-31 13:16) [4]
> базы как-бы внутри ЕХЕ-шника
Ну а что тут удивительного ?
лежат эти самые "базы" там. предположим, в кач-ве каких-то ресурсов, по необходимости грузятся в память, и СУБД-движок работает непосредственно с их образами в памяти ... При этом все выполненные изменения исчезают после завершения работы приложения ..
← →
Sergey13 © (2006-03-31 13:22) [5]2[3] kyn66 © (31.03.06 13:12)
> КУда деются 50 метров данных ???
А размер EXE-шника какой?
← →
kyn66 © (2006-03-31 13:45) [6]> 13 метров
← →
kyn66 © (2006-03-31 13:46) [7]А чем можно отловить, что грузится в память?
← →
Сергей М. © (2006-03-31 13:53) [8]Для начала убедись, что приложение действительно модифицирует базу и при новом сеансе запуска работает уже с модифицированными в предыдущем сеансе данными.
← →
kyn66 © (2006-03-31 14:29) [9]Дело в том, что данные в этой проге не модифицируются, только отображается готовый справочный набор.
← →
ANB © (2006-03-31 15:05) [10]
> kyn66 © (31.03.06 14:29) [9]
> Дело в том, что данные в этой проге не модифицируются, только
> отображается готовый справочный набор.
Эти справочники тогда при желании он вообще мог в массивы запихать.
А зачем их выковыривать ?
← →
kyn66 © (2006-03-31 15:14) [11]Да не нужно их выковыривать. Просто и я так хочу сделать, тока не знаю как. А насчет массивов... Мне каацца занатта будет делать массивы по 500000 записей, да несколько.... ;-)
← →
Сокол © (2006-03-31 15:44) [12]> kyn66 © (31.03.06 15:14)
Это не столь сложно, как кажется. Просто разово пишется средство генерации нужного исходного кода, которое читает данные из старой БД, оформляет их в виде паскалевского массива,или, если нужно, пишет процедуру его заполнения, чтобы нельзя было их в 16-тиричном редакторе изменить (имею в виду - выловить в ехе-шнике), после чего все это оформляется в структуру простого Дельфёвского юнита, добавляется в проект, компилируется, и, - вуаля, БД в ехе-файле программы.
← →
kyn66 © (2006-03-31 16:03) [13]> Сокол
И что тогда, в процессе инициализации, таблицы заполняются значениями из массивов и работаем как с обычными данными? А как с полями быть? Получается, что
кол-во массивов = Кол-во_таблиц * кол-во_полей_в_каждой_таблице ???
Но эти массивы, хоть как-то должны быть видны в ресурсах?
← →
Сокол © (2006-03-31 16:21) [14]> 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;
Ну и в том же духе.
Так ты полуишь файл юнита с готовым и заполненным справочником из БД
← →
Сергей М. © (2006-03-31 16:30) [15]
> kyn66 © (31.03.06 16:03) [13]
Если ты расчитываешь работать с таблицами той самой БД с использованием TDataSet-интерфейса, то разумным будет использование класса TClientDataSet, и , соответственно, хранение в ресурсах твоего РЕ-модуля табличных данных в формате, генерируемом средствами метода TClientdataset.SaveToStream.
После старта приложения в этом случае следует создать объект TResourceStream, который прочитает из соотв.ресурса РЕ-модуля данные, требуемые для работы TClientDataSet, после чего ты грузишь эти данные в TClientDataSet вызовом его метода LoadFromStream().
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c