Ultimate++: виджеты для работы с базами данных
Содержание:
1. Сессии и объекты запросов;
2. SqlExp;
3. Схемы баз данных;
4.Виджеты для работы с базами данных (Вы читаете данный раздел).
В U++ есть специальный виджет SqlArray, который отображает данные из выбранной таблицы, а также позволяет редактировать, вставлять и удалять записи. Чтобы этот виджет работал в полную силу и позволял вставлять записи, таблица должна иметь ключ с атрибутом AUTO_INCREMENT. Добавим в схему нашей базы ключ:
Теперь создадим новый lay-файл app.lay, а в нем - компоновку с именем Main, которая содержит единственный виджет SqlArray с именем arr (как это сделать, подробно описано в предыдущей части статьи). Создание GUI-приложения с использованием компоновок я уже разбирал, поэтому сразу приведу готовый код программы. Нетривиальные моменты выделены жирным шрифтом:
В этом коде все уже привычно - кроме строк, относящихся к виджету SqlArray. В этом виджете устанавливается имя таблицы, к которой он будет «привязан» и имя поля-ключа. Далее добавляются те столбцы, которые мы хотим видеть. Метод Edit каждого конкретного столбца позволяет назначить виджет для его редактирования. Эти виджеты должны быть объявлены членами класса, куда входит сам SqlArray (в нашем случае - App), но не должны отображаться на форме (т.е. не нужно включать их в компоновку или явно вызывать для них метод Add()). При входе в режим редактирования эти виджеты автоматически вставляются непосредственно в нужную ячейку таблицы. Наконец, метод AppendingAuto() разрешает добавлять пустые строки (заполненные значениями NULL), которые затем можно отредактировать. Это самый простой вариант, но он требует обязательного наличия в таблице ключа.
Второй нетривиальный момент связан с применением функции ScriptChanged() в основной программе. Она может вызываться с разными флагами и позволяет корректно обрабатывать любые несоответствия между реальной структурой базы данных и структурой, описанной в загруженном файле схемы. Если такие несоответствия найдены, то вызывается Sqlite3PerformScript(), которой передаются нужные параметры схемы. В результате, автоматически генерируются запросы на создание, удаление или модификацию столбцов таблицы, чтобы привести ее в соответствие со схемой. Такой механизм очень удобен и позволяет конструировать базу, внося последовательные изменения в ее структуру (Incremental development). Детальное описание этого метода имеется в документации (http://www.ultimatepp.org/srcdo c$Sql$IncrementalDevelopment$en-us.html).
Скомпилировав программу, получим работающий интерфейс к базе данных. Встроенное контекстное меню виджета SqlArray позволяет вставлять, удалять и редактировать записи (см. рисунок выше). SqlArray можно использовать и для редактирования связанных таблиц - в официальной документации есть соответствующие примеры (http://www.ultimatepp.org/reference$SqlArray$en-us.html, http://www.ultimatepp.org/examples$SQLApp$en-us.html).
В следующей, завершающей, части статьи, посвященной U++, будут рассмотрены работа с графикой и другие возможности U++, а также подведены итоги.
Итак, с U++ мы закончили и теперь давайте поговорим о здоровье ваших зубов! Сегодня стоматология (http://www.zub.ru/) - высокотехнологичная медицина, которая позволяет опытным специалистам творить настоящие чудеса! Узнайте подробности прямо сейчас на сайте www.zub.ru!
1. Сессии и объекты запросов;
2. SqlExp;
3. Схемы баз данных;
4.
В U++ есть специальный виджет SqlArray, который отображает данные из выбранной таблицы, а также позволяет редактировать, вставлять и удалять записи. Чтобы этот виджет работал в полную силу и позволял вставлять записи, таблица должна иметь ключ с атрибутом AUTO_INCREMENT. Добавим в схему нашей базы ключ:
INT _ (ID) PRIMARY _ KEY AUTO _ INCREMENT
Теперь создадим новый lay-файл app.lay, а в нем - компоновку с именем Main, которая содержит единственный виджет SqlArray с именем arr (как это сделать, подробно описано в предыдущей части статьи). Создание GUI-приложения с использованием компоновок я уже разбирал, поэтому сразу приведу готовый код программы. Нетривиальные моменты выделены жирным шрифтом:
#include
#include
using namespace Upp;
// Подключаем схему базы данных
#define SCHEMADIALECT
#define MODEL
#include "Sql/sch _header.h"
#include
#include
// Подключаем файл компоновок #define LAYOUTFILE #include
// Класс главного окна, наследуемый от компоновки Main class App: public WithMain { public:
// Строки редактирования для изменения полей в таблице EditInt A _ edit; EditString B _ edit; App(){
CtrlLayout(*this,"Hello SQL!"); // Применяем компоновку Title("Hello SQL!") .MinimizeBox() .MaximizeBox() .Sizeable();
arr.SetTable(TEST); // Устанавливаем таблицу
arr.AddKey(ID); // Устанавливаем ключ
// Добавляем столбцы и виджеты для их редактирования
arr.AddColumn(A, "Number") .Edit(A _ edit) ;
arr.AddColumn(B, "Square").Edit(B _ edit);
// Разрешаем добавление и удаление записей
arr.Appending().Removing();
arr.SetOrderBy(A); // Сортировка
arr.Query(); // Выбрать все записи в таблице
// Позволяем автоматически вставлять записи.
// Требует наличия ключа с AUTO _ INCREMENT!
arr.AppendingAuto();
}
};
GUI _ APP _ MAIN
{
// Соединяемся с базой Sqlite3Session sqlite3; if(!sqlite3.Open(ConfigFile("simple.db"))) {
ExclamationC'^ могу соединиться с базой данных! n");
return;
}
SQL = sqlite3; sqlite3.SetTrace();
// Применяем схему SqlSchema sch(SQLITE3); All _Tables(sch);
// Обрабатываем изменения структуры базы if(sch.ScriptChanged(SqlSchema::UPGRADE))
Sqlite3PerformScript(sch.Upgrade()); if(sch.ScriptChanged(SqlSchema::ATTRIBUTES))
Sqlite3PerformScript(sch.Attributes()); if(sch.ScriptChanged(SqlSchema::CONFIG)) {
Sqlite3PerformScript(sch.ConfigDrop());
Sqlite3PerformScript(sch.Config());
}
// Запускаем цикл обработки событий
App app;
app.Run();
}
#include
using namespace Upp;
// Подключаем схему базы данных
#define SCHEMADIALECT
#define MODEL
#include "Sql/sch _header.h"
#include
#include
// Подключаем файл компоновок #define LAYOUTFILE
// Класс главного окна, наследуемый от компоновки Main class App: public WithMain
// Строки редактирования для изменения полей в таблице EditInt A _ edit; EditString B _ edit; App(){
CtrlLayout(*this,"Hello SQL!"); // Применяем компоновку Title("Hello SQL!") .MinimizeBox() .MaximizeBox() .Sizeable();
arr.SetTable(TEST); // Устанавливаем таблицу
arr.AddKey(ID); // Устанавливаем ключ
// Добавляем столбцы и виджеты для их редактирования
arr.AddColumn(A, "Number") .Edit(A _ edit) ;
arr.AddColumn(B, "Square").Edit(B _ edit);
// Разрешаем добавление и удаление записей
arr.Appending().Removing();
arr.SetOrderBy(A); // Сортировка
arr.Query(); // Выбрать все записи в таблице
// Позволяем автоматически вставлять записи.
// Требует наличия ключа с AUTO _ INCREMENT!
arr.AppendingAuto();
}
};
GUI _ APP _ MAIN
{
// Соединяемся с базой Sqlite3Session sqlite3; if(!sqlite3.Open(ConfigFile("simple.db"))) {
ExclamationC'^ могу соединиться с базой данных! n");
return;
}
SQL = sqlite3; sqlite3.SetTrace();
// Применяем схему SqlSchema sch(SQLITE3); All _Tables(sch);
// Обрабатываем изменения структуры базы if(sch.ScriptChanged(SqlSchema::UPGRADE))
Sqlite3PerformScript(sch.Upgrade()); if(sch.ScriptChanged(SqlSchema::ATTRIBUTES))
Sqlite3PerformScript(sch.Attributes()); if(sch.ScriptChanged(SqlSchema::CONFIG)) {
Sqlite3PerformScript(sch.ConfigDrop());
Sqlite3PerformScript(sch.Config());
}
// Запускаем цикл обработки событий
App app;
app.Run();
}
В этом коде все уже привычно - кроме строк, относящихся к виджету SqlArray. В этом виджете устанавливается имя таблицы, к которой он будет «привязан» и имя поля-ключа. Далее добавляются те столбцы, которые мы хотим видеть. Метод Edit каждого конкретного столбца позволяет назначить виджет для его редактирования. Эти виджеты должны быть объявлены членами класса, куда входит сам SqlArray (в нашем случае - App), но не должны отображаться на форме (т.е. не нужно включать их в компоновку или явно вызывать для них метод Add()). При входе в режим редактирования эти виджеты автоматически вставляются непосредственно в нужную ячейку таблицы. Наконец, метод AppendingAuto() разрешает добавлять пустые строки (заполненные значениями NULL), которые затем можно отредактировать. Это самый простой вариант, но он требует обязательного наличия в таблице ключа.
Второй нетривиальный момент связан с применением функции ScriptChanged() в основной программе. Она может вызываться с разными флагами и позволяет корректно обрабатывать любые несоответствия между реальной структурой базы данных и структурой, описанной в загруженном файле схемы. Если такие несоответствия найдены, то вызывается Sqlite3PerformScript(), которой передаются нужные параметры схемы. В результате, автоматически генерируются запросы на создание, удаление или модификацию столбцов таблицы, чтобы привести ее в соответствие со схемой. Такой механизм очень удобен и позволяет конструировать базу, внося последовательные изменения в ее структуру (Incremental development). Детальное описание этого метода имеется в документации (http://www.ultimatepp.org/srcdo c$Sql$IncrementalDevelopment$en-us.html).
Скомпилировав программу, получим работающий интерфейс к базе данных. Встроенное контекстное меню виджета SqlArray позволяет вставлять, удалять и редактировать записи (см. рисунок выше). SqlArray можно использовать и для редактирования связанных таблиц - в официальной документации есть соответствующие примеры (http://www.ultimatepp.org/reference$SqlArray$en-us.html, http://www.ultimatepp.org/examples$SQLApp$en-us.html).
В следующей, завершающей, части статьи, посвященной U++, будут рассмотрены работа с графикой и другие возможности U++, а также подведены итоги.
Итак, с U++ мы закончили и теперь давайте поговорим о здоровье ваших зубов! Сегодня стоматология (http://www.zub.ru/) - высокотехнологичная медицина, которая позволяет опытным специалистам творить настоящие чудеса! Узнайте подробности прямо сейчас на сайте www.zub.ru!