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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2017, 18:05   #1
hy5
 
Регистрация: 09.12.2009
Сообщений: 3
По умолчанию Как загрузить базу SQLite из TStream?

Здравствуйте!
Я использую Delphi XE и обрабатываю локальный файл SQLite 3 с помощью FireDAC:

Код:
  ADConnection1.Close;
  ADConnection1.Params.Clear;
  ADConnection1.Params.Add('DriverID=SQLite');
  ADConnection1.Params.Add('Database=C:\My_db');
  ADConnection1.Open;
  ADConnection1.GetTableNames('', '', '', ListBox1.Items);
Однако мне надо читать базу, которая находится не в локальном файле ('C:\My_db'), а в TMemoryStream.
Подскажите, возможно ли это?

Сейчас я реализовал эту возможность через перехват функций: когда FireDac пытается прочитать файл на жестком диске, я ему "подсовываю" TStream.
Однако работатет через раз...

Возможно посоветуете другой компонент, который может читать базу из TStream?

P.S. Сохранить TStream в файл нельзя. Надо читать прямо из потока.
hy5 вне форума Ответить с цитированием
Старый 26.07.2017, 00:40   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

FireDac постоянно дорабатывается, попробуйте взять более свежую версию
Black Fregat вне форума Ответить с цитированием
Старый 27.07.2017, 15:47   #3
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от hy5 Посмотреть сообщение
Здравствуйте!
Я использую Delphi XE и обрабатываю локальный файл SQLite 3 с помощью FireDAC:

Код:
  ADConnection1.Close;
  ADConnection1.Params.Clear;
  ADConnection1.Params.Add('DriverID=SQLite');
  ADConnection1.Params.Add('Database=C:\My_db');
  ADConnection1.Open;
  ADConnection1.GetTableNames('', '', '', ListBox1.Items);
Однако мне надо читать базу, которая находится не в локальном файле ('C:\My_db'), а в TMemoryStream.
Подскажите, возможно ли это?

Сейчас я реализовал эту возможность через перехват функций: когда FireDac пытается прочитать файл на жестком диске, я ему "подсовываю" TStream.
Однако работатет через раз...

Возможно посоветуете другой компонент, который может читать базу из TStream?

P.S. Сохранить TStream в файл нельзя. Надо читать прямо из потока.
На мой взгляд задачу не верно поставил, а в чём сложность? Зачем грузить файл откуда-то потом его читать или ты работаешь с паролями браузеров?
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 27.07.2017, 19:05   #4
hy5
 
Регистрация: 09.12.2009
Сообщений: 3
По умолчанию

Просто не стал подробно описывать, чтобы не вводить в заблуждение...
Занимаюсь восстановлением удаленных файлов. Задача: просмотр удаленного файла SQLite. Т.е. файла физически на диске нет, но я могу передавать компоненту его содержимое.
То есть мне нужен компонент который поддерживает что-то типа
OnGetFileSize
OnReadFile(const Start, Size; var Buffer)
Ну или компонент, который не использует DLL, а имеет полностью открытый код, чтобы я мог добраться до чтения файла и добавить туда свои процедуры.
hy5 вне форума Ответить с цитированием
Старый 27.07.2017, 21:41   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

я бы проанализировал какие winapi функции использует компонент скорее всего банальные CreateFile и Read/WriteFile и сделал бы их сплаисинг...
ключевое слово сплайсинг, т.е. подмена стандартных функций на свои...
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 27.07.2017 в 21:43.
Slym вне форума Ответить с цитированием
Старый 27.07.2017, 22:46   #6
hy5
 
Регистрация: 09.12.2009
Сообщений: 3
По умолчанию

Slym, большое спасибо за совет!
Я так и делаю, перехватываю функции и подменяю их:
CreateFileW
CloseHandle
SetFilePointer
ReadFile
GetFileSize

С другими компонентами работает отлично. FireDAC вроде тоже других функций не использует (я проверял через API Monitor). Однако с ним возникла такая проблема:
сначала все работает отлично. Потом я просто подключаю к проекту какой-либо юнит (причем в любом месте проекта) и начинаются чудеса. Например в Uses подключаю стандартный DateUtils и FireDAC начинает материться, что файл БД испорчен и не читается. Комментирую использование DateUtils - перехват снова работает.
Я так понимаю что эти "чудеса" появляются из-за проблем с памятью, видимо я где-то накосячил с перехватом...
Найти проблему так и не смог (да и, честно говоря, даже представления не имею как такое странное поведение отследить). Вот и начал искать другой компонент, чтобы обойтись без перехвата...

Последний раз редактировалось hy5; 27.07.2017 в 22:54.
hy5 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как источником данных сделать базу sqlite в visual studio jasis C# (си шарп) 0 05.07.2016 00:13
Некорректная вставка в базу, SQLite poroshin PHP 10 05.02.2014 22:46
Не могу загрузить кириллицу в SQLite АлМазСофт БД в Delphi 0 12.09.2013 12:54
Как загрузить в базу данных MySQL таблицу ? pufystyj PHP 4 19.02.2011 20:18
Можно ли загрузить IXMLDOMDocument из TStream NieL Общие вопросы Delphi 2 26.11.2010 20:48