пятница, 5 февраля 2010 г.

SQLite и базы данных

Раз уж в прошлом посте я упомянул о базах данных, то хочется продолжить разговор о них. Использовать будем библиотеку SQLite.

Раз уж в прошлом посте я упомянул о базах данных, то хочется продолжить разговор о них. Использовать будем библиотеку SQLite.

Для начала - что такое база данных, а точнее - реляционная база данных? РБД - это файл с обычными таблицами со столбцами и строками, где каждый столбец имеет свой тип, и все ячейки этого столбца имеют только этот тип данных, например строка или число.

Работать с базами данных мы будем через SQLite, про что уже говорилось. Про SQLite можно прочитать здесь, в главе «Что такое SQLite?». Информация в остальных главах даётся для использования с языком PHP, мы же используем, естественно, HiAsm с его Pascal/KOL, и нам эти сведения не понадобятся. Примите к сведению, что нужна библиотека sqlite3.dll, которая находится рядом с HiAsm, так что лучше всего скопировать её в папку Windows.

Для работы с базами данных используется особый язык запросов - SQL. Он справедлив как для использования в HiAsm, так и в любом языке программирования, том же PHP, например. По сути, с этим языком мы в основном и будем знакомиться, потому что сами компоненты для работы с SQLite очень просты и понятны.

И конечно, мы будем использовать нашу локальную базу данных - Elements.db. Так что SQLite подойдёт лучше всего. Наша основная вкладка в HiAsm сегодня - «Базы данных». Ну а единственная пока база данных - Elements.db, которая находится по адресу Elements\Delphi\Elements.db.



Итак, вот он, пример запроса к базе данных. После нажатия кнопки выберите в диалоге базу данных. Затем, как рассказывалось в прошлой статье, делается перекодировка текста ANSI в UTF-8, чтобы правильно воспринимались русские символы (возможно, в пути к вашей Elements.db их нет, но всё-таки…). Компонент SQLite_DB открывает базу данных для работы с ней. А SQLite_Query делает запрос к базе данных. Самое главное здесь - текст из параметра SQL, который мы разберём позже.


А сейчас посмотрите на то, что выдаёт нам SQLite_Query. Выдаёт он столбцы и строки, причём в формате многомерных потоков. Это просто необходимо, ведь ячейка таблицы базы данных может содержать практически любой символ, и символ-разделитель здесь вообще неуместен. А значит, и таблица нужна продвинутая, умеющая работать с MT-потоками. Воспользуемся StringTableMT. У неё методы для работы с многомерными потоками спрятаны на вкладке «Точки» панели параметров, так что их сначала нужно вывести, что я и сделал.

А теперь про SQL-запрос.
SELECT - с этой команды начинается любой запрос к базе данных. В переводе с английского означает «выбрать». Обратите внимание, что писать нужно большими буквами. После этой команды пишутся названия полей, которые нужно выбрать. Если стоит звёздочка, то это означает все поля.

FROM - указывает таблицу для выбора. Название таблицы тут совпадает с именем файла.

Благодаря запросу вы увидели, какие столбцы (их ещё называют полями) находятся в таблице. Ведь теперь выборку можно сделать только по требуемым полям.



Вот так мы выбираем только интересующие нас поля (столбцы). Здесь следует отметить, что разработчик HiAsm в этой базе данных сделал столбец tab определяющим номер вкладки, на которой расположен компонент, а pos - позицию компонента на вкладке.

Зная это, хотелось бы выбрать компоненты, например, только с вкладки «Контролы». Кажется, что здесь должен быть номер 2, однако он, видимо, зарезервирован, и компоненты этой вкладки имеют tab=3.



Итак, у нас новая команда - WHERE. Эта команда переводится как «ГДЕ», и тогда текст запроса становится понятен:

SELECT tab,pos,name,info FROM Elements WHERE tab=3
ВЫБРАТЬ tab,pos,name,info ИЗ Elements ГДЕ tab=3

Мы выбираем те строки из 4-х столбцов, где tab=3. Разумеется, сам столбец tab можно вообще не отображать, но отбирать только те строки, где tab=3.



Самое естественное теперь - отсортировать столбцы таблицы. Для этого используется команда ORDER BY, после которого ставится имя столбца, по которому нужно отсортировать.



Напоследок отмечу, что текст запроса можно подавать на точку SQL в компонент, так что строить запросы можно прямо из программы.

Ну а на сегодня всё. В следующий раз расскажу ещё что-нибудь интересное.






Интехстрой-М - это качественный евроремонт квартир в Москве. Дизайнеры по вашему желанию составят дизайн помещения, и специалисты выполнят в вашем доме самые разные работы, не отнимая у вас много времени.

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

Узнайте всё об отдыхе в Паттайе, отзывы, фотографии, погода и другие интересные материалы на Туристер.Ру. Тем, кто хочет поехать в Тайланд, рекомендую.

4 комментария:

  1. Большое спасибо за урок! Скажите, а как сделать, чтобы выводить строки по двум и больше условиям?

    ОтветитьУдалить
  2. Это рассказано в следующей статье.

    ОтветитьУдалить
  3. SELECT PayFactCD, AccountCD, PaySum,
    (CASE WHEN PayDate < '01.01.1999' THEN 'Давно'
    WHEN PayDate
    BETWEEN '01.01.1999' AND '31.12.2000'
    THEN 'Не очень давно'
    ELSE 'Недавно'
    END) AS Oplata
    FROM PaySumma
    WHERE PaySum BETWEEN 50 AND 100;

    Вот здесь вместо CASE используется конструкция бэйсика iif! Вопрос: какой вариант работает в SQLite ?

    select "itogo" as prim,
    sum(iif(type=1,amount,0)) as sum1,
    sum(iif(type=2,amount,0)) as sum2
    from tab1
    group by "itogo"

    ОтветитьУдалить
  4. Скорее всего, первый будет работать. Про второй ничего точно сказать не могу.

    ОтветитьУдалить