Вслед за анонсом новой версии DatabaseLayer, кросс-платформенной библиотеки для работы с базами данных, решил выложить небольшой туториал с примером использования DatabaseLayer.
В этот раз мы рассмотрим пример создания простейшего консольного приложения, использующего эту библиотеку для работы с базами данных.
В качестве среды разработки будем использовать Visual Studio. Это самый простой способ добиться желаемого результата. Бесплатная версия Visual Studio Express Edition тоже вполне подойдет для создания приложений на С++/wxWidgets.
Для начала создадим консольное приложение и назовем его DatabaseLayerMinimal.

В настройках проекта указываем тип приложение Console Application и стамим маркер на Empty Project.

После того как мы создали проект, распаковываем DatabaseLayer рядом с папкой, в которой находится .sln-файл решения.

Затем добавляем в решение проект databaselayer_databaselayer_sqlite.dsp - это проект SqliteDatabaseLayer, который позволяет получить доступ к базам данных SQLite в приложении.
После этого необходимо настроить конфигурации сборки. Открываем Configuration Manager (Build -> Configuration Manager) и устанавливаем для проекта databaselayer_sqlite нужную отладочную и финальную конфигурацию. В нашем примере это Static Unicode Debug Multilib Static и Static Unicode Release Multilib Static.

После этого в нашем проекте приложения необходимо настроить пути для поиска заголовочных файлов, файлов библиотек, а также список дополнительных библиотек для сборки проекта.
Для этого в свойствах проекта в разделе C/C++ -> General в свойстве Additional Include Directories прописываем:
$(SolutionDir)..\databaselayer\include
В разделе Linker -> General в свойстве Additional Library Directories прописываем:
$(SolutionDir)..\databaselayer\lib\vc_lib
В разделе Linker -> Input в свойстве Additional Dependencies указываем список необходимых библиоек:

Все, настройку проекта мы закончили, теперь можно заняться написанием кода.
Для каждого сервера баз данных в библиотеке DatabaseLayer существует соответствующий класс соединения. В нашем примере мы будем работать с базой данных SQLite. Для этого будем использовать класс SqliteDatabaseLayer.
Для того чтобы открыть базу данных можно использовать два пути:
В нашем примере будет использоваться первый способ.
Для разрыва соединения с базой данных (или для закрытия файла базы данных) используется метод Close().
В библиотеке DatabaseLayer для обработки ошибок используется механизм исключений. Для обработки ошибок необходимо отлавливать исключение DatabaseLayerException.
Итак, минимальное приложение, способное открыть базу данных выглядит так:
#include <wx/wx.h>
#include <DatabaseLayer.h>
#include <SqliteDatabaseLayer.h>
#include <DatabaseLayerException.h>
int main()
{
int returnCode(0);
DatabaseLayer * connection(NULL);
do
{
try
{
connection = new SqliteDatabaseLayer(wxT("Minimal.sqlite"), false);
}
catch(DatabaseLayerException & e)
{
returnCode = 2;
wxPrintf(wxT("%d %s"), e.GetErrorCode(), e.GetErrorMessage().GetData());
}
}
while(false);
wxDELETE(connection);
getchar();
return returnCode;
Необходимо помнить, что все ресурсы нужно освобождать руками.
Для выборки данных из таблицы используется метод RunQueryWithResults(), который возвращает указатель но объект DatabaseResultSet. После работы с результатми запроса, объект DatabaseResultSet необходимо обязательно закрыть во избежание утечек памяти. Сделать это можно, вызывав метод DatabaseLayer::CloseResultSet().
Для обхода записей, возвращенных с помощью метода RunQueryWithResults() используется метод DatabaseResultSet::Next().
Для получения значения поля в классе DatabaseResultSet существует соответствующий набор методов - GetResultInt(), GetResultString(), GetResultBool() и т.д. Каждый из этих методов может принимать как имя поля, так и порядковый номер (zero-based).
Для запросов, которые не возвращают список записей (INSERT, DELETE) используется метод RunQuery().
И вот со всем, описанным выше, мы подошли к рассмотрению более сложного примера - приложение открывает базу данных SQLite, проверяет ее на наличие таблиц. Если таблицы не найдены, то приложение создает одну таблицу и заполняет ее данными. После этого происходит выборка данных и отображение результатов выборки в консоли.
#include <wx/wx.h>
#include <DatabaseLayer.h>
#include <SqliteDatabaseLayer.h>
#include <DatabaseLayerException.h>
int main()
{
int returnCode(0);
DatabaseLayer * connection(NULL);
DatabaseResultSet * result(NULL);
do
{
try
{
connection = new SqliteDatabaseLayer(wxT("Minimal.sqlite"), false);
result = connection->RunQueryWithResults(
wxT("SELECT * FROM sqlite_master WHERE type='table'"));
if(!result || !result->Next())
{
connection->RunQuery(
wxT("CREATE TABLE SampleTable \
(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
Name VARCHAR(32))"));
for(int i = 0; i < 5; i++)
{
connection->RunQuery(wxString::Format(
wxT("INSERT INTO SampleTable (Name) VALUES ('%i')"), rand()));
}
}
if(result)
{
connection->CloseResultSet(result);
result = NULL;
}
result = connection->RunQueryWithResults(wxT("SELECT * FROM SampleTable"));
if(!result)
{
returnCode = 1;
break;
}
while (result->Next())
{
wxPrintf(wxT("%d - %s\r\n"),
result->GetResultInt(wxT("ID")),
result->GetResultString(wxT("Name")).GetData());
}
}
catch(DatabaseLayerException & e)
{
returnCode = 2;
wxPrintf(wxT("%d %s"), e.GetErrorCode(), e.GetErrorMessage().GetData());
}
}
while(false);
if(connection)
{
if(result) connection->CloseResultSet(result);
}
wxDELETE(connection);
getchar();
return returnCode;
}
}
Скачать исходный код примера.
Последние комментарии