Delphi и sqlite

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Acrid_gluk, 19 Aug 2009.

  1. Acrid_gluk

    Acrid_gluk New Member

    Joined:
    18 Aug 2009
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Дружим Delphi и SQLite. Глава первая: инструменты.

    Совершенно недавно озадачился по поводу выбора БД для нового проекта. Раньше всегда использовал стандартный BDE, что было не всегда удобно, так как BDE требует установки на компьютер специального программного обеспечения. Можно конечно обойти это, но в любом случае вместе с приложением придется таскать за собой все библиотеки BDE. А на этот раз тем более требовалось написать приложение, работающее с диска, т.е. без установки. Рассмотрев все варианты, выбор я свой остановил на SQLite по нескольким причинам:
    • бесплатная;
    • быстрая;
    • открытый исходный код;
    • все функции в одной dll;
    • возможность работать в режиме "только для чтения";
    • никаких записей в реестр и на диск (кроме dll и файла базы данных), никаких настроек сетевых протоколов;
    • синтаксис SQL достаточно хорошо соответствует стандарту – вы можете взять любую книгу, где описывается ANSI SQL 92 и пользоваться.

    Хотя есть и свои минусы, разумеется:
    Не советуют использовать для многопользовательских баз (хотя это и предусмотрено в SQLite). Все типы кроме автоинкремента эмулируются через строки.

    Казалось бы, по такой «золотой» базе должно быть море материалов, но мне было очень сложно найти хоть что-то, что подсказало бы мне как связать Delphi и эту базу. Именно поэтому у меня и возникло желание написать нормальную человеческую статью.
    Весь инструментарий для работы с базой:
    • Delphi
    • Sqlite (сама dll, можно качнуть с www.sqlite.org)
    • Программу для редактирования БД (для проверки нашей программы) качаем с sqlitebrowser.sourceforge.net
    Классы для работы с SQLite. Можно работать, разумеется, напрямую, но лучше взять готовое решение. Заметьте, что НЕ КОМПОНЕНТ, а именно обертка из классов. При желании можете легко переделать эти классы под себя. Нам понадобиться всего два файла: sqlite3.pas и sqliteTable3.pas. Качнуть их можно отсюда - www.delphi.int.ru/download/file/287/ -, там сразу архив со всеми нужными нам программами и сама dll.



    Продолжение следует…

    Xann.ru © 2009
     
    1 person likes this.
  2. Acrid_gluk

    Acrid_gluk New Member

    Joined:
    18 Aug 2009
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Вторая часть

    Дружим Delphi и SQLite. Глава вторая: настраиваемся на работу.

    Для начала создаем новый проект в Delphi. Затем кидаем sqlite3.pas, sqliteTable3.pas и sqlite3.dll в папку с нашей программой. Теперь мы должны получить возможность использовать эти классы. Для этого подключаем их в проект: File – Use unit и в открывшимся окне выбираем поочередно sqlite3.pas и sqliteTable3.pas. Все. Поздравляю. Заготовка под проект готова. Осталось добавить только сам объект, который и будет работать с базой. Добавляется он так: ищем строчку {$R *.dfm} и после нее дописываем Var sqldb: TSQLiteDatabase.


    Продолжение следует…
    В следующей главе мы рассмотрим запись данных в БД.

    Xann.ru © 2009
     
  3. Acrid_gluk

    Acrid_gluk New Member

    Joined:
    18 Aug 2009
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Третья часть

    Дружим Delphi и SQLite. Глава третья: запись данных в БД.

    Проект у нас создан. Объект готов. Приступим. Для начала создадим базу данных:

    Code:
    sqldb := TSQLiteDatabase.Create('base.db');
    У функции всего один параметр - файл базы данных.
    Не забудьте в конце программы (допустим в FormDestroy) освободить память.

    Code:
    sqldb.Free;
    Дальше создадим в нашей пока что пустой базе таблицу с тремя столбцами. Первый ID - автоинкрементный счетчик, второй - TEXTDB - строка, третий BLOBDB - поле типа blob (оно нужно для хранения файлов, звуков, картинок и др.).

    Code:
    sqldb.ExecSQL('CREATE TABLE DemoTable (ID INTEGER PRIMARY KEY, TEXTDB TEXT, BLOBDB BLOB)');
    Если до этого в нашей базе уже присутствовала таблица с таким именем - то это вызовет ошибку. Чтобы этого не случилось, добавляем проверку:

    Code:
    if not sqldb.TableExists(' DemoTable') then
    sqldb.ExecSQL('CREATE TABLE DemoTable (ID INTEGER PRIMARY KEY, TEXTDB TEXT, BLOBDB BLOB)');
    Теперь все готово для добавления данных в нашу таблицу. Сначала заполним поле TEXTDB.

    Code:
    sqldb.ExecSQL('insert into DemoTable (TEXTDB) values("Наша первая запись")');
    С добавлением файлов все гораздо сложнее. Рассмотрим следующий пример:

    Code:
    VAR    f:TfileStream;
    begin
    f:= Tfilestream.Create('filename.bmp',fmopenread);
    sqldb.UpdateBlob('UPDATE DemoTable SET BLOBDB = ? WHERE TEXTDB = "Наша первая запись" ',f);
    f.Free;
    end;
    Здесь мы добавляем в запись поток, который и содержит файл.


    Продолжение следует…
    В следующей главе мы рассмотрим чтение данных из БД.

    Xann.ru © 2009
     
  4. Acrid_gluk

    Acrid_gluk New Member

    Joined:
    18 Aug 2009
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Последняя часть

    Дружим Delphi и SQLite. Глава четвертая: чтение данных из БД.

    Ну вот и подошло время для заключительной статьи по Delphi и SQLite. Сейчас мы научимся извлекать на свет из недр базы данных нужную нам информацию. Начнем как обычно с текстовых полей. Для начала нам потребуется еще одна переменная - ее можно сделать локальной, то есть объявить непосредственно в процедуре.

    Code:
    sltb:TSQLiteTable;
    Идем дальше.

    Code:
    sltb := sldb.GetTable('SELECT TEXTDB, BLOBDB FROM DemoTable where ID=1');
    Теперь получаем данные, в удобном нам виде:

    Code:
    TextString:=sltb.FieldAsString(0); // В переменную TextString заносим значение поля TEXTDB
    С файлами, как обычно, чуть посложнее. Здесь как и в случае с записью необходимо применять потоки. Для примера выложу функцию для извлечения из базы картинки. Ей передаются два параметра: строка с sql запросом и хидер картинки в которую нужно загрузить изображение.

    Code:
    Procedure loadbitm(sql:string;image:Tobject);
    VAR m:TmemoryStream;
    begin
    m:=Tmemorystream.Create;
    if sldb.GetTable(sql).FieldAsString(0) <> '' then
    begin
    m:=sldb.GetTable(sql).FieldAsBlob(0);
    m.Position:=0;
    (image as Timage).Picture.Bitmap.LoadFromStream(m);
    m.Free;
    end;
    end;
    Вызываем так:

    Code:
    loadbitm('SELECT BLOBDB FROM DemoTable WHERE ID=1',Form1.image1);

    Вот мы и научились работать с SQLite базой данных. На основе нее очень просто создавать приложения, тем более скорость работы у нее достаточно большая по сравнению с аналогами.
    Если вы в чем то затрудняетесь или что-то не поняли - обращайтесь в асю: 44(ноль)5577(ноль)8

    Xann.ru © 2009
     
  5. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Эм... а есть компоненты...
    Кряченые тут: http://torrents.ru/forum/viewtopic.php?t=1959907

    Или ищем у разработчика: http://www.devart.com/ru/dac.html

    Позволяет много с чем работать, но я использую только под мускул, то есть юзаю MyDAC :)

    Хотя, если разработка твоя буит патентоваться, и так далее, то с крячеными компонентами не напатентуешься... да и дельфю нуна лиц...
    А пока у меня и дельфи, и Rad Studio кряченые, то и компоненты юзать не кряченые не буду... так что рекомендую вам то, что юзаю сам...
     
  6. Acrid_gluk

    Acrid_gluk New Member

    Joined:
    18 Aug 2009
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Крячили, крячим и будем крякать )))
    Просто не всегда удобно юзать компоненты. Допустим для консольных программ.
    Мало ли какие делишки нужно будет провернуть нашей консольной програмке, а компоненты к тому же прибавят размер...