Меню

Создание таблиц с помощью SQL запросов



ADO. Создание простой таблицы посредством запроса SQL

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Создание таблицы выполняется SQL-запросом CREATE TABLE. Тут есть одно но: дело в том, что существует два типа SQL-запросов. Запрос, который возвращает набор данных и начинается оператором SELECT, выполняется простым открытием компонента-запроса. При этом выполняется запрос, который содержится в свойстве SQL компонента.

С модифицирующими командами дело обстоит иначе. Команда CREATE TABLE принадлежит к той части SQL, которая называется DDL (Data Definition Language) — Язык Определения Данных. Этот язык предназначен для изменения структуры базы данных. Команды INSERT, DELETE, UPDATE относятся к DML (Data Manipulation Language) — Язык Обработки Данных, предназначенный для модификации данных. Эти команды объединяет то, что они не возвращают результирующий набор данных. Чтобы выполнить эти команды, нужно присвоить соответствующий SQL-запрос свойству SQL, а затем вызвать метод ExecSQL.

Синтаксис создания таблицы несложный:

Здесь, TableName — имя таблицы; ColumnName — имя столбца; DataType — тип данных и Size -размер, который указывается для некоторых типов данных, например, строки. Описания столбцов таблицы разделяются запятыми. В различных СУБД синтаксис и типы данных SQL могут отличаться. Поэтому запрос, прекрасно работающий в одной СУБД, может вызвать ошибку в другой. Чтобы избежать ошибок, рекомендуется везде использовать типы ANSI, являющиеся стандартом SQL. Увы, но

этих типов очень немного. Рассмотрим их: Таблица 9.3. Типы ANSI

CHAR (CHARACTER) TEXT

Строковые типы данных. Обычно имеют размер до 255 символов. Требуют указания размера.

Целое число. Размер не указывается.

Короткое целое. Размер не указывается.

Вещественные числа. Размер не указывается.

Как видите, многих типов просто нет. Вместо логического типа, вероятно, придется использовать строковый тип с размером в один символ; при этом ‘Y’ или ‘1’ будут означать истину, а ‘N’ или ‘0’ -ложь. Программисту придется самостоятельно делать проверку на это значение. Нет типа Memo. Нет автоинкрементного типа. Однако стандартные типы непременно будут корректно работать в любой

Ниже приведен пример создания и открытия простой таблицы. В приложении должен иметься компонент ADOQuery, а если есть сетка и навигатор, то и DBSource. Для подключения к нужному провайдеру данных желательно использовать компонент TADOConnection. В его свойство ConnectionString нужно прописать строку подключения, например:

Provider=MSDASQL. I;Persist Security Info=False;Data Source=Файлы dBASE

Эту строку можно ввести программно, или создать подключение при проектировании (я так и сделал). Поставщик данных в примере оставлен по умолчанию — Microsoft OLE DB Provider for ODBC Drivers, а в качестве источника данных (вкладка «Подключение» редактора связей TADOConnection) используются файлы dBase. Не следует забывать и про свойство LoginPrompt, которое следует переводить в False, чтобы программа не запрашивала имя пользователя и пароль при каждом подключении. А также нужно сразу открыть TADOConnection, установив его свойство Connected в True. В свойстве Connection компонента TADOQuery следует выбрать ADOConnectionI.

Пример реализован, как событие нажатия на кнопку:

procedure TfMain.Button1Click(Sender: TObject); var

s : String; begin

s := ‘CREATE TABLE MyTab(Key1 INT, Name CHAR(20), ‘+ ‘ MyFloat FLOAT, MyDate DATE)’;

<Создаем таблицу>ADOQueryl.SQL.Clear; ADOQueryl.SQL.Add(s); ADOQuery1.ExecSQL;

ADOQueryl.SQL.Add(‘SELECT * FROM MyTab’);

Как видите, создается четыре поля — целый тип, строковый размером 20 символов, вещественный и тип Дата. Последний тип не входит в стандартное описание ANSI-типов, тем не менее, работает в большинстве СУБД. Можете также поэкспериментировать и с типом BOOLEAN (Логический).

Итак, в переменную s мы вносим строку записи SQL-запроса. Затем очищаем свойство SQL, на случай, если там уже имелся запрос. Далее этот запрос мы заносим в свойство SQL, и методом ExecSQL выполняем его. С открытием таблицы мы уже неоднократно сталкивались. В результате выполнения кода создается и открывается файл MyTab.dbf, который находится в той же папке, что и приложение.

Лекция 10. Сохранение древовидных структур в базе данных.

Древовидные структуры не относятся напрямую к программированию баз данных, тем не менее, программисту нередко приходится «изобретать велосипед», придумывая различные решения сохранения таких структур в таблице, и обратное их считывание в дерево.

Типичный пример дерева — всем знакомое дерево каталогов. Примеров таких структур множество — это могут быть отделы в каком-либо учреждении или разделы библиотеки. Посмотрим на рисунок с фрагментом дерева разделов библиотеки:

ADO. Создание простой таблицы посредством запроса SQL

□■■ Художественная литература Й- Фантастика !-Фентези !■■■■ Киберпанк !■■■■ Мистика, колдовство Ужасы !■■■■ Исторический роман □■■ Детективы

!■■■■ Старинный детектив !■■■■ Зарубежный детектив : — Шпионский роман — Компьютерная литература Администрирование □■■ Программирование | — Delphi

□■■ Web-строительство I — HTML L CSS

Рис. 10.1. — Дерево разделов

Основная сложность хранения деревьев в таблице — это то, что мы не знаем заранее, какова будет глубина вложенности разделов. Можно было бы создать таблицу с 10 полями, например. Но если вложенных разделов будет меньше, то таблица будет неэффективна — останется много пустых полей. А если больше — ограничивать пользователя?

