Lazarus + sqlite. Особенности работы.

Модератор: Модераторы

Lazarus + sqlite. Особенности работы.

Сообщение Sash0k » 19.01.2014 18:06:39

Всем привет.

Решил освежить навыки работы в Lazarus, делаю тестовый проект just for fun.
Проект - простейшая оболочка для управления sqlite-базой медицинского учреждения. Вот он.

В паскале и lazarus не специалист (последние 2 года работаю андроид-разработчиком),
и уже столкнулся со многими неявными особенностями, поэтому решил создать эту тему.

Буду тут описывать основные выявленные проблемы и пути решения.
Возможно это поможет сделать Lazarus немного лучше.
Вводная:
  • Lubuntu GNU/Linux 13.10 x86_64:
  • fpc 2.6.2-5 (из штатного репозитория);
  • sqlite 3.7.17 (из штатного репозитория);
  • Lazarus 1.3 (svn r43678);
  • RxLib (svn r2887);

Проблема №1. Путь к файлу базы данных
Проблема уже обсжудалась на этом форуме раньше.

По умолчанию в свойстве TSQLite3Connection.DatabaseName прописываю значение clinic.db, и ожидаю, что приложение будет искать базу в своём каталоге.
При открытии базы в runtime это действительно так, по нажатию на кнопку всё работает:
Код: Выделить всё
procedure TPatientsListForm.Button1Click(Sender: TObject);
begin
  sqlPatientsList.Close;
  sqlPatientsList.SQL.Text:= 'select * from patients_view;';
  CoreDataModule.mSQLite3Connection.Connected:= True;
  CoreDataModule.mSQLTransaction.Active:= True;
  sqlPatientsList.Open;
end;

Но в design-time соединиться с базой не удаётся, потому что по умолчанию приложение ищет (и создаёт) файл БД в корне домашнего каталога! Проблема решается копированием файла базы в home, тогда можно работать с проектом. Но скомпилированный бинарнитк опять будет искать файл БД рядом с собой.
Тут, кстати, есть следующие грабли, хотя и довольно тривиальные, но я наступил:

Проблема №1.1. Порядок вызова CreateForm в главном файле проекта имеет значение!
Скопировав файл базы в домашнюю папку, и настроив поля в grid-е, не сразу понял, почему собранное приложение падает с исключением TApplication.HandleException Database not assigned!. Проблема оказалась в том, что TSQLite3Connection расположен в отдельном TDataModule, и он должен иницилизироваться раньше, чем форма приложения. Это в принципе логично, но то, что при неправильном файле проекта БД спокойно открывалась в design-time и в запущенном проекте по кнопке, поначалу сбило с толку.

Проблема №2. Надпись (MEMO) вместо текста в Grid
Проблема известная. Проявляется как у стандартного DBGrid, так и у RxDBGrid.
Дело в том, что для sqlite тип TEXT - основной, и любые другие типы преобразуются к нему. Почитать об этом можно здесь.
Естественно, изначально проектируя базу я везде использовал TEXT, и в итоге получил (MEMO) вместо данных на всех полях. Нарвавшись на эти грабли, пришлось менять везде TEXT на VARCHAR: для sqlite всёравно, а гриды теперь работают. Но считаю, что это баг (ссылка на документацию по типам sqlite приведена).

... думаю, дальше найдётся ещё немало косяков, буду сообщать

Добавлено спустя 2 часа 39 минут 46 секунд:
Проблема №3. Как включить сортировку в RxDBGrid + sqlite?
Прочёл темы на форуме: Сортировщик TRxDBGrid для TSQLQuery, Сортировки в RxDBGrid, а также заметку в блоге alexs.
Заголовки грида настроил, RxSortSqlDB на форму положил. По клику на заголовки столбцов сортировки не происходят.
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Lazarus + sqlite. Особенности работы.

Сообщение Deimos » 19.01.2014 21:20:43

По первому вопросу, попробую осветить свой способ.

Для явного указания рабочей папки программы я использую:

Код: Выделить всё
dbname:=extractfilepath(paramstr(0))+'my.db';


Если используется подкаталог (например db) в рабочей папке программы и нужен кросплатформ win/lin можно использовать конструкцию:

Код: Выделить всё
dbname:=setdirseparators(extractfilepath(paramstr(0))+'db\my.db');


Я не работал никогда с sqlite, но думаю, что принцип будет работать и там.

Есть еще несколько способов, насколько я помню, но мне по нраву (проверенны временем) именно эти.

Надеюсь, что мой пост будет полезен для Вас. Или интересен :)
Deimos
постоялец
 
Сообщения: 169
Зарегистрирован: 17.01.2010 00:31:30


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru