Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
SQLite

Как загрузить базу SQLite из TStream?

25.07.2017, 17:56. Показов 2536. Ответов 16

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

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

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

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

P.S. Сохранить TStream в файл нельзя. Надо читать прямо из потока.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2017, 17:56
Ответы с готовыми решениями:

Как загрузить 200K строк типа String в базу SQLite максимально быстро?
Ребят, можно ли загрузить 200K строк типа String в базу SQL LITE максимально быстро? Скажем за 1-5 минут? Это вообще реально? А то я...

Как открыть базу данных sqlite 3.x?
Программе надо получить историю из браузеров семейства Chromium. Все они хранят историю в файле History, который является базой sqlite....

Как вставить данные в базу sqlite
Ребят как сохранить в базу, данные с нескольких textviwer и одного spinner Помогите пожалуйста.

16
5967 / 4543 / 1094
Регистрация: 29.08.2013
Сообщений: 28,157
Записей в блоге: 3
25.07.2017, 22:05
Цитата Сообщение от hy5 Посмотреть сообщение
которая находится не в локальном файле, а в TMemoryStream.
а зачем?
0
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
25.07.2017, 22:10  [ТС]
Восстановление удаленных файлов. Т.е. файла физически на диске нет, но есть его содержимое в памяти (TStream). Записывать на диск тоже ничего нельзя. В данном случае файл (базу данных) надо проанализировать, а не просто сохранить...
Есть вариант разобраться со строением структуры SQLite и читать ее самому, добавляя в FireDAC, но ооочень надеюсь, что есть вариант проще и этого делать не прийдется. Как я и говорил, приветствуются любые компоненты по чтению SQLite.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.07.2017, 00:24
Так зачем же так все усложнять? С незапамятных времен в ОС можно создать рам-диск, записать на него все что вам нужно и работать как с обычным диском.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
26.07.2017, 01:28
Цитата Сообщение от Пытливый Посмотреть сообщение
Так зачем же так все усложнять? С незапамятных времен в ОС можно создать рам-диск, записать на него все что вам нужно и работать как с обычным диском.
Так тогда же у ТС смогут спереть его данные все кому не лень!
И кому больше делать нечего.
0
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
26.07.2017, 02:18  [ТС]
Спасибо за идею с РАМ, однако не все так просто. Про TStream я написал образно, чтобы не усложнять ситуацию и не отклоняться от темы. Конечно же я не гружу содержимое всего файла в ОЗУ. Сейчас я реализовал следующим образом: в кратце FireDAC обращается к файлу с желанием прочитать байты с 0 по 1023, например. Я перехватываю его попытки и загружаю в ОЗУ только первые 128 КБ содержимого файла и отдаю ему те, что нужны из этого сегмента, пока он просит из него. Позже загружаю следующую партию и отдаю оттуда и т.д. А если загружать весь файл, то про чтение больших БД можно забыть...
До этого со всеми компонентами и библиотеками, которые не поддерживают чтение из TStream я работал через перехват, однако с FireDAC он работает не стабильно, вот и ищу другой подход...
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
26.07.2017, 02:28
hy5, Геморрой наше всё?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
26.07.2017, 06:59
что за странное. таблицу еще можно вполне в память запихать. но базу...
для работы с таблицей в памяти есть FDMemTable
но в целом несколько бредово все выглядит
0
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
26.07.2017, 08:49  [ТС]
что за странное. таблицу еще можно вполне в память запихать. но базу...
для работы с таблицей в памяти есть FDMemTable
но в целом несколько бредово все выглядит
Вы невнимательно читали, никто не будет запихивать БД в память. Таблицу нужно пропарсить в памяти и вытянуть из нее нужные поля. FDMemTable понимает только свой формат загрузки/сохранения.

Добавлено через 9 минут
Геморрой наше всё?
Так вот я и обратился по этому к знающим людям за советом. Есть идеи решения задачи кроме медицинских заключений?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
26.07.2017, 09:38
что такое таблица? sqlite это единый файл бд. таблица в файле не может храниться последовательно. скорее всего она рассована по разным страницам - кускам этого файла
из вопроса следует, что вы хотите просто сделать свой сервер SQLite, т.к. существующие созданы для работы с файловой системой.
здесь говорится, что можно создать ЧИСТУЮ БД в памяти, но нет упоминания о том, что можно ее туда загрузить