Самый простой способ сохранения структуры дерева и ее считывания обратно — воспользоваться тем, что дерево — это список узлов, и имеет хорошо знакомые нам методы:

//сохраняем в файл:

TreeViewl.SaveToFile(‘myfile.txt’); //читаем из файла:

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

Когда программист впервые сталкивается с необходимостью хранения древовидных структур в базе данных, обычно он первым делом подключается к Интернету и ищет какой-нибудь компонент, который бы позволил это делать. Но не все нестандартные компоненты работают качественно, да и зачем искать какой-то новый компонент, когда имеется стандартный TreeView на вкладке Win32 Палитры компонентов? Именно с этим компонентом мы и будем работать в данной лекции.

Рецептов работы с деревьями в базах данных много, мы рассмотрим лишь один из них, достаточно эффективный и в то же время простой. Смысл этого способа состоит в том, чтобы в каждой записи таблицы сохранять номер узла раздела, номер его родителя, если он есть, и название узла. В случае если узел не имеет родителя (главный узел, например, «Художественная литература» в рисунке 10.1), то в соответствующее поле запишем ноль.

Источник

Delphi как создать sql таблицу

Эта статья будет посвящена новичкам, которые хотят научиться создавать базы данных в Delphi, но не знают языка SQL запросов. Частично, можно выйти из положения используя компоненты ADOTable и фильтрацию, но не все задачи можно решить с помощью них. Как быть? Я предлагаю составлять запросы с помощью конструктора SQL запросов в MS Access 2003 – 2007, и переносить их в компонент ADOQuery или любой другой, позволяющий работать SQL запросами. Понятно, что если вы хотите профессионально заняться программированием баз данных, то без изучения языка запросов SQL вам не обойтись, но на первых порах конструктор SQL запросов в MS Access 2003 – 2007 может послужить вам хорошим другом.
Сейчас я попытаюсь рассказать, как работать с этим конструктором. Предполагается, что вы уже умеете создавать саму базу данных в MS Access 2003 – 2007.

Пусть у нас имеется некая база данных bd.mdb имеющая три таблицы products, ed_izmer, storage. Скачать базу.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

В первый столбец вводим имя таблицы -> products, поле product_name.
Во второй имя таблицы -> ed_izmer, поле ed_name.
В третий имя таблицы -> storage, поле quantity.
В четвертый имя таблицы -> storage, поле price.
В пятый столбец вводим формулу для вычисления суммы.
Формулы вводятся следующим образом: в начале идет имя поля (придумываем сами), затем двоеточие, а затем формула в виде [имя таблицы1].[имя поля]знак операции[имя таблицы2].[имя поля].

В нашем случае вводим следующую формулу:

сумма: [storage].[quantity]*[storage].[price]

на этом запрос готов жмем на крестик и сохраняем запрос.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Создание SQL запросов к базе данных созданной в MS Access 2003 – 2007 из Delphi с помощь компонента ADOQuery.

Копируем полученный запрос и вставляем его в поле SQL -> TStrings компонента ADOQuery в Delphi. Или используем программно:

ADOQuery.Active:=false;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add(‘SELECT products.product_name, ed_izmer.ed_name, storage.quantity, storage.price, [storage].[quantity]*[storage].[price] AS сумма
FROM ed_izmer RIGHT JOIN (products RIGHT JOIN storage ON products.id=storage.id_product) ON ed_izmer.id=storage.id_ed_izmer;’);
ADOQuery.Active:=True;

Если запрос очень длинный то его можно разбить, например, так:

ADOQuery.SQL.Add(‘SELECT products.product_name,’+
‘ ed_izmer.ed_name, storage.quantity, storage.price,’+
‘ [storage].[quantity]*[storage].[price] AS сумма’+
‘ FROM ed_izmer RIGHT JOIN (products RIGHT JOIN storage ON products.id=storage.id_product)’+
‘ ON ed_izmer.id=storage.id_ed_izmer;’);

Либо использовать ADOQuery.SQL.Add(‘части запроса’) несколько раз.

Можно делать и обратное преобразование запроса SQL. Берем готовый SQL запрос, копируем его в конструктор запросов MS Access в режиме SQL, затем переключаемся в режим конструктора и изучаем какие таблицы, поля, связи, выражения входят в запрос. Если надо, то вносим изменения.

Ну и на последок немножко о синтаксисе запроса:

Слово select в запросе означает создание выборки. Эта команда имеет вот такой синтаксис:

select [список полей] from [список таблиц и их соединения]

Поля в списке полей перечисляются через запятую.
Синтаксис описания поля такой:

[Имя таблицы].[Имя поля] AS [Имя поля в выборке]

После последнего поля из списка запятая не ставиться.

Источник

SQL-запросы в Delphi

Компоненты Delphi для работы с базами данных были созданы в расчете на работу с SQL и архитектурой клиент/сервер. При работе с ними вы можете воспользоваться характеристиками расширенной поддержки удаленных серверов. Delphi осуществляет эту поддержку двумя способами. Во-первых, непосредственные команды из Delphi позволяют разработчику управлять таблицами, устанавливать пределы, удалять, вставлять и редактировать существующие записи. Второй способ заключается в использовании запросов на языке SQL, где строка запроса передается на сервер для ее разбора, оптимизации, выполнения и передачи обратно результатов.

Примечание: Данный документ представляет собой коллективный труд нескольких авторов, которые индивидуально несут ответственность за качество предоставленной здесь информации. Borland не предоставлял, и не может предоставить никакой гарантии относительно содержимого данного документа.

  • Введение
  • Компонент TQuery
    • Свойство SQL
    • Свойство Params
    • Источник данных
    • Команда Format
    • Open против ExecSQL
  • Компонент TStoredProc
  • TDatabase
  • Выводы

1. Введение

