Используем SQLite (AES-256) в Delphi

Просмотров: 8204Комментарии: 7
ПрограммированиеDelphi
Используем SQLite (AES-256) в Delphi

В прошлой статье мы научились варить эту самую библиотеку SQLite из исходников SQLCipher, для того, чтобы использовать шифрование в SQLite.

Сейчас мы научимся какже все таки с этой библиотекой работать. Нам понадобится интерфейс, так сказать "обертка". Можно конечно работать с библиотекой напрямую, но лучше использовать уже готовое решение. На просторах интернета нашел обертку из двух файлов SQLite3.pas и SQLiteTable3.pas. Внизу статьи прикладываю эти файлы.

Почему же все таки SQLite?

Тут все просто, основные причины выбора данной БД, заключается в следующем:

  • библиотека абсолютно бесплатная
  • быстрая
  • открытый исходный код
  • используется только одна dll и сам файл базы данных (без всяких драйверов)
  • синтаксис SQL практически соответствует стандартному

Создание проекта

Для начало создаем новый проект и сохраняем на диск. В папку с созданным проектам копируем файлы обертки (SQLite3.pas и SQLiteTable3.pas), саму библиотеку (sqlite3.dll), и библиотеку шифрования (libeay32.dll).

В созданном проекте, для работы с SQLite, подключаем обертку для работы с базой:

uses SQLite3, SQLiteTable3;

Теперь добавляем сам объект для работы с БД. Для этого объявляем вместе с переменными:

var mybase: TSQLiteDatabase;

Взаимодействие с базой данных

Подключение

Подключаем файл базы данных, если его нет, то файл создаться:

mybase := TSQLiteDatabase.Create('base.db');

здесь мы задали имя файла нашей базы.

После открытия задаем пароль для шифрования базы:

mybase.ExecSQL('PRAGMA key = "MY PASSWORD"');

Создание и добавление

Создадим в нашей базе таблицу, для этого выполним SQL запрос. Для этого используется команада:

if not mybase.TableExists('FirstTable') then
mybase.ExecSQL('CREATE TABLE FirstTable (ID INTEGER PRIMARY KEY, MYTEXT TEXT, MYBLOB BLOB)');

Чтобы исключить ошибку, провевряем есть ли в базе таблица с таким же именем.

Добавление записей выполняется также через SQL запросы:

mybase.ExecSQL('insert into FirstTable (MYTEXT) values("Оно работает!")');

Для получения номера вставленной строки используется функция:

id := mybase.GetLastInsertRowID;

Теперь рассмотрим добавление файла в BLOB поле:

var
 f1: TFileStream;
begin
f1:= TFileStream.Create('pidgin.bmp',fmOpenRead);
mybase.UpdateBlob('UPDATE FirstTable SET MYBLOB = ? WHERE ID = '+id, f1);
f1.Free;
end;

Получение данных

Для извлечения данных из нашей БД, необходимо объявить новую переменную:

var mytable: TSQLiteTable;

Получаем данные из таблицы

mytable := mybase.GetTable('SELECT MYTEXT, MYBLOB FROM FirstTable where ID='+id);

И теперь уже получаем значение из нужного нам поля полученной таблицы:

myvar:=mytable.FieldAsString(0); // значение поля MYTEXT

Загрузка изображение из базы выполняется следующим образом:

var ms:TMemoryStream;
ms := TMemoryStream.Create;
sql := 'SELECT MYBLOB FROM FirstTable WHERE ID='+id;
if mybase.GetTable(sql).FieldAsString(0) <> '' then
begin
ms := mybase.GetTable(sql).FieldAsBlob(0);
ms.Position := 0;
(Form1.Image1 as Timage).Picture.Bitmap.LoadFromStream(ms);
ms.Free;

После всех манипуляций освобождаем память:

mybase.Free;

Программа для редактирования БД

Открыть зашифрованную базу, из всех испробованных мной программ, мне удалось только через SQLite Maestro. Но к большому сожалению данная программа платная.

После установки Maestro, заходим в папку с программой и заменяем файл sqlite3.dll на свой сваренный sqlite3.dll (с функциями шифрования), а также файл libeay32.dll.

После запуска программы и подключения файла БД, программа запросит пароль, который мы задали через команду PRAGMA.


Скачать обертку

Комментариев: 7 RSS

1 Павел 20-02-2013 04:13

Доброго времени суток!

Мне понравился данный пост, но у меня возникла проблема связанная скорее не с трудностью понимания, а скорее с моими кривыми руками.

Вообщем дело в следующем. Я подключил файл БД, попытался скомпилировать, в ответ на что получил сообщение, что запуск проги не возможен, т.к. на компе отсутствует baselib.dll. Проверил, и оказалось, что это действительно так. С трудом нагуглил и скачал эту библиотеку, после чего застрял на новом сообщении об ошибке. Говорит, что в baselib.dll не найдена точка входа в процедуру sqlite3_bind_parameter_index

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

мб в Win7 baselib заменили каким-нить basecsp или basesrv?

Очень надуюсь на Вашу помощь, т.к. хотелось бы воспользовать в проекте именно SQLite, заранее спасибо.

2 Admin 20-02-2013 15:26

Это моя ошибка) baselib.dll это и есть sqlite3.dll, просто я его переименовывал для одного проекта.

Решение: Исправить в файле SQLite3.pas строку baselib.dll на sqlite3.dll ИЛИ просто переименовать файл sqlite3.dll в baselib.dll

4 Павел 21-02-2013 02:31

Спасибо!

Вы очень вовремя откликнулись и сильно мне помогли. Очень хороший материал.

Благодарю.

grin

5 Andre 24-07-2014 01:50

Даное решение работает на Windows XP?

7 Евгений 24-09-2016 13:46

Спасибо за материал, все очень понятно. Но у меня возникла ошибка при добавлении файла в базу выходит ошибка "Access volation at adress 00407DC6 in module 'Project1.exe'. Read of adress 000000004"

Я использую Delphi 10.1 Berlin, имеет ли значение версии delphi?

И как можно реализовать вывод базы например в DBGrid?

Заранее спасибо за ответ

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

     

  

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

(обязательно)