<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cross-Platform Programming with wxWidgets &#187; Database</title>
	<atom:link href="http://wxwidgets.info/category/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://wxwidgets.info</link>
	<description>Just Make It Cross-Platform</description>
	<lastBuildDate>Tue, 09 Mar 2010 20:50:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Работа с базами данных в wxWidgets &#8211; DatabaseLayer &#8211; Минимальное приложение</title>
		<link>http://wxwidgets.info/rabota-s-bazami-dannyx-v-wxwidgets-databaselayer-minimalnoe-prilozhenie/</link>
		<comments>http://wxwidgets.info/rabota-s-bazami-dannyx-v-wxwidgets-databaselayer-minimalnoe-prilozhenie/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 14:23:55 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[DatabaseLayer]]></category>

		<guid isPermaLink="false">http://wxwidgets.info/?p=527</guid>
		<description><![CDATA[Вслед за анонсом новой версии DatabaseLayer, кросс-платформенной библиотеки для работы с базами данных, решил выложить небольшой туториал с примером использования DatabaseLayer. В этот раз мы рассмотрим пример создания простейшего консольного приложения, использующего эту библиотеку для работы с базами данных. В качестве среды разработки будем использовать Visual Studio. Это самый простой способ добиться желаемого результата. Бесплатная [...]]]></description>
			<content:encoded><![CDATA[<p>Вслед за <a title="Анонс DatabaseLayer 1.8" href="http://wxwidgets.info/databaselayer-18-released/" target="_blank">анонсом</a> новой версии <strong>DatabaseLayer</strong>, кросс-платформенной библиотеки для работы с базами данных, решил выложить небольшой туториал с примером использования <strong>DatabaseLayer</strong>.</p>
<p>В этот раз мы рассмотрим пример создания простейшего консольного приложения, использующего эту библиотеку для работы с базами данных.</p>
<p><span id="more-527"></span>В качестве среды разработки будем использовать Visual Studio. Это самый простой способ добиться желаемого результата. Бесплатная версия Visual Studio Express Edition тоже вполне подойдет для создания приложений на С++/wxWidgets.</p>
<p>Для начала создадим консольное приложение и назовем его DatabaseLayerMinimal.</p>
<p><img class="alignnone size-full wp-image-528" title="databaselayerminimal_01" src="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal_01.png" alt="databaselayerminimal_01" /></p>
<p>В настройках проекта указываем тип приложение Console Application и стамим маркер на Empty Project.</p>
<p><img class="alignnone size-full wp-image-529" title="databaselayerminimal_02" src="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal_02.png" alt="databaselayerminimal_02" /></p>
<p>После того как мы создали проект, распаковываем DatabaseLayer рядом с папкой, в которой находится .sln-файл решения.</p>
<p><img class="alignnone size-full wp-image-530" title="databaselayerminimal_03" src="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal_03.png" alt="databaselayerminimal_03" /></p>
<p>Затем добавляем в решение проект <strong>databaselayer_databaselayer_sqlite.dsp</strong> &#8211; это проект SqliteDatabaseLayer, который позволяет получить доступ к базам данных SQLite в приложении.</p>
<p>После этого необходимо настроить конфигурации сборки. Открываем Configuration Manager (Build -&gt; Configuration Manager) и устанавливаем для проекта databaselayer_sqlite нужную отладочную и финальную конфигурацию. В нашем примере это <strong>Static Unicode Debug Multilib Static</strong> и <strong>Static Unicode Release Multilib Static</strong>.</p>
<p><img class="alignnone size-full wp-image-531" title="databaselayerminimal_04" src="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal_04.png" alt="databaselayerminimal_04" width="645" height="404" /></p>
<p>После этого в нашем проекте приложения необходимо настроить пути для поиска заголовочных файлов, файлов библиотек, а также список дополнительных библиотек для сборки проекта.</p>
<p>Для этого в свойствах проекта в разделе <strong>C/C++ -&gt; General </strong>в свойстве Additional Include Directories прописываем:</p>
<pre class="brush: jscript;">
$(SolutionDir)..\databaselayer\include
</pre>
<p>В разделе <strong>Linker -&gt; General </strong>в свойстве Additional Library Directories прописываем:</p>
<pre class="brush: jscript;">
$(SolutionDir)..\databaselayer\lib\vc_lib
</pre>
<p>В разделе <strong>Linker -&gt; Input </strong>в свойстве Additional Dependencies указываем список необходимых библиоек:</p>
<p><img class="alignnone size-full wp-image-532" title="databaselayerminimal_05" src="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal_05.png" alt="databaselayerminimal_05" /></p>
<p><img id="kosa-target-image" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 15px; top: 3036px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACMElEQVQ4ja3SP2gTcRQH8O8vvUtIGmkqTY3SaMVFz6KDW2ywg4s4dGgXp3SyVLIIthCKQxCCuoZaXaSO/ilKd4sSdXRL0EWtIRYaSkXsJTH33utwSZM01xo0D353v+N+97l33/upQCAwFgwGfehiFYtFUxsYGPCmUqmv3YQTicSwBgCapnXTBQBoSinout5VVCnVDr/44B/OZH0xs6KMThCfR3LRs+aTycjvbwfCmawvduZkn7EwN4TBfheY90fXN6uYuffdyGQRu3apkmyDmzM2K8pYmBvC6kcLK+/KMEsWLCIQMSyLULUIFhH0HsGNycNYnDuO6PRno9lQSsFVh+tDQSEY6MHymzJKFQILgxkgYhALmBnMDLNsIf1sA8cG3VDYYzhFAWWfRBjCAiIbIxYQE1ga17+2GSICKLQYznCtiATEDK6BIrU5MUhgd0+NH+AIt+5jshdqgkpVwEwNkBgs9lyE4XY3nnLMWNf13QEAG1uE2JVe9PUC5JCvCMPrVpifOor1YnW34/pw7NjvVbmZ+3ljcTaMq5EjbRFJ07Gw8QfTd9fg96rc3o7bMh4f9SytvDenLl7/ZADAl5cjWF7dwmy60PaSeiPjo56lv2Ycnzi0Fp9AEgAu39x8+urtT9x5/GP74a2++LlTuumo76kDd4W9ALj9qIDIiOfBhdO+jtB9O279TFcuet77fD7Wn+sU7ajj1+kTSccb/wv/aymloEKh0Fg4HPZ2E87n86Udvs4FoWqwSHUAAAAASUVORK5CYII=" alt="" /></p>
<p>Все, настройку проекта мы закончили, теперь можно заняться написанием кода.</p>
<p>Для каждого сервера баз данных в библиотеке DatabaseLayer существует соответствующий класс соединения. В нашем примере мы будем работать с базой данных SQLite. Для этого будем использовать класс <strong>SqliteDatabaseLayer</strong>.</p>
<p>Для того чтобы открыть базу данных можно использовать два пути:</p>
<ul>
<li>Вызвать конструктор с параметрами и скормить ему путь к базе данных.</li>
<li>Использовать конструктор без параметров и метод <strong>Open</strong>().</li>
</ul>
<p>В нашем примере будет использоваться первый способ.</p>
<p>Для разрыва соединения с базой данных (или для закрытия файла базы данных) используется метод <strong>Close()</strong>.</p>
<p>В библиотеке DatabaseLayer для обработки ошибок используется механизм исключений. Для обработки ошибок необходимо отлавливать исключение <strong>DatabaseLayerException</strong>.</p>
<p>Итак, минимальное приложение, способное открыть базу данных выглядит так:</p>
<pre class="brush: cpp;">
#include &lt;wx/wx.h&gt;
#include &lt;DatabaseLayer.h&gt;
#include &lt;SqliteDatabaseLayer.h&gt;
#include &lt;DatabaseLayerException.h&gt;

int main()
{
	int returnCode(0);
	DatabaseLayer * connection(NULL);
	do
	{
		try
		{
			connection = new SqliteDatabaseLayer(wxT(&quot;Minimal.sqlite&quot;), false);
		}
		catch(DatabaseLayerException &amp; e)
		{
			returnCode = 2;
			wxPrintf(wxT(&quot;%d %s&quot;), e.GetErrorCode(), e.GetErrorMessage().GetData());
		}
	}
	while(false);
	wxDELETE(connection);
	getchar();
	return returnCode;
}
</pre>
<p>Необходимо помнить, что все ресурсы нужно освобождать руками.</p>
<p>Для выборки данных из таблицы используется метод RunQueryWithResults(), который возвращает указатель но объект <code>DatabaseResultSet</code>. После работы с результатми запроса, объект <code>DatabaseResultSet</code> необходимо <strong>обязательно закрыть</strong> во избежание утечек памяти. Сделать это можно, вызывав метод <code>DatabaseLayer::CloseResultSet()</code>.</p>
<p>Для обхода записей, возвращенных с помощью метода <code>RunQueryWithResults()</code> используется метод <code>DatabaseResultSet::Next()</code>.</p>
<p>Для получения значения поля в классе <code>DatabaseResultSet</code> существует соответствующий набор методов &#8211; <code>GetResultInt()</code>, <code>GetResultString()</code>, <code>GetResultBool()</code> и т.д. Каждый из этих методов может принимать как имя поля, так и порядковый номер (zero-based).</p>
<p>Для запросов, которые не возвращают список записей (INSERT, DELETE) используется метод <code>RunQuery()</code>.</p>
<p>И вот со всем, описанным выше, мы подошли к рассмотрению более сложного примера &#8211; приложение открывает базу данных SQLite, проверяет ее на наличие таблиц. Если таблицы не найдены, то приложение создает одну таблицу и заполняет ее данными. После этого происходит выборка данных и отображение результатов выборки в консоли.</p>
<pre class="brush: cpp;">
#include &lt;wx/wx.h&gt;
#include &lt;DatabaseLayer.h&gt;
#include &lt;SqliteDatabaseLayer.h&gt;
#include &lt;DatabaseLayerException.h&gt;

int main()
{
	int returnCode(0);
	DatabaseLayer * connection(NULL);
	DatabaseResultSet * result(NULL);
	do
	{
		try
		{
			connection = new SqliteDatabaseLayer(wxT(&quot;Minimal.sqlite&quot;), false);
			result = connection-&gt;RunQueryWithResults(
				wxT(&quot;SELECT * FROM sqlite_master WHERE type='table'&quot;));
			if(!result || !result-&gt;Next())
			{
				connection-&gt;RunQuery(
					wxT(&quot;CREATE TABLE SampleTable \
						(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
						Name VARCHAR(32))&quot;));
				for(int i = 0; i &lt; 5; i++)
				{
					connection-&gt;RunQuery(wxString::Format(
						wxT(&quot;INSERT INTO SampleTable (Name) VALUES ('%i')&quot;), rand()));
				}
			}
			if(result)
			{
				connection-&gt;CloseResultSet(result);
				result = NULL;
			}
			result = connection-&gt;RunQueryWithResults(wxT(&quot;SELECT * FROM SampleTable&quot;));
			if(!result)
			{
				returnCode = 1;
				break;
			}
			while (result-&gt;Next())
			{
				wxPrintf(wxT(&quot;%d - %s\r\n&quot;),
					result-&gt;GetResultInt(wxT(&quot;ID&quot;)),
					result-&gt;GetResultString(wxT(&quot;Name&quot;)).GetData());
			}
		}
		catch(DatabaseLayerException &amp; e)
		{
			returnCode = 2;
			wxPrintf(wxT(&quot;%d %s&quot;), e.GetErrorCode(), e.GetErrorMessage().GetData());
		}
	}
	while(false);
	if(connection)
	{
		if(result) connection-&gt;CloseResultSet(result);
	}
	wxDELETE(connection);
	getchar();
	return returnCode;
}
</pre>
<p><a href="http://wxwidgets.info//wp-content/uploads/2009/04/databaselayerminimal.7z" title="Скачать исходник: Минимальное приложение с DatabaseLayer">Скачать исходный код примера</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/rabota-s-bazami-dannyx-v-wxwidgets-databaselayer-minimalnoe-prilozhenie/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>DatabaseLayer 1.8 Released</title>
		<link>http://wxwidgets.info/databaselayer-18-released/</link>
		<comments>http://wxwidgets.info/databaselayer-18-released/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 13:36:10 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[DatabaseLayer]]></category>

		<guid isPermaLink="false">http://wxwidgets.info/?p=524</guid>
		<description><![CDATA[Yesterday jb_coder announced new version of cross-platform database access library for wxWidgets, DatabaseLayer 1.8. DatabaseLayer provides access to different types of databases using unified wxWidgets-based API. It supports: SQLite3 Firebird MySQL PostgreSQL Oracle Microsoft SQL Server ODBC Here is the list of changes for this release: Changed RunQuery message signature to return a list of [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday <a href="http://wxforum.shadonet.com/profile.php?mode=viewprofile&amp;u=295" target="_blank">jb_coder</a> announced new version of cross-platform database access library for wxWidgets, <strong>DatabaseLayer 1.8</strong>.</p>
<p><strong>DatabaseLayer</strong> provides access to different types of databases using unified wxWidgets-based API. It supports:</p>
<ul>
<li>SQLite3</li>
<li>Firebird</li>
<li>MySQL</li>
<li>PostgreSQL</li>
<li>Oracle</li>
<li>Microsoft SQL Server</li>
<li>ODBC</li>
</ul>
<p>Here is the list of changes for this release:</p>
<ul>
<li><span class="postbody">Changed RunQuery message signature to return a list of affected records<br />
</span></li>
<li><span class="postbody">Database backends are dynamically loaded (at the request of users)<br />
</span></li>
<li><span class="postbody">Ship with an internal version of SQLite3 to reduce dependency issues when compiling<br />
</span></li>
<li><span class="postbody">UNICODE fixes for ODBC code<br />
</span></li>
<li><span class="postbody">ODBC backend should now work for MS SQL Server<br />
</span></li>
<li><span class="postbody">Various fixes for ODBC, Firebird, MySQL, and PostgreSQL backends<br />
</span></li>
<li><span class="postbody">Added compile targets &#8220;databaselayer&#8221; and &#8220;databaselayer_gpl&#8221; to compile the library with multiple database backends<br />
</span></li>
<li><span class="postbody">Added DLL exports to be able to use DatabaseLayer as a dynamic library </span></li>
</ul>
<p><a title="Download DatabaseLayer 1.8 at wxCode" href="http://sourceforge.net/project/showfiles.php?group_id=51305&amp;package_id=45182&amp;release_id=337692" target="_blank">You can download DatabaseLayer 1.8 from wxCode</a></p>
<p><a href="http://wxforum.shadonet.com/viewtopic.php?t=23751" target="_blank">Read discussion of this release at wxForum</a>.</p>
<p><img id="kosa-target-image" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 434px; top: 41px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACA0lEQVQ4jbXVz0sUYRjA8e+u6xqlKJUaBZuUh6AfhyCEpUN/QIR0skMh6iHwsKe6lFu4HjpJhy5BS1CsZtDSrYMYdPHUZauDbhcpi7bEH2DOtjvP83aY3dFxxi1hfeAd3nlhPu/zPjPvOyHgKnsQEQDz60kaaKuTuRpqHxqMAKBWvVCoJOjAxqqj60Q1Y3fg05dWki/OMjt3+L+A+KklRvs+cia2VhtOTsYpN5wgl4nReTCM6s7o96UyA6kFkpNK9tZMEFx0B2bnO8hlYky/L5N9V2TDsinbgohi207fFqGxwZDoO0T67nEu9FseAyAMODWuNqC9LczUTBGrKIgqqgYRQdSgqogovy2b8YkCxzqiBBlOxuJ/earqIqqKbMfVsLYuGGMIMnb8KkTUk60HNwapTOqGCYLVDzdGDH9Km1mKiDOBMe4qmqJbl+g1wu5gtQGFZWHw8gFam/GXoILubwpxf+go336WCDJ8pYh35xkYayZ9J8aVi52+lZgt18VCif7RBeLd+X+XItX7nJHXyvkb6wD8eHOOqekVEuNffZM4icyR6s34SuGDTx/Jk715D4CTIy959XaFB0/n+Tw2TMu+jUDcMby3vg2yPW4/WuTxtYe0RJd9D9eKmodQT1eOxKVn9HR9qJZ1l3DABgGYuD7sdGR36CZsrFXqeNADhNijX9NfAyI+Sz1Sug0AAAAASUVORK5CYII=" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/databaselayer-18-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets &#8211; Часть III &#8211; Сборка проекта под Linux в Eclipse</title>
		<link>http://wxwidgets.info/wx_accessing_sqlite_3/</link>
		<comments>http://wxwidgets.info/wx_accessing_sqlite_3/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 16:37:58 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[wxWidgets]]></category>
		<category><![CDATA[DatabaseLayer]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://wxwidgets.info//?p=255</guid>
		<description><![CDATA[Продолжение статьи о работе с базами данных на wxWidgets. Первая часть статьи доступна здесь. Вторая часть доступна здесь. В третьей части рассказывается о том, как собрать приложение, использующее DatabaseLayer, SQLite и wxARG в Linux с помощью Eclipse. Я использую дистрибутив Fedora Core 5, в котором не оказалось файла libsqlite3.a, необходимого для сборки проекта. Для того [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжение статьи о работе с базами данных на wxWidgets. <a href="http://wxwidgets.info/wx_accessing_sqlite" title="Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets - Часть I">Первая часть статьи доступна здесь</a>. <a href="http://wxwidgets.info/wx_accessing_sqlite_2" title="Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets - Часть II">Вторая часть доступна здесь</a>.<br />
В третьей части рассказывается о том, как собрать приложение, использующее DatabaseLayer, SQLite и wxARG в Linux с помощью Eclipse.</p>
<p>Я использую дистрибутив <b>Fedora Core 5</b>, в котором не оказалось файла <b>libsqlite3.a</b>, необходимого для сборки проекта. Для того чтобы решить эту проблему, я удалил пакеты <b>sqlite</b> и <b>sqlite-devel</b>, затем скачал исходный код <b>sqlite</b> (<b>sqlite-x.y.z.tar.gz</b>), собрал его:</p>
<pre class="brush: cpp;">
./configure –enable-static
make
make install
</pre>
<p>После сборки <b>sqlite</b> необходимо убедиться, что путь к файлам <b>libsqlite3.so.*</b> находится в списке путей поиска библиотек. Я же просто создал ссылки на эти файлы в каталоге <b>/lib</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_27.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_27.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Теперь, если это еще не сделано, нужно удалить все .h и .cpp файлы, не относящиеся к проекту <b>databaselayer_sqlite</b> из папок <b>databaselayer/src</b> и <b>databaselayer/include</b>, а также папку <b>databaselayer/tests</b><br />
После того, как предварительная подготовка выполнена, запускаем <b>Eclipse</b> и в папке <b>databaselayer</b> создаем новый проект. Назовем его <b>SqliteDatabaseLayer</b>.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_28.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_28.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Выбираем тип проекта <b>Static Library (Gnu)</b>. Жмем <b>Finish</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_29.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_29.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>Далее идем в настройки проекта и в разделе <b>C/C++ Build -> Miscellaneous</b> в поле <b>Other flags</b> дописываем </p>
<pre class="brush: cpp;">`wx-config --cxxflags`</pre>
<p>Заметьте, кавычки обратные (кнопка со знаком ~ на клавиатуре <img src='http://wxwidgets.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )<br />
Отлично, настройки библиотеки <b>SqliteDatabaseLayer</b> мы завершили. Теперь нужно создать проект для тестового приложения.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_30.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_30.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Создаем новый проект в папке <b>SQLiteTest</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_31.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_31.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Указываем тип проекта <b>Executable (Gnu)</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_32.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_32.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
В зависимостях проекта выбираем проект библиотеки <b>SqliteDatabaseLayer</b>. Жмем <b>Finish</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_33.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_33.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
В свойствах проекта в разделе <b>C/C++ Build -> Directories</b> добавляем новые записи</p>
<ul>
<li>{ProjDirPath}/art</li>
<li>{ProjDirPath}/wxActiveRecord</li>
<li>{ProjDirPath}/../databaselayer/include</li>
</ul>
<p>Заметьте, скобки фигурные, в отличии от настроек проекта в <b>Visual Studio</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_34.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_34.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>В свойствах проекта в разделе <b>C/C++ Build -> Miscellaneous</b> в поле <b>Other flags</b> дописываем: </p>
<pre class="brush: cpp;">`wx-config --cxxflags`</pre>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_35.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_35.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
В свойствах проекта в разделе <b>C/C++ Build -> Libraries</b> добавляем новые записи</p>
<ul>
<li>SqliteDatabaseLayer
<li>
<li>sqlite3</li>
</ul>
<p>Библиотеки должны быть добавлены именно в указанной последовательности т.к. библиотека <b>libSqliteDatabaseLayer.a</b> зависит от <b>libsqlite3.a</b></p>
<p>И в списке <b>Library search path</b> добавляем запись</p>
<ul>
<li>{ProjDirPath}/../databaselayer/Debug</li>
</ul>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_36.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_36.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>В свойствах проекта в разделе <b>C/C++ Build -> GCC C++ Linker -> Miscellaneous</b> в поле <b>Linker flags</b> дописываем:</p>
<pre class="brush: cpp;">`wx-config --libs`</pre>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_37.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_37.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>Собираем проект с помощью <b>Project -> Build Project</b></p>
<p>После успешной сборки неплохо было бы запустить наше приложение и проверить его на работоспособность.<br />
Выбираем пункт меню <b>Run -> Run&#8230;</b><br />
В диалоговом окне <b>Run</b> жмем правой кнопкой на элементе <b>C/C++ Local Application</b>, выбираем пункт меню <b>New</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_38.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_38.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>После этого у нас должна появиться новая конфигурация запуска с названием <b>SQLiteTest</b><br />
Жмем кнопку <b>Search Project</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_39.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_39.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
В окне <b>Program Selection</b> выбираем наше приложение. Жмем OK<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_40.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_40.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
На вкладке <b>Debugger</b> в списке <b>Debugger</b> выбираем <b>GDB Debugger</b>. Жмем <b>Run</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_41.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_41.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Ну, вот и результат&#8230; довольно опрятно получилось.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_42.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_42.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a><br />
Диалоговое окно ввода данных выглядит вот подобным образом.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_43.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_43.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer" class="alignnone size-full wp-image-210" /></a></p>
<p>Как видим, ничего особо сложного в разработке кросс-платформенных приложений нет, но, как и любой труд, кросс-платформенная разработка программного обеспечения требует опыта и сноровки. Надеюсь, данный материал послужит толчком для новичков начать немного по-другому смотреть на свои проблемы и на способы их решения.</p>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/sqlitetest.7z" title="Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets">Скачать исходный код к статье</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/wx_accessing_sqlite_3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets &#8211; Часть 2 &#8211; wxActiveRecordGenerator (wxARG)</title>
		<link>http://wxwidgets.info/wx_accessing_sqlite_2/</link>
		<comments>http://wxwidgets.info/wx_accessing_sqlite_2/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 15:37:54 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Components]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[wxWidgets]]></category>
		<category><![CDATA[DatabaseLayer]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://wxwidgets.info//?p=233</guid>
		<description><![CDATA[Продолжение статьи, рассказывающей о работе с базами данных в wxWidgets. Первую чать статьи можно почитать здесь. В предыдущей части мы рассмотрели настройку проекта, сборку дополнительных библиотек и создание графического интерфейса приложения. В этой часит рассказывается как создать классы бизнес-логики с помощью утилиты wxARG и о том, как эти классы использовать в своем проекте. Устанавливаем утилиту [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжение статьи, рассказывающей о работе с базами данных в wxWidgets. <a href="http://wxwidgets.info/wx_accessing_sqlite" title="Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets - Часть I - Шаблон проекта и GUI">Первую чать статьи можно почитать здесь</a>.<br />
В предыдущей части мы рассмотрели настройку проекта, сборку дополнительных библиотек и создание графического интерфейса приложения. В этой часит рассказывается как создать классы бизнес-логики с помощью утилиты wxARG и о том, как эти классы использовать в своем проекте.<br />
<span id="more-233"></span><br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_16.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_16.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>Устанавливаем утилиту <b>wxARG</b>, копируем из папки, куда была установлена <b>wxARG</b> два файла <b>wxActiveRecord.h</b> и <b>wxActiveRecord.cpp</b> в папку <b>SQLiteTest/wxActiveRecord</b><br />
Здесь хотелось бы отметить, что файлы <b>wxActiveRecord.h</b> и <b>wxActiveRecord.cpp</b> из последней верчии <b>wxARG-1.2.0-rc2</b> отлично собрались вместе с тестовым проектом, хотя сама утилита работала нестабильно, из-за чего мне пришлось установить поверх нее более раннюю версию <b>wxARG-1.1.0</b>, которая работала нормально.<br />
Итак, запускаем <b>wxARG</b> и выбираем пункт меню <b>File -> Connect to database</b>, в диалоговом окне <b>Database Connection</b> указываем тип базы данных <b>SQLite3 Database</b> и путь к файлу <b>addressbook.db</b>, созданному нашим тестовым приложением. Жмем <b>Connect</b></p>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_17.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_17.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>В диалоговом окне Tables выбираем таблицы <b>groups</b> и <b>persons</b>. Жмем OK</p>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_18.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_18.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>После этого в левой части главного окна <b>wxARG</b> появится список с выбранными таблицами.<br />
Каждая таблица нашей базы данных имеет ключевое поле <b>id</b>, поэтому на вкладке <b>Properties</b> для каждой таблицы в поле <b>ID Field</b> мы указываем поле <b>id</b> и включаем маркер <b>Overwrite (delete custom stuff)</b>.</p>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_19.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_19.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>В нашей базе данных между таблицами <b>groups</b> и <b>persons</b> существует связь один-ко-многим, т.е. каждая группа может содержать множество контактов адресной книги. Переходим на вкладку <b>Relations</b>.<br />
Для таблицы <b>groups</b>:<br />
- Жмем кнопку <b>Has Many</b><br />
- В диалоговом окне <b>Relation Properties</b> указываем название таблицы со стороны &#8220;многие&#8221;, в нашем случае это таблица <b>persons</b><br />
- Указываем поле внешнего ключа в таблице <b>persons</b>. В нашем случае это <b>groupid</b><br />
Значения остальных параметров можно оставить без изменений.</p>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_20.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_20.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>Для таблицы <b>persons</b>:</p>
<ul>
<li>Жмем кнопку <b>Belongs To</b></li>
<li>В диалоговом окне <b>Relation Properties</b> указываем название таблицы со стороны &#8220;один&#8221;, в нашем случае это таблица <b>groups</b></li>
<li>Указываем поле внешнего ключа в таблице <b>persons</b>. В нашем случае это <b>groupid</b></li>
</ul>
<p>Значения остальных параметров можно оставить без изменений.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_21.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_21.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a><br />
В поле <b>Output Dir</b> указываем папку проекта <b>SQLiteTest</b> и жмем <b>Generate</b><br />
После всех проделанных операций, в папке с проектом <b>SQLiteTest</b> должны появиться файлы:</p>
<ul>
<li>Group.h</li>
<li>Group.cpp</li>
<li>Person.h</li>
<li>Person.cpp</li>
</ul>
<p>Эти файлы нам необходимо добавить в проект.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_22.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_22.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p>После того, как все необходимые файлы добавлены, можно приступать к внесению изменений в исходный код.<br />
Для начала в файле <b>wxActiveRecord.h</b> не обходимо раскомментировать  строку с макросом <code class="inlinecode">AR_USE_SQLITE</code>, который указывает, что мы используем СУБД <b>SQLite</b>. В файле <b>wxActiveRecord.cpp</b> необходимо исправить путь к заголовочному файлу <b>wxActiveRecord.h</b></p>
<p><b>wxActiveRecord.h</b></p>
<pre class="brush: cpp;">
...
// COMMENT OUT THE ONES YOU DON'T USE

//#define AR_USE_POSTGRESQL
#define AR_USE_SQLITE
//#define AR_USE_MYSQL
//#define AR_USE_FIREBIRD
...
</pre>
<p><b>wxActiveRecord.cpp</b></p>
<pre class="brush: cpp;">
...

#include &quot;wxActiveRecord.h&quot;

//begin WX_ACTIVE_RECORD
...
</pre>
<p>Теперь, если посмотреть на исходный код файлов, сгенерированных утилитой <b>wxARG</b>, то можно заметить, что каждая пара .h/.cpp файлов содержит описание и реализацию трех классов:</p>
<ul>
<li>XXX – класс таблицы</li>
<li>XXXRow – класс типизированной записи таблицы</li>
<li>XXXRowSet – типизированный список записей</li>
</ul>
<p>где XXX – название таблицы.<br />
И после всего сказанного, вооружившись полученными знаниями, продолжим наш &#8220;happy coding&#8221;.</p>
<p><b>SQLiteTestApp.h</b></p>
<pre class="brush: cpp;">
...
#include &lt;SqliteDatabaseLayer.h&gt;
#include &quot;Group.h&quot;
#include &quot;Person.h&quot;

class SQLiteTestApp : public wxApp
{
	Group * m_GroupTable;
	Person * m_PersonTable;
	...
public:
	...
	Group * GetGroupTable();
	Person * GetPersonTable();
};
...
</pre>
<p><b>SQLiteTestApp.cpp</b></p>
<pre class="brush: cpp;">
...
int SQLiteTestApp::OnExit()
{
	wxDELETE(m_PersonTable);
	wxDELETE(m_GroupTable);
	...
}

bool SQLiteTestApp::ConnectToDatabase()
{
	...
	try
	{
		m_GroupTable = new Group(wxGetApp().GetDatabase(), wxT(&quot;groups&quot;));
		m_PersonTable = new Person(wxGetApp().GetDatabase(), wxT(&quot;persons&quot;));
	}
	catch(DatabaseLayerException &amp; e)
	{
		wxActiveRecord::ProcessException(e);
	}
	return true;
}
...
Group * SQLiteTestApp::GetGroupTable()
{
	return m_GroupTable;
}

Person * SQLiteTestApp::GetPersonTable()
{
	return m_PersonTable;
}
</pre>
<p>Итак, мы добавили новые члены класса <code class="inlinecode">SQLiteTestApp</code>, обеспечивающие доступ к таблицам базы данных и теперь можно приступать к созданию GUI.<br />
Дистрибутив wxWidgets содержит несколько десятков свободно распространяемых иконок, которые мы можем использовать в нашем приложении. Создадим папку <b>SQLiteTest/art</b> и скопируем в нее файлы </p>
<ul>
<li>$(WXWIN)/art/addbookm.xpm</li>
<li>$(WXWIN)/art/delbookm.xpm</li>
<li>$(WXWIN)/art/new.xpm</li>
<li>$(WXWIN)/art/delete.xpm</li>
</ul>
<p><b>SQLiteTestMainFrame.h</b></p>
<pre class="brush: cpp;">
#ifndef _SQLITE_TEST_MAINFRAME_H
#define _SQLITE_TEST_MAINFRAME_H

#include &lt;wx/wx.h&gt;
#include &lt;wx/toolbar.h&gt;
#include &lt;wx/listbox.h&gt;
#include &lt;wx/listctrl.h&gt;
#include &lt;wx/html/htmlwin.h&gt;

class SQLiteTestMainFrame : public wxFrame
{
	wxListBox * m_GroupsListBox;
	wxListView * m_PersonsListView;
	wxHtmlWindow * m_PersonInfoPanel;
	void CreateControls();
	wxToolBar * CreateToolBar();
public:
	SQLiteTestMainFrame();
	bool Create(wxWindow * parent, wxWindowID id, const wxString &amp; title);

	DECLARE_EVENT_TABLE()
	void OnExit(wxCommandEvent &amp; event);
};

#endif
</pre>
<p><b>SQLiteTestMainFrame.cpp</b></p>
<pre class="brush: cpp;">
...
#include &lt;wx/splitter.h&gt;
#include &quot;new.xpm&quot;
#include &quot;delete.xpm&quot;
#include &quot;addbookm.xpm&quot;
#include &quot;delbookm.xpm&quot;

enum
{
	ID_GROUPS_LISTBOX = 10001,
	ID_PERSONS_LISTCTRL,
	ID_PERSON_INFO_PANEL,
	ID_ADD_GROUP,
	ID_DELETE_GROUP,
	ID_ADD_PERSON,
	ID_DELETE_PERSON
};
...
void SQLiteTestMainFrame::CreateControls()
{
	wxMenuBar * menuBar = new wxMenuBar;
	SetMenuBar(menuBar);

	wxMenu * fileMenu = new wxMenu;
	fileMenu-&gt;Append(wxID_EXIT, _(&quot;Exit\tAlt+F4&quot;));

	menuBar-&gt;Append(fileMenu, _(&quot;File&quot;));

	wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
	SetSizer(sizer);

	wxSplitterWindow * splitter = new wxSplitterWindow(this, wxID_ANY,
		wxDefaultPosition, wxSize(500, 400), wxSP_3DSASH);
	splitter-&gt;SetMinimumPaneSize(100);
	sizer-&gt;Add(splitter, 1, wxEXPAND);

	m_GroupsListBox = new wxListBox(splitter, ID_GROUPS_LISTBOX,
		wxDefaultPosition, wxDefaultSize);

	wxSplitterWindow * personsplitter = new wxSplitterWindow(splitter, wxID_ANY,
		wxDefaultPosition, wxSize(500, 400), wxSP_3DSASH);
	personsplitter-&gt;SetMinimumPaneSize(100);
	m_PersonsListView = new wxListView(personsplitter, ID_PERSONS_LISTCTRL,
		wxDefaultPosition, wxDefaultSize, wxLC_REPORT);
	m_PersonsListView-&gt;InsertColumn(0, _(&quot;First Name&quot;), wxLIST_FORMAT_LEFT, 120);
	m_PersonsListView-&gt;InsertColumn(1, _(&quot;Last Name&quot;), wxLIST_FORMAT_LEFT, 120);
	m_PersonsListView-&gt;InsertColumn(2, _(&quot;E-Mail&quot;), wxLIST_FORMAT_LEFT, 130);
	m_PersonsListView-&gt;InsertColumn(3, _(&quot;Phone&quot;), wxLIST_FORMAT_LEFT, 130);

	m_PersonInfoPanel = new wxHtmlWindow(personsplitter, ID_PERSON_INFO_PANEL);

	personsplitter-&gt;SetSashGravity(1.0);	

	splitter-&gt;SplitVertically(m_GroupsListBox, personsplitter, 160);
	personsplitter-&gt;SplitHorizontally(m_PersonsListView, m_PersonInfoPanel,
		personsplitter-&gt;GetSize().GetHeight()-180);

	SetToolBar(CreateToolBar());

	CreateStatusBar(2);
	Centre();
}

wxToolBar * SQLiteTestMainFrame::CreateToolBar()
{
	wxToolBar * toolBar = new wxToolBar(this, wxID_ANY, wxDefaultPosition,
		wxDefaultSize, wxTB_FLAT|wxTB_TEXT);
	toolBar-&gt;AddTool(ID_ADD_GROUP, _(&quot;Add Group&quot;), wxBitmap(addbookm_xpm));
	toolBar-&gt;AddTool(ID_DELETE_GROUP, _(&quot;Remove Group&quot;), wxBitmap(delbookm_xpm));
	toolBar-&gt;AddSeparator();
	toolBar-&gt;AddTool(ID_ADD_PERSON, _(&quot;Add Person&quot;), wxBitmap(new_xpm));
	toolBar-&gt;AddTool(ID_DELETE_PERSON, _(&quot;Remove Person&quot;), wxBitmap(delete_xpm));
	toolBar-&gt;Realize();
	return toolBar;
}
...
</pre>
<p>Для работы с классом <b>wxHtmlWindow</b> в свойствах проекта вразделе <b>Linker -> Input</b> в настройках <b>Additional Dependencies</b> нам необходимо добавить библиотеку <b>wxmsw28ud_html.lib</b> для конфигурации <b>Debug</b> и <b>wxmsw28u_html.lib</b> для конфигурации <b>Release</b><br />
После всех внесенных изменений, у нас должно получиться нечто подобное:<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_23.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_23.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a><br />
Отлично, интерфейс приложения готов, теперь можно приступить к реализации функционала.</p>
<p><b>RecordIDClientData.h</b></p>
<pre class="brush: cpp;">
#ifndef _RECORD_ID_CLIENT_DATA_H
#define _RECORD_ID_CLIENT_DATA_H

#include &lt;wx/clntdata.h&gt;

class RecordIDClientData : public wxClientData
{
	int m_ID;
public:
	RecordIDClientData(int id) : m_ID(id) {}

	int GetID() {return m_ID;}
	void SetID(int id) {m_ID = id;}
};

#endif
</pre>
<p><b>SQLiteTestMainFrame.h</b></p>
<pre class="brush: cpp;">
...
#include &lt;wx/wx.h&gt;
#include &lt;wx/toolbar.h&gt;
#include &lt;wx/listbox.h&gt;
#include &lt;wx/listctrl.h&gt;
#include &lt;wx/html/htmlwin.h&gt;

class SQLiteTestMainFrame : public wxFrame
{
	...
	void FillGroupsList();
	void FillPersonsList(int groupid);
	...
	DECLARE_EVENT_TABLE()
	void OnExit(wxCommandEvent &amp; event);
	void OnGroupListBoxSelected(wxCommandEvent &amp; event);
	void OnPersonListViewSelected(wxListEvent &amp; event);
	void OnPersonInfoPanelLinkClicked(wxHtmlLinkEvent &amp; event);
};
...
</pre>
<p><b>SQLiteTestMainFrame.cpp</b></p>
<pre class="brush: cpp;">
void SQLiteTestMainFrame::FillGroupsList()
{
	m_GroupsListBox-&gt;Freeze();
	m_GroupsListBox-&gt;Clear();
	GroupRowSet * allGroups = wxGetApp().GetGroupTable()-&gt;All();
	for(unsigned long i = 0; i &lt; allGroups-&gt;Count(); ++i)
	{
		m_GroupsListBox-&gt;Append(allGroups-&gt;Item(i)-&gt;name,
			new RecordIDClientData(allGroups-&gt;Item(i)-&gt;id));
	}
	if(m_GroupsListBox-&gt;GetCount())
	{
		m_GroupsListBox-&gt;SetSelection(0);
		RecordIDClientData * data = (RecordIDClientData *)
			m_GroupsListBox-&gt;GetClientObject(m_GroupsListBox-&gt;GetSelection());
		if(data)
		{
			FillPersonsList(data-&gt;GetID());
		}
	}
	wxGetApp().GetGroupTable()-&gt;CollectRowSet(allGroups);
	m_GroupsListBox-&gt;Thaw();
}

void SQLiteTestMainFrame::FillPersonsList(int groupid)
{
	m_PersonsListView-&gt;Freeze();
	m_PersonsListView-&gt;DeleteAllItems();
	GroupRow * thisGroup = wxGetApp().GetGroupTable()-&gt;Id(groupid);
	if(thisGroup)
	{
		PersonRowSet * allPersons = thisGroup-&gt;GetPersons();
		long item(0);
		for(unsigned long i = 0; i &lt; allPersons-&gt;Count(); ++i)
		{
			item = m_PersonsListView-&gt;InsertItem(item, allPersons-&gt;Item(i)-&gt;first_name);
			m_PersonsListView-&gt;SetItem(item, 1, allPersons-&gt;Item(i)-&gt;last_name);
			m_PersonsListView-&gt;SetItem(item, 2, allPersons-&gt;Item(i)-&gt;email);
			m_PersonsListView-&gt;SetItem(item, 3, allPersons-&gt;Item(i)-&gt;phone);
			m_PersonsListView-&gt;SetItemData(item, (long)allPersons-&gt;Item(i)-&gt;id);
		}
		thisGroup-&gt;CollectRowSet(allPersons);
		if(m_PersonsListView-&gt;GetItemCount())
		{
			m_PersonsListView-&gt;Select(0);
		}
		else
		{
			m_PersonInfoPanel-&gt;SetPage(wxT(&quot;&lt;html&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;&quot;));
		}
	}
	wxGetApp().GetGroupTable()-&gt;CollectRow(thisGroup);
	m_PersonsListView-&gt;Thaw();
}

void SQLiteTestMainFrame::
        OnGroupListBoxSelected(wxCommandEvent &amp; event)
{
 RecordIDClientData * data =
     (RecordIDClientData *)event.GetClientObject();
 if(data)
 {
  FillPersonsList(data-&gt;GetID());
 }
}

void SQLiteTestMainFrame::OnPersonListViewSelected(wxListEvent &amp; event)
{
	long personid = event.GetData();
	PersonRow * person = wxGetApp().GetPersonTable()-&gt;Id((int)personid);
	if(person)
	{
		m_PersonInfoPanel-&gt;SetPage(wxString::Format(
			wxT(&quot;&lt;html&gt;&lt;body&gt;&lt;h3&gt;%s %s&lt;h3&gt;&lt;body&gt;&lt;html&gt;&quot;),
			person-&gt;first_name, person-&gt;last_name));
		m_PersonInfoPanel-&gt;AppendToPage(wxString::Format(
			wxT(&quot;&lt;b&gt;Gender: &lt;/b&gt; %s&quot;),
			(person-&gt;gender?wxT(&quot;Male&quot;):wxT(&quot;Female&quot;))));
		m_PersonInfoPanel-&gt;AppendToPage(wxT(&quot;&lt;hr&gt;&quot;));
		m_PersonInfoPanel-&gt;AppendToPage(wxString::Format(
			wxT(&quot;&lt;b&gt;Address: &lt;/b&gt; %s&lt;br&gt;&quot;),
			person-&gt;address.GetData()));
		m_PersonInfoPanel-&gt;AppendToPage(wxString::Format(
			wxT(&quot;&lt;b&gt;City: &lt;/b&gt; %s&lt;br&gt;&quot;),
			person-&gt;city.GetData()));
		m_PersonInfoPanel-&gt;AppendToPage(wxString::Format(
			wxT(&quot;&lt;b&gt;Country: &lt;/b&gt; %s&quot;),
			person-&gt;country.GetData()));
		m_PersonInfoPanel-&gt;AppendToPage(wxT(&quot;&lt;hr&gt;&quot;));
		m_PersonInfoPanel-&gt;AppendToPage(
			wxString::Format(wxT(&quot;&lt;b&gt;Phone: &lt;/b&gt; %s&lt;br&gt;&quot;),
			person-&gt;phone.GetData()));
		m_PersonInfoPanel-&gt;AppendToPage(wxString::Format(
			wxT(&quot;&lt;b&gt;E-mail: &lt;/b&gt; &lt;a href=\&quot;mailto:%s\&quot;&gt;%s&lt;/a&gt;&lt;br&gt;&quot;),
			person-&gt;email, person-&gt;email.GetData()));
	}
	else
	{
		m_PersonInfoPanel-&gt;SetPage(
			_(&quot;&lt;html&gt;&lt;body&gt;&lt;h3&gt;Can't find info about selected person&lt;h3&gt;&lt;body&gt;&lt;html&gt;&quot;));
	}
}

void SQLiteTestMainFrame::
    OnPersonInfoPanelLinkClicked(wxHtmlLinkEvent &amp; event)
{
#if defined(__WXMSW__)
 ShellExecute(NULL, NULL,
     event.GetLinkInfo().GetHref().GetData(),
     NULL, NULL, SW_SHOW);
#else
 wxExecute(event.GetLinkInfo().GetHref());
#endif
}
</pre>
<p>Список в левой части окна содержит названия групп. Каждый элемент списка содержит код группы. Привязка данных к элементам списка реализована с помощью объектов класса <b>RecordIDClientData</b>, каждый объект которого содержит код группы. Класс <b>RecordIDClientData</b> является производным от <b>wxClientData</b> и его использование обеспечивает автоматическую очистку памяти при удалении элемента списка. Доступ к данным, ассоциированным с элементом списка групп, производится посредством метода <b>GetClientObject</b> класса <b>wxListBox</b><br />
При выборе записи в списке групп, список контактов в правой части окна заполняется данными контактов данной группы.</p>
<p>При выборе элемента списка контактов, информационное поле в нижней части окна заполняется данными контакта, связанного с выбранным элементом списка. Каждый элемент списка контактов содержит в поле данных код контакта. Доступ к полю данных производится посредством метода <b>GetItemData</b> класса <b>wxListView</b></p>
<p>При нажатии на ссылку с адресом электронной почты в информационном поле, создается новое письмо в почтовом клиенте, назначенном по умолчанию.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_24.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_24.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a><br />
Итак, с отображением данных мы закончили. Теперь нужно реализовать добавление новой записи в таблицу и удаление записей из таблицы.<br />
Для начала создадим диалоговые окна вода данных.</p>
<p><b>EditGroupDialog.h</b></p>
<pre class="brush: cpp;">
#ifndef _EDIT_GROUP_DIALOG_H
#define _EDIT_GROUP_DIALOG_H

#include &lt;wx/wx.h&gt;

class EditGroupDialog : public wxDialog
{
	wxString m_GroupName;
	wxString m_GroupDescription;
	void CreateControls();
public:
	EditGroupDialog(wxWindow * parent);
	bool Create(wxWindow * parent, wxWindowID id, const wxString title);

	const wxString &amp; GetGroupName();
	void SetGroupName(const wxString &amp; value);
	const wxString &amp; GetGroupDescription();
	void SetGroupDescription(const wxString &amp; value);
};

#endif
</pre>
<p><b>EditGroupDialog.cpp</b></p>
<pre class="brush: cpp;">
#include &quot;EditGroupDialog.h&quot;
#include &lt;wx/valgen.h&gt;

enum
{
	ID_EGD_NAME_TEXTCTRL = 10001,
	ID_EGD_DESCRIPTION_TEXTCTRL
};

EditGroupDialog::EditGroupDialog(wxWindow * parent)
{
	Create(parent, wxID_ANY, _(&quot;Editing group&quot;));
}

bool EditGroupDialog::Create(wxWindow * parent, wxWindowID id, const wxString title)
{
	bool res = wxDialog::Create(parent, id, title);
	if(res)
	{
		CreateControls();
	}
	return res;
}

void EditGroupDialog::CreateControls()
{
	wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
	SetSizer(sizer);

	wxStaticText * nameLabel = new wxStaticText(this, wxID_ANY, _(&quot;Name:&quot;));
	wxStaticText * descriptionLabel = new wxStaticText(this, wxID_ANY, _(&quot;Description:&quot;));

	wxTextCtrl * nameEdit = new wxTextCtrl(this, ID_EGD_NAME_TEXTCTRL, wxEmptyString);
	wxTextCtrl * descriptionEdit = new wxTextCtrl(this, ID_EGD_DESCRIPTION_TEXTCTRL,
		wxEmptyString, wxDefaultPosition, wxSize(-1, 150), wxTE_MULTILINE);
	nameEdit-&gt;SetValidator(wxGenericValidator(&amp;m_GroupName));
	descriptionEdit-&gt;SetValidator(wxGenericValidator(&amp;m_GroupDescription));

	wxFlexGridSizer * fg_sizer = new wxFlexGridSizer(2, 2, 0, 0);
	fg_sizer-&gt;Add(nameLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(nameEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(descriptionLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(descriptionEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;AddGrowableCol(1);

	sizer-&gt;Add(fg_sizer, 1, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, 5);
	sizer-&gt;Add(CreateButtonSizer(wxID_OK|wxID_CANCEL), 0, wxALIGN_RIGHT|wxALL, 5);
}

const wxString &amp; EditGroupDialog::GetGroupName()
{
	return m_GroupName;
}

void EditGroupDialog::SetGroupName(const wxString &amp; value)
{
	m_GroupName = value;
}

const wxString &amp; EditGroupDialog::GetGroupDescription()
{
	return m_GroupDescription;
}

void EditGroupDialog::SetGroupDescription(const wxString &amp; value)
{
	m_GroupDescription = value;
}
</pre>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_25.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_25.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a></p>
<p><b>EditPersonDialog.h</b></p>
<pre class="brush: cpp;">
#ifndef _EDIT_PERSON_DIALOG_H
#define _EDIT_PERSON_DIALOG_H

#include &lt;wx/wx.h&gt;

class EditPersonDialog : public wxDialog
{
	wxString m_FirstName;
	wxString m_LastName;
	wxString m_Address;
	wxString m_City;
	wxString m_Country;
	wxString m_Email;
	wxString m_Phone;
	void CreateControls();
public:
	EditPersonDialog(wxWindow * parent);
	bool Create(wxWindow * parent, wxWindowID id, const wxString title);

	const wxString &amp; GetFirstName();
	const wxString &amp; GetLastName();
	const wxString &amp; GetAddress();
	const wxString &amp; GetCity();
	const wxString &amp; GetCountry();
	const wxString &amp; GetEmail();
	const wxString &amp; GetPhone();
};

#endif
</pre>
<p><b>EditPersonDialog.cpp</b></p>
<pre class="brush: cpp;">
#include &quot;EditPersonDialog.h&quot;
#include &lt;wx/valgen.h&gt;

enum
{
	ID_EPD_FIRSTNAME_TEXTCTRL = 10001,
	ID_EPD_LASTNAME_TEXTCTRL,
	ID_EPD_ADDRESS_TEXTCTRL,
	ID_EPD_CITY_TEXTCTRL,
	ID_EPD_COUNTRY_TEXTCTRL,
	ID_EPD_EMAIL_TEXTCTRL,
	ID_EPD_PHONE_TEXTCTRL
};

EditPersonDialog::EditPersonDialog(wxWindow * parent)
{
	Create(parent, wxID_ANY, _(&quot;Editing person&quot;));
}

bool EditPersonDialog::Create(wxWindow * parent,
wxWindowID id, const wxString title)
{
	bool res = wxDialog::Create(parent, id, title);
	if(res)
	{
		CreateControls();
	}
	return res;
}

void EditPersonDialog::CreateControls()
{
	wxBoxSizer * sizer = new wxBoxSizer(wxVERTICAL);
	SetSizer(sizer);

	wxStaticText * firstnameLabel = new wxStaticText(this, wxID_ANY, _(&quot;First Name:&quot;));
	wxStaticText * lastnameLabel = new wxStaticText(this, wxID_ANY, _(&quot;Last Name:&quot;));
	wxStaticText * addressLabel = new wxStaticText(this, wxID_ANY, _(&quot;Address:&quot;));
	wxStaticText * cityLabel = new wxStaticText(this, wxID_ANY, _(&quot;City:&quot;));
	wxStaticText * countryLabel = new wxStaticText(this, wxID_ANY, _(&quot;Country:&quot;));
	wxStaticText * emailLabel = new wxStaticText(this, wxID_ANY, _(&quot;E-mail:&quot;));
	wxStaticText * phoneLabel = new wxStaticText(this, wxID_ANY, _(&quot;Phone:&quot;));

	wxTextCtrl * firstnameEdit = new wxTextCtrl(this, ID_EPD_FIRSTNAME_TEXTCTRL, wxEmptyString);
	wxTextCtrl * lastnameEdit = new wxTextCtrl(this, ID_EPD_LASTNAME_TEXTCTRL, wxEmptyString);
	wxTextCtrl * addressEdit = new wxTextCtrl(this, ID_EPD_ADDRESS_TEXTCTRL, wxEmptyString);
	wxTextCtrl * cityEdit = new wxTextCtrl(this, ID_EPD_CITY_TEXTCTRL, wxEmptyString);
	wxTextCtrl * countryEdit = new wxTextCtrl(this, ID_EPD_COUNTRY_TEXTCTRL, wxEmptyString);
	wxTextCtrl * emailEdit = new wxTextCtrl(this, ID_EPD_EMAIL_TEXTCTRL, wxEmptyString);
	wxTextCtrl * phoneEdit = new wxTextCtrl(this, ID_EPD_PHONE_TEXTCTRL, wxEmptyString);

	firstnameEdit-&gt;SetMinSize(wxSize(150,-1));

	firstnameEdit-&gt;SetValidator(wxGenericValidator(&amp;m_FirstName));
	lastnameEdit-&gt;SetValidator(wxGenericValidator(&amp;m_LastName));
	addressEdit-&gt;SetValidator(wxGenericValidator(&amp;m_Address));
	cityEdit-&gt;SetValidator(wxGenericValidator(&amp;m_City));
	countryEdit-&gt;SetValidator(wxGenericValidator(&amp;m_Country));
	emailEdit-&gt;SetValidator(wxGenericValidator(&amp;m_Email));
	phoneEdit-&gt;SetValidator(wxGenericValidator(&amp;m_Phone));

	wxFlexGridSizer * fg_sizer = new wxFlexGridSizer(2, 2, 0, 0);
	fg_sizer-&gt;Add(firstnameLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(firstnameEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(lastnameLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(lastnameEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(addressLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(addressEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(cityLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(cityEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(countryLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(countryEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(emailLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(emailEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(phoneLabel, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;Add(phoneEdit, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5);
	fg_sizer-&gt;AddGrowableCol(1);

	sizer-&gt;Add(fg_sizer, 1, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, 5);
	sizer-&gt;Add(CreateButtonSizer(wxID_OK|wxID_CANCEL), 0, wxALIGN_RIGHT|wxALL, 5);

	sizer-&gt;Fit(this);
}

const wxString &amp; EditPersonDialog::GetFirstName()
{
	return m_FirstName;
}

const wxString &amp; EditPersonDialog::GetLastName()
{
	return m_LastName;
}

const wxString &amp; EditPersonDialog::GetAddress()
{
	return m_Address;
}

const wxString &amp; EditPersonDialog::GetCity()
{
	return m_City;
}

const wxString &amp; EditPersonDialog::GetCountry()
{
	return m_Country;
}

const wxString &amp; EditPersonDialog::GetEmail()
{
	return m_Email;
}

const wxString &amp; EditPersonDialog::GetPhone()
{
	return m_Phone;
}
</pre>
<p><a href="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_25.png"><img src="http://wxwidgets.info//wp-content/uploads/2007/06/accessing_sqlite_wx_26.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" class="alignnone size-full wp-image-210" /></a><br />
Теперь можно приступать к написанию обработчиков событий от кнопок на панели инструментов.</p>
<p><b>SQLiteTestMainFrame.h</b></p>
<pre class="brush: cpp;">
...
class SQLiteTestMainFrame : public wxFrame
{
	...
	void OnAddGroup(wxCommandEvent &amp; event);
	void OnRemoveGroup(wxCommandEvent &amp; event);
	void OnAddPerson(wxCommandEvent &amp; event);
	void OnRemovePerson(wxCommandEvent &amp; event);
	void OnRemoveGroupUpdateUI(wxUpdateUIEvent &amp; event);
	void OnAddPersonUpdateUI(wxUpdateUIEvent &amp; event);
	void OnRemovePersonUpdateUI(wxUpdateUIEvent &amp; event);
};
...
</pre>
<p><b>SQLiteTestMainFrame.cpp</b></p>
<pre class="brush: cpp;">
...
void SQLiteTestMainFrame::OnAddGroup(wxCommandEvent &amp; event)
{
	EditGroupDialog * dlg = new EditGroupDialog(this);
	if(dlg-&gt;ShowModal() == wxID_OK)
	{
		GroupRow * newGroup = wxGetApp().GetGroupTable()-&gt;New();
		newGroup-&gt;name = dlg-&gt;GetGroupName();
		newGroup-&gt;description = dlg-&gt;GetGroupDescription();
		newGroup-&gt;Save();
		wxGetApp().GetGroupTable()-&gt;CollectRow(newGroup);
		FillGroupsList();
	}
	dlg-&gt;Destroy();
}

void SQLiteTestMainFrame::OnRemoveGroup(wxCommandEvent &amp; event)
{
	int selection = m_GroupsListBox-&gt;GetSelection();
	RecordIDClientData * data = (RecordIDClientData *)
		m_GroupsListBox-&gt;GetClientObject(selection);
	if(data)
	{
		GroupRow * thisGroup = wxGetApp().GetGroupTable()-&gt;Id(data-&gt;GetID());
		if(thisGroup &amp;&amp; (wxMessageBox(_(&quot;Do you really want to delete this group?&quot;),
			_(&quot;Delete group&quot;), wxYES_NO) == wxYES))
		{
			PersonRowSet * thisPersons = thisGroup-&gt;GetPersons();
			for(unsigned long i = 0; i &lt; thisPersons-&gt;Count(); ++i)
			{
				thisPersons-&gt;Item(i)-&gt;Delete();
			}
			thisGroup-&gt;CollectRowSet(thisPersons);
			thisGroup-&gt;Delete();
			wxGetApp().GetGroupTable()-&gt;CollectRow(thisGroup);
			m_GroupsListBox-&gt;Delete(selection);
			if(m_GroupsListBox-&gt;GetCount())
			{
				m_GroupsListBox-&gt;SetSelection(selection &lt;
					(int)m_GroupsListBox-&gt;GetCount() ? selection : 0);
				data = (RecordIDClientData *)m_GroupsListBox-&gt;GetClientObject(
					m_GroupsListBox-&gt;GetSelection());
				if(data)
				{
					FillPersonsList(data-&gt;GetID());
				}
			}
		}
	}
}

void SQLiteTestMainFrame::OnAddPerson(wxCommandEvent &amp; event)
{
	RecordIDClientData * data = (RecordIDClientData *)
		m_GroupsListBox-&gt;GetClientObject(m_GroupsListBox-&gt;GetSelection());
	if(data)
	{
		GroupRow * thisGroup = wxGetApp().GetGroupTable()-&gt;Id(data-&gt;GetID());
		if(thisGroup)
		{
			EditPersonDialog * dlg = new EditPersonDialog(this);
			if(dlg-&gt;ShowModal() == wxID_OK)
			{
				PersonRow * newPerson = wxGetApp().GetPersonTable()-&gt;New();
				newPerson-&gt;groupid= thisGroup-&gt;id;
				newPerson-&gt;first_name = dlg-&gt;GetFirstName();
				newPerson-&gt;last_name = dlg-&gt;GetLastName();
				newPerson-&gt;address = dlg-&gt;GetAddress();
				newPerson-&gt;city = dlg-&gt;GetCity();
				newPerson-&gt;country = dlg-&gt;GetCountry();
				newPerson-&gt;email = dlg-&gt;GetEmail();
				newPerson-&gt;phone = dlg-&gt;GetPhone();
				newPerson-&gt;Save();
				wxGetApp().GetPersonTable()-&gt;CollectRow(newPerson);
				FillPersonsList(thisGroup-&gt;id);
			}
			dlg-&gt;Destroy();
		}
		wxGetApp().GetGroupTable()-&gt;CollectRow(thisGroup);
	}
}

void SQLiteTestMainFrame::OnRemovePerson(wxCommandEvent &amp; event)
{
	long selection = m_PersonsListView-&gt;GetFirstSelected();
	PersonRow * thisPerson = wxGetApp().GetPersonTable()-&gt;Id(
		(int)m_PersonsListView-&gt;GetItemData(selection));
	if(thisPerson &amp;&amp; (wxMessageBox(_(&quot;Do you really want to delete this record?&quot;),
		_(&quot;Delete person&quot;), wxYES_NO) == wxYES))
	{
		int groupid = thisPerson-&gt;groupid;
		thisPerson-&gt;Delete();
		wxGetApp().GetPersonTable()-&gt;CollectRow(thisPerson);
		m_PersonsListView-&gt;DeleteItem(selection);
		if(m_PersonsListView-&gt;GetItemCount())
		{
			m_PersonsListView-&gt;Select(wxMin(selection, m_PersonsListView-&gt;GetItemCount()-1));
		}
	}
}

void SQLiteTestMainFrame::
        OnRemoveGroupUpdateUI(wxUpdateUIEvent &amp; event)
{
 event.Enable(m_GroupsListBox-&gt;GetSelection() &gt;= 0);
}

void SQLiteTestMainFrame::
        OnAddPersonUpdateUI(wxUpdateUIEvent &amp; event)
{
 event.Enable(m_GroupsListBox-&gt;GetSelection() &gt;= 0);
}

void SQLiteTestMainFrame::
        OnRemovePersonUpdateUI(wxUpdateUIEvent &amp; event)
{
 event.Enable(m_PersonsListView-&gt;GetFirstSelected() &gt;= 0);
}
...
</pre>
<p>Как видно, кнопка удаления группы и кнопка добавления контакта активна только в случае, если есть активная запись в списке групп. Кнопка удаления контакта становится активной только в случае, если есть активная запись в списке контактов.<br />
При удалении группы удаляются и все связанные с ней контакты.</p>
<p>Ну вот. Мы закончили. Теперь собираем Release-версию программы и тестируем. Можно переходить к созданию проекта под Linux<br />
<a href="http://wxwidgets.info/wx_accessing_sqlite_3" title="Читать дальше">Продолжение статьи можно почитать здесь</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/wx_accessing_sqlite_2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets &#8211; Часть I &#8211; Шаблон проекта и GUI</title>
		<link>http://wxwidgets.info/wx_accessing_sqlite/</link>
		<comments>http://wxwidgets.info/wx_accessing_sqlite/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 15:37:46 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[wxWidgets]]></category>
		<category><![CDATA[DatabaseLayer]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://wxwidgets.info//?p=230</guid>
		<description><![CDATA[Очень часто вижу на форумах темы, связанные с организацией доступа к базам данных для приложений на C++. Тема, сама по себе, довольно актуальная и очень интересная, хотя у новичков зачастую вызывает трудности. И в этот раз я хочу рассказать о том, что написание кросс-платформенных приложений на C++, использующих для своей работы базы данных, не является [...]]]></description>
			<content:encoded><![CDATA[<p>Очень часто вижу на форумах темы, связанные с организацией доступа к базам данных для приложений на C++. Тема, сама по себе, довольно актуальная и очень интересная, хотя у новичков зачастую вызывает трудности. И в этот раз я хочу рассказать о том, что написание кросс-платформенных приложений на C++, использующих для своей работы базы данных, не является чем-то непосильным, а также о том, что написание кросс-платформенных приложений может оказаться довольно увлекательным занятием.</p>
<p>Итак, эта статья о разработке приложений, использующих для своей работы базы данных <b>SQLite</b>.<br />
Для работы нам понадобится:</p>
<ul>
<li><a href="http://wxwidgets.org">Библиотека wxWidgets-2.8:</a></li>
<li><a href="http://sqlite.org">СУБД SQLite3</a></li>
<li><a href="http://wxcode.sourceforge.net/components/databaselayer/">Библиотека DatabaseLayer for wxWidgets</a></li>
<li><a href="http://wxcode.sourceforge.net/components/activerecord/">Утилита wxActiveRecordGenerator (wxARG)</a></li>
</ul>
<p><a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_1.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_1.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Для начала, создадим новый проект (<b>Win32 Project</b>) в Visual Studio 2005 и назовем его <b>SQLiteTest</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_2.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_2.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
В мастере создания проекта выберем тип проекта <b>Windows Application</b> и в дополнительных свойствах укажем <b>Empty project</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_3.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_3.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Затем распакуем библиотеку <b>DatabaseLayer</b> в папку, в которой находится файл <b>SQLiteTest.sln</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_4.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_4.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
В <b>Solution Explorer</b> жмём правой кнопкой на названии Solution’а, выбираем пункт <b>Add -> Existing Project</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_5.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_5.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
И в окне выбора файла проекта, выбираем проект <b>databaselayer/build/databaselayer_databaselayer_sqlite.dsp</b> (или <b>.vcproj</b>).<br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_6.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_6.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Теперь нам необходимо указать зависимости проектов. Наше приложение должно быть собрано после сборки библиотеки <b>Databaselayer</b>, поэтому в <b>Solution Explorer</b> жмем правой кнопкой на названии проекта <b>SQLiteTest</b> и выбираем пункт меню <b>Project Dependencies&#8230;</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_7.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_7.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
В списке проектов ставим маркер на названии проекта <b>databaselayer_sqlite</b> и жмем OK<br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_8.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_8.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Далее, выбираем пункт меню <b>Build -> Configuration Manager</b> и указываем конфигурации сборки каждого проекта  для каждой конфигурации сборки Solution’а. Я использую статическую раздельную Unicode-сборку <b>wxWidgets</b>, поэтому для <b>Debug</b>-конфигурации сборки Solution’а я выбираю конфигурацию <b>Static Unicode Debug Multilib</b> проекта <b>databaselayer_sqlite</b> и конфигурацию <b>Debug</b> проекта <b>SQLiteTest</b>. Такие же действия необходимо проделать и для <b>Release</b>-конфигурации сборки Solution’а, все вхождения слова <b>Debug</b> в названиях конфигураций на <b>Release</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_9.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_9.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
После этого, распаковываем архив <b>sqlite-source-x_y_z.zip</b> в папку <b>databaselayer/sqlite/include</b> и архив <b>sqlitedll-x_y_z.zip</b>  в папку <b>databaselayer/sqlite/lib</b><br />
В каталоге <b>databaselayer/sqlite/lib</b> должны появиться файлы <b>sqlite3.dll</b> и <b>sqlite3.def</b><br />
Всё это очень хорошо, но для использования динамической библиотеки в нашем проекте, неплохо было бы иметь .lib файл, которого у нас сейчас нет. Для того, чтобы он у нас был, создаем два batch-скрипта:</p>
<p><b>setupvars.bat</b><br />
<code language="C++"><br />
"C:/Program Files/Microsoft Visual Studio 8/VC/bin/vcvars32.bat"<br />
</code></p>
<p><b>export.bat</b><br />
<code language="C++"><br />
lib.exe /def:sqlite3.def /machine:x86 /out:sqlite3.lib<br />
</code></p>
<p>Запускаем командную строку, переходим в папку <b>databaselayer/sqlite/lib</b> и по очереди запускаем эти два batch-файла<br />
<code language="C++"><br />
setupvars<br />
export<br />
</code><br />
После выполнения этих нехитрых действий, у нас должны появиться два файла: <b>sqlite3.exp</b> и <b>sqlite3.lib</b><br />
Копируем файл <b>sqlite3.dll</b> в папку <b>SQLiteTest/bin</b></p>
<p>Отлично, теперь создаем в нашем проекте <b>SQLiteTest</b> четыре новых файла: </p>
<ul>
<li>SQLiteTestApp.h</li>
<li>SQLiteTestApp.cpp</li>
<li>SQLiteTestMainFrame.h</li>
<li>SQLiteTestMainFrame.cpp</li>
</ul>
<p>Теперь открываем свойства проекта, переходим в раздел <b>C/C++</b> и в настройках <b>Additional Include Directories</b> добавляем две новые записи:</p>
<ul>
<li>$(ProjectDir)../databaselayer/sqlite/include</li>
<li>$(ProjectDir)../databaselayer/ include</li>
</ul>
<p><a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_10.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_10.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a></p>
<p>Переходим в раздел <b>Linker</b> и в настройках <b>Additional Library Directories</b> добавляем две новые записи:</p>
<ul>
<li>$(ProjectDir)../databaselayer/sqlite/lib</li>
<li>$(ProjectDir)../databaselayer/ lib</li>
</ul>
<p><a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_11.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_11.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
В разделе <b>Linker -> Input</b> в настройках <b>Additional Dependencies</b> добавляем записи:</p>
<ul>
<li>advapi32.lib</li>
<li>comctl32.lib</li>
<li>uuid.lib</li>
<li>rpcrt4.lib</li>
<li>wxbase28ud.lib</li>
<li>wxmsw28ud_core.lib</li>
<li>wxmsw28ud_adv.lib</li>
<li>wxpngd.lib</li>
<li>wxcode_msw28ud_databaselayer_sqlite.lib</li>
<li>sqlite3.lib</li>
</ul>
<p>Не забываем, что суффикс <b>d</b> в названиях библиотек wxWidgets указывает на то, что используется отладочная версия библиотеки. Release-версии библиотек не имеют в названии этого суффикса.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_12.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_12.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Далее, в разделе <b>Linker -> General</b> для всех конфигураций указываем параметр <b>Output File</b> равным <b>../bin/$(ProjectName).exe</b> и в разделе <b>Debugging</b> параметр <b>Working Directory</b> равным <b>../bin</b>. Это позволит генерировать исполняемый файл в отдельную папку.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_13.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_13.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Итак, предварительная настройка завершена, можно приступать к написанию кода.</p>
<p><b>SQLiteTestMainFrame.h</b></p>
<pre class="brush: cpp;">
#ifndef _SQLITE_TEST_MAINFRAME_H
#define _SQLITE_TEST_MAINFRAME_H

#include &lt;wx/wx.h&gt;

class SQLiteTestMainFrame : public wxFrame
{
	void CreateControls();
public:
	SQLiteTestMainFrame();
	bool Create(wxWindow * parent, wxWindowID id, const wxString &amp; title);

	DECLARE_EVENT_TABLE()
	void OnExit(wxCommandEvent &amp; event);
};

#endif
</pre>
<p><b>SQLiteTestMainFrame.cpp</b></p>
<pre class="brush: cpp;">
#include &quot;SQLiteTestMainFrame.h&quot;
#include &quot;SQLiteTestApp.h&quot;

BEGIN_EVENT_TABLE(SQLiteTestMainFrame, wxFrame)
EVT_MENU(wxID_EXIT, SQLiteTestMainFrame::OnExit)
END_EVENT_TABLE()

SQLiteTestMainFrame::SQLiteTestMainFrame()
{
	Create(NULL, wxID_ANY, _(&quot;SQLite Addressbook&quot;));
}

bool SQLiteTestMainFrame::Create(wxWindow * parent, wxWindowID id, const wxString &amp; title)
{
	bool res = wxFrame::Create(parent, id, title, wxDefaultPosition, wxSize(700, 500));
	if(res)
	{
		CreateControls();
	}
	return res;
}

void SQLiteTestMainFrame::CreateControls()
{
	wxMenuBar * menuBar = new wxMenuBar;
	SetMenuBar(menuBar);

	wxMenu * fileMenu = new wxMenu;
	fileMenu-&gt;Append(wxID_EXIT, _(&quot;ExittAlt+F4&quot;));

	menuBar-&gt;Append(fileMenu, _(&quot;File&quot;));

	CreateStatusBar(2);
	Centre();
}

void SQLiteTestMainFrame::OnExit(wxCommandEvent &amp; event)
{
	wxUnusedVar(event);
	Close();
}
</pre>
<p><b>SQLiteTestApp.h</b></p>
<pre class="brush: cpp;">
#ifndef _SQLITE_TEST_APP_H
#define _SQLITE_TEST_APP_H

#include &lt;wx/wx.h&gt;
#include &lt;Databaselayer.h&gt;
#include &lt;SqliteDatabaseLayer.h&gt;

class SQLiteTestApp : public wxApp
{
	DatabaseLayer * m_Database;
public:
	virtual bool OnInit();
	virtual int OnExit();

	bool ConnectToDatabase();
	DatabaseLayer * GetDatabase();
};

DECLARE_APP(SQLiteTestApp)

#endif
</pre>
<p><b>SQLiteTestApp.cpp</b></p>
<pre class="brush: cpp;">
#include &lt;wx/image.h&gt;
#include &lt;DatabaseLayerException.h&gt;
#include &quot;SQLiteTestApp.h&quot;
#include &quot;SQLiteTestMainFrame.h&quot;

IMPLEMENT_APP(SQLiteTestApp)

bool SQLiteTestApp::OnInit()
{
	if(!ConnectToDatabase())
	{
		wxFAIL_MSG(_(&quot;Error connecting to database!&quot;));
		return false;
	}
	wxImage::AddHandler(new wxPNGHandler);
	wxImage::AddHandler(new wxJPEGHandler);

	SQLiteTestMainFrame * frame = new SQLiteTestMainFrame;
	SetTopWindow(frame);
	frame-&gt;Show();

	return true;
}

int SQLiteTestApp::OnExit()
{
	if(m_Database)
	{
		if(m_Database-&gt;IsOpen())
		{
			m_Database-&gt;Close();
		}
		wxDELETE(m_Database);
	}
	return wxApp::OnExit();
}

bool SQLiteTestApp::ConnectToDatabase()
{
	m_Database = new SqliteDatabaseLayer();
	wxString db_filename(wxT(&quot;addressbook.db&quot;));
	PreparedStatement * pStatement(NULL);
	bool bCreate = !wxFileExists(db_filename);
	if(bCreate)
	{
		wxMessageBox(_(&quot;Database does not exist... recreating.&quot;));
	}
	try
	{
		m_Database-&gt;Open(db_filename);
		// Try to recreate tables
		try
		{
			m_Database-&gt;RunQuery(wxT(&quot;CREATE TABLE groups(id integer primary key,
				name varchar(128) not null,
				description varchar(512));&quot;));
		}
		catch(DatabaseLayerException &amp; e) {wxUnusedVar(e);}
		try
		{
			m_Database-&gt;RunQuery(wxT(&quot;CREATE TABLE persons(
				id integer primary key,
				groupid integer not null,
				first_name varchar(64) not null,
				last_name varchar(64) not null,
				gender boolean not null,
				address varchar(128) not null,
				city varchar(64) not null,
				country varchar(32) not null,
				phone varchar(32),
				email varchar(128),
				website varchar(260));&quot;));
		}
		catch(DatabaseLayerException &amp; e) {wxUnusedVar(e);}
		if(bCreate)
		{
			m_Database-&gt;RunQuery(
				wxT(&quot;INSERT INTO groups(name, description) VALUES ('Friends', 'My friends')&quot;));
			pStatement = m_Database-&gt;PrepareStatement(
				wxT(&quot;INSERT INTO persons(groupid, first_name,last_name,gender,address,city,country,phone) VALUES
					(?,?,?,?,?,?,?,?)&quot;));
			if (pStatement)
			{
				pStatement-&gt;SetParamInt(1, 1);
				pStatement-&gt;SetParamString(2, _(&quot;John&quot;));
				pStatement-&gt;SetParamString(3, _(&quot;Doe&quot;));
				pStatement-&gt;SetParamBool(4, 1);
				pStatement-&gt;SetParamString(5, _(&quot;SomeStreet st., 123/45&quot;));
				pStatement-&gt;SetParamString(6, _(&quot;Some City&quot;));
				pStatement-&gt;SetParamString(7, _(&quot;Some Country&quot;));
				pStatement-&gt;SetParamString(8, _(&quot;+000-00-000-00-00&quot;));
				pStatement-&gt;RunQuery();
				m_Database-&gt;CloseStatement(pStatement);
				pStatement = NULL;
			}
		}
	}
	catch(DatabaseLayerException &amp; e)
	{
		if(pStatement)
		{
			m_Database-&gt;CloseStatement(pStatement);
			pStatement = NULL;
		}
		wxFAIL_MSG(e.GetErrorMessage());
		return false;
	}
	return true;
}

DatabaseLayer * SQLiteTestApp::GetDatabase()
{
	return m_Database;
}
</pre>
<p>Итак, что же мы сделали: мы создали класс приложения <code class="inlinecode">SQLiteTestApp</code>, содержащий указатель на объект класса <b>DatabaseLayer</b>, который и будет обеспечивать связь с нашей базой данных. При запуске приложения проверяется наличие файла <b>addressbook.db</b> и, в случае если файл не найден, он создается. Вместе с базой данных создаются две таблицы: <b>groups</b> и <b>persons</b> и заполняются тестовыми данными.<br />
Главная форма приложения содержит строку меню и строку статуса и, пока, ничего не делает.<br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_14.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_14.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
После успешной сборки приложения и его запуска, в папке <b>bin</b> должен появиться файл базы данных <b>addressbook.db</b><br />
<a href="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_15.png"><img src="http://wxwidgets.info//wp-content/uploads/2009/01/accessing_sqlite_wx_15.png" alt="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" title="Работа с базами данных в wxWidgets - SQLite + DatabaseLayer - 1" [/sourcecode]class="alignnone size-full wp-image-210" /></a><br />
Отлично, теперь можно приступать к работе с базой данных.</p>
<p><a href="http://wxwidgets.info/wx_accessing_sqlite_2" title="Читать дальше">Читать продолжение статьи&#8230;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wxwidgets.info/wx_accessing_sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