Данный документ делает акцент на втором методе доступа к базам данных, на основе запросов SQL (pass-through). Авторы не стремились создать курсы по изучению синтаксиса языка SQL и его применения, они ставили перед собой цель дать несколько примеров использования компонентов TQuery и TStoredProc. Но чтобы сделать это, необходимо понимать концепцию SQL и знать как работают selects, inserts, updates, views, joins и хранимые процедуры (stored procedures). Документ также вскользь касается вопросов управления транзакциями и соединения с базой данных, но не акцентирует на этом внимание. Итак, приступая к теме, создайте простой запрос типа SELECT и отобразите результаты.

Читайте также:  Все стадии мейоза и митоза таблица

2. Компонент TQuery

Если в ваших приложениях вы собираетесь использовать SQL, то вам непременно придется познакомиться с компонентом TQuery. Компоненты TQuery и TTable наследуются от TDataset. TDataset обеспечивает необходимую функциональность для получения доступа к базам данных. Как таковые, компоненты TQuery и TTable имеют много общих признаков. Для подготовки данных для показа в визуальных компонентах используется все тот же TDatasource. Также, для определения к какому серверу и базе данных необходимо получить доступ, необходимо задать имя псевдонима. Это должно выполняться установкой свойства aliasName объекта TQuery.

Свойство SQL

Все же TQuery имеет некоторую уникальную функциональность. Например, у TQuery имеется свойство с именем SQL. Свойство SQL используется для хранения SQL-запроса. Ниже приведены основные шаги для составления запроса, где все служащие имеют зарплату свыше $50,000.

    Создайте объект TQuery

Задайте псевдоним свойству DatabaseName. (Данный пример использует псевдоним IBLOCAL, связанный с демонстрационной базой данных employee.gdb).

Выберите свойство SQL и щелкните на кнопке с текстом — ‘. ‘ (три точки, Инспектор Объектов — В.О.). Должен появиться диалог редактора списка строк (String List Editor).

Введите: Select * from EMPLOYEE where SALARY>50000. Нажмите OK.

Выберите в Инспекторе Объектов свойство Active и установите его в TRUE.

Разместите на форме объект TDatasource.

Установите свойство Dataset у TDatasource в Query1.

Разместите на форме TDBGrid.

  • Установите его свойство Datasource в Datasource1.
  • Свойство SQL имеет тип TStrings. Объект TStrings представляет собой список строк, и чем-то похож на массив. Тип данных TStrings имеет в своем арсенале команды добавления строк, их загрузки из текстового файла и обмена данными с другим объектом TStrings. Другой компонент, использующий TStrings — TMemo. В демонстрационном проекте ENTRSQL.DPR (по идее, он должен находится на отдельной дискете, но к «Советам по Delphi» она не прилагается — В.О.), пользователь должен ввести SQL-запрос и нажать кнопку «Do It» («сделать это»). Результаты запроса отображаются в табличной сетке. В Листинге 1 полностью приведен код обработчика кнопки «Do It».

    Свойство Params

    Этого должно быть достаточно для пользователя, знающего SQL. Тем не менее, большинство пользователей не знает этого языка. Итак, ваша работа как разработчика заключается в предоставлении интерфейса и создании SQL-запроса. В Delphi, для создания SQL-запроса на лету можно использовать динамические запросы. Динамические запросы допускают использование параметров. Для определения параметра в запросе используется двоеточие (:), за которым следует имя параметра. Ниже приведен пример SQL-запроса с использованием динамического параметра:

    Если вам нужно протестировать, или установить для параметра значение по умолчанию, выберите свойство Params объекта Query1. Щелкните на кнопке ‘. ‘. Должен появиться диалог настройки параметров. Выберите параметр Dept_no. Затем в выпадающем списке типов данных выберите Integer. Для того, чтобы задать значение по умолчанию, введите нужное значение в поле редактирования «Value».

    Для изменения SQL-запроса во время выполнения приложения, параметры необходимо связать (bind). Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Params или метод ParamByName. Свойство Params представляет из себя массив TParams. Поэтому для получения доступа к параметру, необходимо указать его индекс. Для примера,

    Свойство asInteger читает данные как тип Integer (название говорит само за себя). Это не обязательно должно указывать но то, что поле имеет тип Integer. Например, если тип поля VARCHAR(10), Delphi осуществит преобразование данных. Так, приведенный выше пример мог бы быть записан таким образом:

    Если вместо номера индекса вы хотели бы использовать имя параметра, то воспользуйтесь методом ParamByName. Данный метод возвращает объект TParam с заданным именем. Например:

    В листинге 2 приведен полный код примера.

    Обратите внимание на процедуру, первым делом подготавливающую запрос. При вызове метода prepare, Delphi посылает SQL запрос на удаленный сервер. Сервер выполняет грамматический разбор и оптимизацию запроса. Преимущество такой подготовки запроса состоит в его предварительном разборе и оптимизации. Альтернативой здесь может служить подготовка сервером запроса при каждом его выполнении. Как только запрос подготовлен, подставляются необходимые новые параметры, и запрос выполняется.

    Источник данных

    В предыдущем примере пользователь мог ввести номер отдела, и после выполнения запроса отображался список сотрудников этого отдела. А как насчет использования таблицы DEPARTMENT, позволяющей пользователю легко перемещаться между пользователями и отделами?

    Примечание: Следующий пример использует TTable с именем Table1. Для Table1 имя базы данных IBLOCAL, имя таблицы — DEPARTMENT. DataSource2 TDatasource связан с Table1. Таблица также активна и отображает записи в TDBGrid.

    Способ подключения TQuery к TTable — через TDatasource. Есть два основных способа сделать это. Во-первых, разместить код в обработчике события TDatasource OnDataChange. Например, листинг 3 демонстрирует эту технику.

    Листинг 3 — Использования события OnDataChange для просмотра дочерних записей

    Техника с использованием OnDataChange очень гибка, но есть еще легче способ подключения Query к таблице. Компонент TQuery имеет свойство Datasource. Определяя TDatasource для свойства Datasource, объект TQuery сравнивает имена параметров в SQL-запросе с именами полей в TDatasource. В случае общих имен, такие параметры заполняются автоматически. Это позволяет разработчику избежать написание кода, приведенного в листинге 3 (*** приведен выше ***).

    Фактически, техника использования Datasource не требует никакого дополнительного кодирования. Для подключения запроса к таблице DEPT_NO выполните действия, приведенные в листинге 4.

    Листинг 4 — Связывание TQuery c TTable через свойство Datasource

    Выберите у Query1 свойство SQL и введите:

    Выберите свойство Datasource и назначьте источник данных, связанный с Table1 (Datasource2 в нашем примере)

    Выберите свойство Active и установите его в True

    Это все, если вы хотите создать такой тип отношений. Тем не менее, существуют некоторые ограничения на параметризованные запросы. Параметры ограничены значениями. К примеру, вы не можете использовать параметр с именем Column или Table. Для создания запроса, динамически изменяемого имя таблицы, вы могли бы использовать технику конкатенации строки. Другая техника заключается в использовании команды Format.

    Команда Format

    Команда Format заменяет параметры форматирования (%s, %d, %n и пр.) передаваемыми значениями. Например,

    Результатом вышеприведенной команды будет ‘Select * from EMPLOYEE’. Функция буквально делает замену параметров форматирования значениями массива. При использовании нескольких параметров форматирования, замена происходит слева направо. Например,

    Результатом команды форматирования будет ‘Select * from EMPLOYEE where EMP_ID=3’. Такая функциональность обеспечивает чрезвычайную гибкость при динамическом выполнении запроса. Пример, приведенный ниже в листинге 5, позволяет вывести в результатах поле salary. Для поля salary пользователь может задавать критерии.

    Листинг 5 — Использование команды Format для создания SQL-запроса

    В этом примере мы используем методы Clear и Add свойства SQL. Поскольку «подготовленный» запрос использует ресурсы сервера, и нет никакой гарантии что новый запрос будет использовать те же таблицы и столбцы, Delphi, при каждом изменении свойства SQL, осуществляет операцию, обратную «подготовке» (unprepare). Если TQuery не был подготовлен (т.е. свойство Prepared установлено в False), Delphi автоматически подготавливает его при каждом выполнении. Поэтому в нашем случае, даже если бы был вызван метод Prepare, приложению от этого не будет никакой пользы.

    Open против ExecSQL

    В предыдущих примерах TQuerie выполняли Select-запросы. Delphi рассматривает результаты Select-запроса как набор данных, типа таблицы. Это просто один класс допустимых SQL-запросов. К примеру, команда Update обновляет содержимое записи, но не возвращает записи или какого-либо значения. Если вы хотите использовать запрос, не возвращающий набор данных, используйте ExecSQL вместо Open. ExecSQL передает запрос для выполнения на сервер. В общем случае, если вы ожидаете, что получите от запроса данные, то используйте Open. В противном случае допускается использование ExecSQL, хотя его использование с Select не будет конструктивным. Листинг 6 содержит код, поясняющий сказанное на примере.

    Все приведенные выше примеры предполагают использования в ваших приложениях запросов. Они могут дать солидное основание для того, чтобы начать использовать в ваших приложениях TQuery. Но все же нельзя прогнозировать конец использования SQL в ваших приложениях. Типичные серверы могут предложить вам другие характеристики, типа хранимых процедур и транзакций. В следующих двух секциях приведен краткий обзор этих средств.

    3. Компонент TStoredProc

    Хранимая процедура представляет собой список команд (SQL или определенного сервера), хранимых и выполняемых на стороне сервера. Хранимые процедуры не имеют концептуальных различий с другими типами процедур. TStoredProc наследуется от TDataset, поэтому он имеет много общих характеристик с TTable и TQuery. Особенно заметно сходство с TQuery. Поскольку хранимые процедуры не требуют возврата значений, те же правила действуют и для методов ExecProc и Open. Каждый сервер реализует работу хранимых процедур с небольшими различиями. Например, если в качестве сервера вы используете Interbase, хранимые процедуры выполняются в виде Select-запросов. Например, чтобы посмотреть на результаты хранимой процедуры, ORG_CHART, в демонстрационной базе данных EMPLOYEE, используйте следующих SQL-запрос:

    При работе с другими серверами, например, Sybase, вы можете использовать компонент TStoredProc. Данный компонент имеет свойства для имен базы данных и хранимой процедуры. Если процедура требует на входе каких-то параметров, используйте для их ввода свойство Params.

    4. TDatabase

    Компонент TDatabase обеспечивает функциональность, которой не хватает TQuery и TStoredProc. В частности, TDatabase позволяет создавать локальные псевдонимы BDE, так что приложению не потребуются псевдонимы, содержащиеся в конфигурационном файле BDE. Этим локальным псевдонимом в приложении могут воспользоваться все имеющиеся TTable, TQuery и TStoredProc. TDatabase также позволяет разработчику настраивать процесс подключения, подавляя диалог ввода имени и пароля пользователя, или заполняя необходимые параметры. И, наконец, самое главное, TDatabase может обеспечивать единственную связь с базой данных, суммируя все операции с базой данных через один компонент. Это позволяет элементам управления для работы с БД иметь возможность управления транзакциями.

    Транзакцией можно считать передачу пакета информации. Классическим примером транзакции является передача денег на счет банка. Транзакция должна состоять из операции внесения суммы на новый счет и удаления той же суммы с текущего счета. Если один из этих шагов по какой-то причине был не выполнен, транзакция также считается невыполненной. В случае такой ошибки, SQL сервер позволяет выполнить команду отката (rollback), без внесения изменений в базу данных. Управление транзакциями зависит от компонента TDatabase. Поскольку транзакция обычно состоит из нескольких запросов, вы должны отметить начало транзакции и ее конец. Для выделения начала транзакции используйте TDatabase.BeginTransaction. Как только транзакция начнет выполняться, все выполняемые команды до вызова TDatabase.Commit или TDatabase.Rollback переводятся во временный режим. При вызове Commit все измененные данные передаются на сервер. При вызове Rollback все изменения теряют силу. Ниже в листинге 7 приведен пример, где используется таблица с именем ACCOUNTS. Показанная процедура пытается передать сумму с одного счета на другой.

    Читайте также:  Таблица диапазонов частот радиоволн

    И последнее, что нужно учесть при соединении с базой данных. В приведенном выше примере, TDatabase использовался в качестве единственного канала для связи с базой данных, поэтому было возможным выполнение только одной транзакции. Чтобы выполнить это, было определено имя псевдонима (Aliasname). Псевдоним хранит в себе информацию, касающуюся соединения, такую, как Driver Type (тип драйвера), Server Name (имя сервера), User Name (имя пользователя) и другую. Данная информация используется для создания строки соединения (connect string). Для создания псевдонима вы можете использовать утилиту конфигурирования BDE, или, как показано в примере ниже, заполнять параметры во время выполнения приложения.

    TDatabase имеет свойство Params, в котором хранится информация соединения. Каждая строка Params является отдельным параметром. В приведенном ниже примере пользователь устанавливает параметр User Name в поле редактирования Edit1, а параметр Password в поле Edit2. В коде листинга 8 показан процесс подключения к базе данных:

    Этот пример показывает как можно осуществить подключение к серверу без создания псевдонима. Ключевыми моментами здесь являются определение DriverName и заполнение Params информацией, необходимой для подключения. Вам не нужно определять все параметры, вам необходимо задать только те, которые не устанавливаются в конфигурации BDE определенным вами драйвером базы данных. Введенные в свойстве Params данные перекрывают все установки конфигурации BDE. Записывая параметры, Delphi заполняет оставшиеся параметры значениями из BDE Config для данного драйвера. Приведенный выше пример также вводит такие понятия, как сессия и метод GetTableNames. Это выходит за рамки обсуждаемой темы, достаточно упомянуть лишь тот факт, что переменная session является дескриптором database engine. В примере она добавлена только для «показухи».

    Другой темой является использование SQLPASSTHRU MODE. Этот параметр базы данных отвечает за то, как натив-команды базы данных, такие, как TTable.Append или TTable.Insert будут взаимодействовать с TQuery, подключенной к той же базе данных. Существуют три возможных значения: NOT SHARED, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT. NOT SHARED означает, что натив-команды используют одно соединение с сервером, тогда как запросы — другое. Со стороны сервера это видится как работа двух разных пользователей. В любой момент времени, пока транзакция активна, натив-команды не будут исполняться (committed) до тех пор, пока транзакция не будет завершена. Если был выполнен TQuery, то любые изменения, переданные в базу данных, проходят отдельно от транзакции.

    Два других режима, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT, делают для натив-команд и запросов общим одно соединение с сервером. Различие между двумя режимами заключаются в передаче выполненной натив-команды на сервер. При выбранном режиме SHARED AUTOCOMMIT бессмысленно создавать транзакцию, использующую натив-команды для удаления записи и последующей попыткой осуществить откат (Rollback). Запись должна быть удалена, а изменения должны быть сделаны (committed) до вызова команды Rollback. Если вам нужно передать натив-команды в пределах транзакции, или включить эти команды в саму транзакцию, убедитесь в том, что SQLPASSTHRU MODE установлен в SHARED NOAUTOCOMMIT или в NOT SHARED.

    5. Выводы

    Delphi поддерживает множество характеристик при использовании языка SQL с вашими серверами баз данных. На этой ноте разрешите попрощаться и пожелать почаще использовать SQL в ваших приложениях.

    Источник

    Создание таблиц с помощью SQL-запросов

    • Обзор
    • Создание таблиц с помощью SQL
    • Заключение

    На данном уроке мы познакомимся еще с одной возможностью создания таблиц — через посылку SQL-запросов. Как Вы, наверное, могли заметить на предыдущем уроке, Database Desktop не обладает всеми возможностями по управлению SQL-серверными базами данных. Поэтому с помощью Database Desktop удобно создавать или локальные базы данных или только простейшие SQL-серверные базы данных, состоящие из небольшого числа таблиц, не очень сильно связанных друг с другом. Если же Вам необходимо создать базу данных, состоящую из большого числа таблиц, имеющих сложные взаимосвязи, можно воспользоваться языком SQL (вообще говоря, для этих целей лучше всего использовать специализированные CASE-средства, которые позволяют в интерактивном режиме сгенерировать всю структуру базы данных и сформировать все связи; описание двух наиболее удачных CASE-средств — System Architect и S-Designor — дано в дополнительных уроках). При этом можно воспользоваться компонентом Query в Delphi, каждый раз посылая по одному SQL-запросу, а можно записать всю последовательность SQL-предложений в один так называемый скрипт и послать его на выполнение, используя, например, Windows Interactive SQL (WISQL.EXE) — интерактивное средство посылки SQL-запросов к InterBase (в том числе и локальному InterBase), входящее в поставку Delphi. Конечно, для этого нужно хорошо знать язык SQL, но, уверяю Вас, сложного в этом ничего нет! Конкретные реализации языка SQL незначительно отличаются в различных SQL-серверах, однако базовые предложения остаются одинаковыми для всех реализаций. Практика показывает, что если нет необходимости создавать таблицы во время выполнения программы, то лучше воспользоваться WISQL.

    Создание таблиц с помощью SQL

    Если Вы хотите воспользоваться компонентом TQuery, сначала поместите его на форму. После этого настройте свойство DatabaseName на нужный Вам алиас (если базы данных еще не существует, удобней создать ее в WISQL командой File|Create Database. а затем уже настроить на нее новый алиас). После этого можно ввести SQL-предложение в свойство SQL. Для выполнения запроса, изменяющего структуру, вставляющего или обновляющего данные на сервере, нужно вызвать метод ExecSQL компонента TQuery. Для выполнения запроса, получающего данные с сервера (т.е. запроса, в котором основным является оператор SELECT), нужно вызвать метод Open компонента TQuery. Ёто связано с тем, что BDE при посылке запроса типа SELECT открывает так называемый курсор, с помощью которого осуществляется навигация по выборке данных (подробней об этом см. в уроке, посвященном TQuery).

    Как показывает опыт, проще воспользоваться утилитой WISQL. Для этого в WISQL выберите команду File|Run an ISQL Script. и выберите файл, в котором записан ваш скрипт, создающий базу данных. После нажатия кнопки УOKФ ваш скрипт будет выполнен, и в нижнее окно будет выведен протокол его работы.

    Приведем упрощенный синтаксис SQL-предложения для создания таблицы на SQL-сервере InterBase (более полный синтаксис можно посмотреть в online-справочнике по SQL, поставляемом с локальным InterBase):

    table — имя создаваемой таблицы,
    — описание поля,
    — описание ограничений и/или ключей (квадратные скобки [] означают необязательность, вертикальная черта | означает УилиФ).

    Описание поля состоит из наименования поля и типа поля (или домена — см. урок 9), а также дополнительных ограничений, накладываемых на поле:

    • col — имя поля;
    • datatype — любой правильный тип SQL-сервера (для InterBase такими типами являются — см. урок 11 — SMALLINT, INTEGER, FLOAT, DOUBLE PRECISION, DECIMAL, NUMERIC, DATE, CHAR, VARCHAR, NCHAR, BLOB), символьные типы могут иметь CHARACTER SET — набор символов, определяющий язык страны. Для русского языка следует задать набор символов WIN1251;
    • COMPUTED BY ( ) — определение вычисляемого на уровне сервера поля, где — правильное SQL-выражение, возвращающее единственное значение;
    • domain — имя домена (обобщенного типа), определенного в базе данных;
    • DEFAULT — конструкция, определяющая значение поля по умолчанию;
    • NOT NULL — конструкция, указывающая на то, что поле не может быть пустым;
    • COLLATE — предложение, определяющее порядок сортировки для выбранного набора символов (для поля типа BLOB не применяется). Русский набор символов WIN1251 имеет 2 порядка сортировки — WIN1251 и PXW_CYRL. Для правильной сортировки, включающей большие буквы, следует выбрать порядок PXW_CYRL.

    Описание ограничений и/или ключей включает в себя предложения CONSTRAINT или предложения, описывающие уникальные поля, первичные, внешние ключи, а также ограничения CHECK (такие конструкции могут определяться как на уровне поля, так и на уровне таблицы в целом, если они затрагивают несколько полей):

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

    Пример A: Простая таблица с конструкцией PRIMARY KEY на уровне поля

    Предполагается, что в базе данных определен домен REGION_NAME, например, следующим образом:

    Пример B: Таблица с предложением UNIQUE как на уровне поля, так и на уровне таблицы

    Пример C: Таблица с определением первичного ключа, внешнего ключа и конструкции CHECK, а также символьных массивов

    Данный пример создает таблицу, содержащую информацию о работах (профессиях). Типы полей основаны на доменах JOBCODE, JOBGRADE, REGION_NAME и SALARY. Определен массив LANGUAGE_REQ, состоящий из 5 элементов типа VARCHAR(15). Кроме того, введено поле JOB_REQ, имеющее тип BLOB с подтипом 1 (текстовый блоб) и размером сегмента 400. Для таблицы определен первичный ключ, состоящий из трех полей JOB_CODE, JOB_GRADE и JOB_REGION. Далее, определен внешний ключ (JOB_REGION), ссылающийся на поле REGION таблицы REGION. И, наконец, включено предложение CHECK, позволяющее производить проверку соотношения для двух полей и вызывать исключительное состояние при нарушении такого соотношения. Пример D: Таблица с вычисляемым полем

    Данный пример создает таблицу, где среди других полей имеется вычисляемое (физически не существующее) поле NEW_SALARY, значение которого вычисляется по значениям двух других полей (OLD_SALARY и PERC_CHANGE).

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

    Итак, мы рассмотрели, как создавать таблицы с помощью SQL-выражений. Ётот процесс, хотя и не столь удобен, как интерактивное средство Database Desktop, однако обладает наиболее гибкими возможностями по настройке Вашей системы и управления ее связями.

    Источник

    SQLite в Delphi: большой обзор и LiteDAC в примерах

    Содержание

    1. Введение
    2. 1. Что представляет из себя SQLite и как всё устроено в SQLite?
    3. 2. Кто использует SQLite?
    4. 3. Какие инструменты использовать для администрирования баз данных SQLite?
    5. 4. Какие компоненты есть в Delphi для доступа к SQLite?
    6. 5. Установка и настройка LiteDAC
    7. 6. Первая база данных SQLite в Delphi
    8. 6.1. Создаем базу данных с помощью SQLite Expert
    9. 6.2. Создание базы данных с помощью LiteDAC
    10. 7. Шифрование базы данных с помощью LiteDAC
    11. 7.1. Шифруем существующую базу данных
    12. 7.2. Создаем или открываем зашифрованную базу данных
    13. 7.3. Меняем ключ шифрования базы данных
    14. 8. Запись данных в базу SQLite
    15. 8.1. Используем транзакции
    16. 8.2. Используем настройки базы данных
    17. 8.2.1. PRAGMA synchronous
    18. 8.2.2. PRAGMA temp_store
    19. 8.3. Используем возможности LiteDAC
    20. 8.4. График скорости записи данных в базу SQLite
    21. 8.5. Настройка TLiteSQL в Design-Time
    22. 9. Как исключить дублирование записей в таблице?
    23. 10. Как сократить размер файла базы данных?
    24. 11. Использование обзоров (VIEW) в SQLite
    25. 12. Дополнительные возможности по работе с SQLite в Delphi при использовании LiteDAC
    26. 12.1. Создание дампа базы SQLite
    27. 12.2. Макросы в LiteDAC
    28. 12.3 Мониторинг запросов к SQLite в LiteDAC
    29. 13. Подведем итог
    30. Книжная полка

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

    Читайте также:  Муж размеры футболок таблица

    В качестве компонентов для доступа к SQLite в Delphi я, как Вы понимаете, буду использовать LiteDAC. На данный момент последняя версия этих компонентов – 2.7.24. если же Вы не используете эти компоненты по каким-либо причинам, то я вам советую начать их использовать, так как пока я ещё не встретил более простых и понятных компонентов для работы с базами данных. Однако, если Вы используете для работы с SQLite что-либо другое, то этот обзор также может оказаться для вас полезным, потому что здесь будет рассматриваться не только работа LiteDAC, но и, в принципе, работа с SQLite.

    Введение

    Для начала, определимся с тем, какая информацию из блога будет использоваться в этом обзоре. В качестве исходных данных для статьи я использовал следующий материал блога webdelphi.ru:

    Как видите, обзор охватывает период с 2010 по 2015 год и за 5 лет, что компоненты доступа к SQLite в Delphi, что сама СУБД претерпели изменения. Итак, начнем по порядку.

    1. Что представляет из себя SQLite и как всё устроено в SQLite?

    SQLite — это компактная встраиваемая реляционная база данных. Для нас, как для разработчиков это говорит о том, что:

    1. SQLite легко настраивать. Для работы с SQLite не требуется установка дополнительного программного обеспечения (разве что для удобства разработки поставить какую-нибудь утилиту администрирования базы данных, но об этом чуть ниже). Всё, что необходимо, чтобы начать работу – это положить рядом с exe-файлом вашей программы небольшую динамическую библиотеку sqlite3.dll и использовать базовые методы (SQLite API) этой dll.
    2. SQLite просто использовать. Хотите – используйте методы dll, хотите – специальные компоненты, как платные, так и бесплатные. На сегодняшний день для Delphi имеется целый ряд компонентов, позволяющих работать с SQLite, в том числе и поставляемые вместе с RAD Studio.

    База данный SQLite представляет из себя обычный файл, который может располагаться где угодно, лишь бы вы смогли получить к этому файлу доступ – даже на CD- или DVD-диске, правда, в этом случае вы сможете только читать базу, но не записывать в неё данные (что характерно). В итоге получаем: один файл – одна база данных. Легко, просто, понятно. Естественно, что если Вы только выбираете какую базу данных использовать в своем приложении, то одним из критериев выбора являются ограничения той или иной СУБД. Давайте посмотрим на ограничения СУБД SQLite.

    Со всем списком ограничений SQLite Вы можете ознакомиться на официальном сайте, я же обращу внимание только на основные моменты. Итак ограничения, используемые по умолчанию:

    Описание Значение Константа в исходнике
    Максимальная длина строки или BLOB-поля 1 000 000 000 SQLITE_MAX_LENGTH
    Максимальное количество колонок 2 000 SQLITE_MAX_COLUMN
    Максимальная длина SQL-выражения 1 000 000 SQLITE_MAX_SQL_LENGTH
    Максимальное количество таблиц в выражениях с JOIN 64
    Максимальная глубина дерева выражений 1 000 SQLITE_MAX_EXPR_DEPTH
    Максимальное количество аргументов функции 100 SQLITE_MAX_FUNCTION_ARG
    Максимальное количество термов в объединённом выражении с SELECT 500 SQLITE_MAX_COMPOUND_SELECT
    Максимальная длина шаблона как аргумента операторов LIKE или GLOB 50 000 SQLITE_MAX_LIKE_PATTERN_LENGTH
    Максимальное количество символов-заменителей в одном SQL-выражении 999 SQLITE_MAX_VARIABLE_NUMBER
    Максимальная глубина рекурсии триггеров 1 000 SQLITE_MAX_TRIGGER_DEPTH
    Максимальное количество присоединённых баз 10 SQLITE_MAX_ATTACHED
    Максимальный размер страницы базы данных 32 768 SQLITE_MAX_PAGE_SIZE
    Максимальное количество страниц в файле базы данных 1 073 741 823 SQLITE_MAX_PAGE_COUNT

    Как видите, ограничения более, чем приемлемые для разработки более менее серьезных приложений. Конечно, в случае острой необходимости Вы всегда сможете поменять некоторые ограничения в большую сторону (например, установить максимальное количество присоединенных баз данных в максимально возможное значение – 125), однако, лично мне с трудом представляется то, какое приложение надо писать в Delphi, чтобы превысить лимиты по умолчанию. Что же касается максимального размера файла базы данных, то, согласно официальной документации, в настоящее время максимально возможный размер файла БД SQLite составляет 140 Тб, однако конкретно это ограничение не тестировалось, так как разработчики SQLite не имеют доступа к программным и аппаратным средствам способных достичь такого лимита…что уж говорить нам – простым смертным пользователям SQLite.

    2. Кто использует SQLite?

    Еще один немаловажный момент при выборе СУБД, который волнует разработчиков – кто это использует? В особенности, если рассматриваются бесплатные инструменты и средства с открытым исходным кодом (к которым относится и SQLite). Ведь, как часто бывает, даже самый гениальный проект с открытым исходным кодом может внезапно уйти в небытие и разработчик останется ни с чем: морально устаревающий со временем инструмент, отсутствие поддержки и так далее. И здесь в пользу того или иного компонента или инструмента разработчика играет наличие в рядах пользователей наиболее титулованных и популярных компаний – уж, если они не боятся использовать что-то бесплатное, то всяко-разно есть шанс, что поддержка продукта будет идти регулярно и долго (по данным официального сайта, SQLite планируется поддерживать вплоть до 2050 года).

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

    1. Google Chrome
    2. Skype
    3. Opera
    4. FireFox
    5. ThunderBird
    6. Safari
    7. Практически все программное обеспечение для Android, которому необходимо хранить какие-либо данные (в Android встроена поддержка SQLite)

    В дополнение (могу, конечно, сейчас немного ошибиться, так как давно не заглядывал в работы этим приложений) также скажу, что SQLite использовался такими клиентами облачных хранилищ как Dropbox и Google Drive.

    3. Какие инструменты использовать для администрирования баз данных SQLite?

    Как говориться, на вкус и цвет фломастеры разные и каждый сам выбирает что использовать для администрирования баз данных SQLite: кому-то (как мне, например) по душе “тяжеловесные” программы типа SQLite Expert в которых можно сделать с базой всё, что угодно, другому – подавай легкий маленький и шустрый инструмент, чтобы только посмотреть структуру, добавить пару строк или таблиц в БД и забыть. Разные потребности, соответственно, рождают самые различные предложения. А, учитывая достаточно высокую популярность SQLite, можно смело говорить о том, что выбор программы для администрирования баз SQLite более, чем достаточен даже для самого привередливого пользователя. Когда я начинал свое знакомство с SQLite, то проводил небольшой обзор решение в области администрирования SQLite, но, как я уже писал выше, всё меняется и рынок программных продуктов также претерпевает свои изменения. Поэтому в этой статье, я лишь перечислю рассмотренные ранее программные продукты, а также дополню обзор другими приложениями, о которых мне сообщали Вы, уважаемые читатели, в своих комментариях к статьям.

    trial на 30 дней

    версии “Professional” от $59

    Не рассмотренные ранее программные продукты

    Таким образом, у нас в наличии семь различных программных продуктов для управления базами SQLite – более, чем достаточно, чтобы выбрать инструмент по своим потребностям. Я же, в дальнейшем буду использовать давно испытанный SQLite Expert Personal.

    4. Какие компоненты есть в Delphi для доступа к SQLite?

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

    В теперь уже далеком 2010-м году, когда мы радовались выходу Delphi 2010 и обсуждали её новинки, на рынке компонентов Delphi для SQLite было совсем не радостно. Конечно, уже тогда были свои решения для работы с SQLite (всё-таки SQLite стартовала ещё раньше – в 2000-м году), но, тем не менее сама Delphi не могла похвастаться работой с SQLite “из коробки”. Однако, тем, кому было необходимо использовать эту СУБД в Delphi-проектах, было вполне достаточно на первоначальном этапе использовать Delphi wrapper for Sqlite 3 от Тима Андерсона (Tim Anderson). Эти простые в работе классы для SQLite в Delphi и сейчас доступны для скачивания и, даже, со временем стали поддерживать Unicode. Этим же wrapper’ом пользовался и я в свое время, когда только начинал разбираться с SQLite.

    На базе Delphi wrapper for Sqlite 3 также развивались такие обёртки для SQLite в Delphi, как Delphi SQLite Wrapper от разработчика библиотеки Synapse и компоненты от sv-utils. Все эти обёртки вносили какие-то улучшения в работу с SQLite (добавлялась работа с параметрами, поддержка Unicode, кроссплатформенность и т.д.), однако, повторюсь, они базировались на обёртке от Тима Андерсона. В настоящее время все эти замечательные миниатюрные компоненты, видимо, заброшены авторами, так как даты последних обновлений не особенно вселяют надежду на их дальнейшее развитие – 2012-2013 год. Из более менее “живых” бесплатных компонентов можно выделить ZeosLib, которой я пользовался ещё в бытность Delphi 7, а также компоненты DISQLite3 от разработчика SQLiteSpy.

    Это, в принципе, и понятно, потому как прошло несколько лет и Embarcadero представила нам новый релиз – Delphi XE3, которая позволяла работать с базами SQLite, используя DBExpress. И, как говориться, жизнь стала налаживаться. Прошло совсем немного времени и уже 5 февраля 2013 года Embarcadero заявила в своем пресс-релизе о покупке компонентов AnyDAC (ныне известных под названием FireDAC) – мощной библиотеки компонентов для доступа практически к любым базам данных, включая и SQLite. Таким образом, мы уже имели возможность после покупки лицензии на Delphi свободно использовать для доступа к базам данных SQLite:

    1. Бесплатные обёртки от различных разработчиков “Delphi SQLite Wrapper”, “Delphi wrapper for SQLite 3“, sv-utils и т.д.
    2. Бесплатные библиотеки компонентов (ZeosLib, FireDAC)
    3. Технологию DBExpress
    4. Компоненты (DISQLite).

    Однако, обилие различных бесплатных и относительно бесплатных решений в области работы с SQLite в Delphi нисколько не затормозило разработку платных компонентов для доступа к SQLite. И здесь, наиболее ярким представителем, на мой взгляд, является компания Devart с их замечательными компонентами для доступа к SQLite – LiteDAC (стоимость компонентов на данный момент составляет от 6800 руб.).

    Таким образом, на сегодняшний день можно сделать вывод, что для работы с SQLite в Delphi нет никаких препятствий. Ваши возможности ограничиваются лишь вашими потребностями в той или иной функциональности компонентов. Я же, как и три года назад, в работе использую компоненты от Devart LiteDAC. И теперь перейдем непосредственно к работе с SQLite в Delphi.

    5. Установка и настройка LiteDAC

    Скачать пробную версию компонентов можно с официального сайта Devart. После того, как установщик скачан, запускаем его и устанавливаем компоненты. После установки компонентов на вкладке LiteDAC в Delphi появится вот такой набор компонентов:

    Источник