Нестандартные GUI-тулкиты: базы данных в Ultimate++
Содержание:
1.Сессии и объекты запросов (Вы читаете данный раздел);
2. SqlExp;
3. Схемы баз данных;
4. Виджеты для работы с базами данных.
Не секрет, что современное коммерческое программирование очень часто ориентировано на работу с базами данных. Удобство работы с базами данных и скорость написания пользовательских интерфейсов к ним часто являются решающим фактором при выборе тулкита и среды разработки. Создатели U++ хорошо понимают это, так что удобная работа с базами данных является одной из самых сильных сторон этого тулкита. Как и во всех других сферах, при работе с базами данных проявляется необычность U++, которая, тем не менее, оборачива-ется серьезной экономией времени при рутинной работе с запросами SQL.
В U++ имеются интерфейсы к СУБД SQLite3, MySQL, PostgreSQL и Oracle. В этой статье я буду использовать SQLite3, поскольку она непосредственно включена в состав U++ и не требует инсталляции или конфигурирования. Ее можно использовать сразу же, не отвлекаясь на особенности администрирования «больших» баз данных, не имеющие отношения к U++.
Ultimate++ позволяет создавать программные решения практически любой сложности на языке программирования C++. Так, поговаривают, что первые ревизии Яндекс.Браузер создавались именно при помощи данного инструментария. Ну а ознакомится с последней версией данного интернет-браузера Вы сможете на http://onebooks.ru (http://onebooks.ru/brauzery/22-yandeks.brauzer.html).
Доступ к базам данных в U++ реализован с помощью плагинов, что позволяет относительно легко добавлять интерфейсы к новым типам баз данных. Подключить плагин для SQLite3 можно так:
Работа с БД в U++ начинается с создания объекта сессии. Его название зависит от используемой базы данных и в случае SQLite3 выглядит так:
Далее следует соединиться с существующей базой данных. Для SQLite3 используется метод Open, которому передается имя файла базы данных. Для других СУБД название метода и передаваемые параметры могут быть другими - в частности, для более «серьезных» баз нужно передавать имя пользователя и пароль.
Для отладки очень полезным бывает метод SetTrace(), который выводит в стандартный лог все выполняемые базой команды SQL:
После создания сессии нужно создать объект для обработки SQL-запросов, который «привязан» к определенной сессии:
Как правило, в программе используется только одна сессия и передача ее как параметра ко всем запросам становится избыточной. В этом случае можно использовать переменную так называемой «главной базы данных» (Main Database) с именем «SQL». Ей присваивается объект сессии и все создаваемые объекты запросов автоматически «привязываются» к этой сессии:
Методы объекта запроса имеют интуитивно понятные имена, поэтому я сразу приведу готовый пример, который создает новую таблицу и наполняет ее целыми числами и их квадратами:
В запросе Execute можно (и нужно) использовать «заполнители» (placeholders). На место знаков «?» вставляются передаваемые дальнейшими параметрами данные наподобие функции printf(). Метод Fetch() обеспечивает итерацию по строкам запроса, а доступ к столбцам осуществляется по индексу оператором [].
1.
2. SqlExp;
3. Схемы баз данных;
4. Виджеты для работы с базами данных.
Не секрет, что современное коммерческое программирование очень часто ориентировано на работу с базами данных. Удобство работы с базами данных и скорость написания пользовательских интерфейсов к ним часто являются решающим фактором при выборе тулкита и среды разработки. Создатели U++ хорошо понимают это, так что удобная работа с базами данных является одной из самых сильных сторон этого тулкита. Как и во всех других сферах, при работе с базами данных проявляется необычность U++, которая, тем не менее, оборачива-ется серьезной экономией времени при рутинной работе с запросами SQL.
В U++ имеются интерфейсы к СУБД SQLite3, MySQL, PostgreSQL и Oracle. В этой статье я буду использовать SQLite3, поскольку она непосредственно включена в состав U++ и не требует инсталляции или конфигурирования. Ее можно использовать сразу же, не отвлекаясь на особенности администрирования «больших» баз данных, не имеющие отношения к U++.
Ultimate++ позволяет создавать программные решения практически любой сложности на языке программирования C++. Так, поговаривают, что первые ревизии Яндекс.Браузер создавались именно при помощи данного инструментария. Ну а ознакомится с последней версией данного интернет-браузера Вы сможете на http://onebooks.ru (http://onebooks.ru/brauzery/22-yandeks.brauzer.html).
Сессии и объекты запросов
Доступ к базам данных в U++ реализован с помощью плагинов, что позволяет относительно легко добавлять интерфейсы к новым типам баз данных. Подключить плагин для SQLite3 можно так:
#include
#include
#include
Работа с БД в U++ начинается с создания объекта сессии. Его название зависит от используемой базы данных и в случае SQLite3 выглядит так:
Sqlite3Session session;
Далее следует соединиться с существующей базой данных. Для SQLite3 используется метод Open, которому передается имя файла базы данных. Для других СУБД название метода и передаваемые параметры могут быть другими - в частности, для более «серьезных» баз нужно передавать имя пользователя и пароль.
if(!session.Open(ConfigFile("simple.db"))) {
Cout() << "Can't create or open database filen";
return;
}
Cout() << "Can't create or open database filen";
return;
}
Для отладки очень полезным бывает метод SetTrace(), который выводит в стандартный лог все выполняемые базой команды SQL:
#ifdef _DEBUG
session.SetTrace();
#endif
session.SetTrace();
#endif
После создания сессии нужно создать объект для обработки SQL-запросов, который «привязан» к определенной сессии:
Sql sql(session);
Как правило, в программе используется только одна сессия и передача ее как параметра ко всем запросам становится избыточной. В этом случае можно использовать переменную так называемой «главной базы данных» (Main Database) с именем «SQL». Ей присваивается объект сессии и все создаваемые объекты запросов автоматически «привязываются» к этой сессии:
SQL = session; // Задать сессию глобально
Sql db; // Автоматически используется сессия, заданная
// для глобального объекта SQL
Sql db; // Автоматически используется сессия, заданная
// для глобального объекта SQL
Методы объекта запроса имеют интуитивно понятные имена, поэтому я сразу приведу готовый пример, который создает новую таблицу и наполняет ее целыми числами и их квадратами:
#include
#include
using namespace Upp;
CONSOLE _ APP _ MAIN{
Sqlite3Session session; if(!session.Open(ConfigFile("simple.db"))) {
Cout() << "Can't create or open database filen";
return;
}
#ifdef _ DEBUG
session.SetTrace();
#endif
SQL = session;
Sql db;
db.Execute("drop table TEST"); // Удалить таблицу, если она уже есть db.ClearError(); // Очистить буфер ошибок
// Создать таблицу. Первый столбец — число, второй — его квадрат // в текстовом виде
db.Execute("create table TEST (A INTEGER, B TEXT)"); // Наполняем таблицу for(int i = 0; i < 10;
db.Execute("insert into TEST(A, B) values (?, ?)", J i, AsString(i * i)); // Выборка из таблицы db.Execute("select * from TEST"); // Выводим имена колонок for(int i = 0; i < db.GetColumns(); i++)
Cout() << db.GetColumnInfo(i).name << "n"; // Выводим значения while(db.Fetch())
Cout() << db[0] << " '" << db[1] << "'n";
ReadStdIn(); // Чтобы консольное окно не закрывалось
}
#include
using namespace Upp;
CONSOLE _ APP _ MAIN{
Sqlite3Session session; if(!session.Open(ConfigFile("simple.db"))) {
Cout() << "Can't create or open database filen";
return;
}
#ifdef _ DEBUG
session.SetTrace();
#endif
SQL = session;
Sql db;
db.Execute("drop table TEST"); // Удалить таблицу, если она уже есть db.ClearError(); // Очистить буфер ошибок
// Создать таблицу. Первый столбец — число, второй — его квадрат // в текстовом виде
db.Execute("create table TEST (A INTEGER, B TEXT)"); // Наполняем таблицу for(int i = 0; i < 10;
db.Execute("insert into TEST(A, B) values (?, ?)", J i, AsString(i * i)); // Выборка из таблицы db.Execute("select * from TEST"); // Выводим имена колонок for(int i = 0; i < db.GetColumns(); i++)
Cout() << db.GetColumnInfo(i).name << "n"; // Выводим значения while(db.Fetch())
Cout() << db[0] << " '" << db[1] << "'n";
ReadStdIn(); // Чтобы консольное окно не закрывалось
}
В запросе Execute можно (и нужно) использовать «заполнители» (placeholders). На место знаков «?» вставляются передаваемые дальнейшими параметрами данные наподобие функции printf(). Метод Fetch() обеспечивает итерацию по строкам запроса, а доступ к столбцам осуществляется по индексу оператором [].