Добавлено через 3 минуты
часто такие запросы говорят, что в наличии попытка решения известной задачи неизвестным способом
все уже придумано до нас
нужно только знать настоящую исходную задачу
0
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
26.07.2017, 09:42  [ТС]
Конечно не последовательно. Смысл такой: когда вы просматриваете таблицу, например через DBGrid, вы же не грузите ее всю в память ОЗУ. Вот мне нужно то же самое, только для TStream. Я пишу просмотр удаленных файлов SQLite.
Использовать FireDAC не обязательно. Подойдет любой компонент, у которого есть что-то типа:
OnGetFileSize
OnReadFile(AStart, ASize: Int64; Dest: buffer)

Ну или может я вообще не в том направлении ищу, может какое-то другое решение подскажите.

Добавлено через 2 минуты
Абсолютно с Вами согласен: я на это и надеюсь, что все придумано давно до меня и велосипед изобретать не прийдется.
Исходная задача: просмотр удаленного файла SQLite. То есть файла на диске нет, но я могу читать его содержимое (частями, само собой) в память
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
26.07.2017, 10:23
когда вы просматриваете таблицу через ДБГрид, вы сначала загружаете данные в датасет посредством SQL запроса. этот запрос через драйвер поступает на сервер (в данном случае драйвер и сервер живут в одной длл), сервер разбирает запрос и смотрит в таблицу размещения "страниц бд" и формирует запрос на скачивание этой страницы в буфер. Менеджер страниц формирует запрос к ОС которая лазит по файлу и скачивает указанные сектора этого файла в буфер, чтобы собрать нужные страницы.
Итого из разрозненных кусочков собирается цельный блок данных, который передается клиенту.
Никакой другой "таблицы" бд не существует.

Конечно может SQLite устроены как-то по-другому и все таблицы в ней лежат непрерывно одним куском, но чо-то крестьяне сомневаюццо
0
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
26.07.2017, 10:36  [ТС]
Вы все правильно объяснили, я и не отрицаю, что чтение БД как-то по-другому работает. Вопрос ведь не об этом. В конечном счете обработчик БД обращается к файлу и читает из него содержимое: сначала несколько секторов вначале файла, чтобы определить структуру БД, потом вытягивает из середины файла сектора с необходимым содержимым и т.д. Вот я и надеюсь найти компонент, который кроме
FileName="C:\1.db"
будет поддерживать еще чтение из памяти, типа
OnGetFileContent(const Start, Size; var Buffer)
0
Айлурофил
 Аватар для Massaraksh7
511 / 445 / 111
Регистрация: 27.05.2017
Сообщений: 2,677
Записей в блоге: 5
26.07.2017, 19:43
SQLite распространяется с открытым кодом. Можно взять исходник, переделать место, где происходит физическое чтение из файла, и заменить на чтение из потока. И пользоваться. С надо знать только.
http://www.sqlite.org/download.html
1
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
26.07.2017, 20:51  [ТС]
Большое спасибо! Я искал что-то подобное, но на Delphi, чтобы добраться к моменту чтения с файла. К сожалению, у FireDAC этого нельзя сделать, т.к. весь код ведет к скомпилированным библиотекам. Если не найду компонент чтения SQLite с полностью открытым кодом, будут копать в сторону Вашего совета...
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
27.07.2017, 06:35
нет никакого открытого кода кроме того, что предоставляют разработчики
все остальные обращаются к драйверу. На windows это DLL на андроиде насколько я понимаю, нечто встроенное в систему, но идея та же\
0
Айлурофил
 Аватар для Massaraksh7
511 / 445 / 111
Регистрация: 27.05.2017
Сообщений: 2,677
Записей в блоге: 5
27.07.2017, 12:13
По ссылке пройди, можешь скачать исходник этой DLL на C.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2017, 12:13
Помогаю со студенческими работами здесь

Как подключить готовую базу Sqlite на проект
Привет друзья. Я учусь программировать под андроид и много чего прочитал с интернета все равно там непонятно. То есть у кого нибудь есть...

Как загрузить базу на сервер?
Ребят привет. Я создал БД через workbrench. Теперь мне надо ее залить на какой-нибудь сервер и проверить запросами как все работает...

Как загрузить картинку в базу?
Не могу загрузить картинку в БД. Поле имеет тип byte Делаю так выдает ошибку with HostelsDM.qrUpdatePhoto do begin ...

Как загрузить данные в базу Access
Доброго времени суток форумчане. Подскажите пожалуйста как реализовать загрузку данных, полученных из БД MSSQL в БД Access с тем...

Как загрузить картинки в базу данных?
Пожалуйста, помогите, что писать в private void button2_Click, чтобы данные загружались в БД using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru