Начну с того, что указанный ресурс http://sqlite.phxsoftware.com/ (не смотря на официальность) для получения SQLite .NET версии поддерживался до апреля 2010 года (SQLite-1.0.66.0-setup.exe). Не совсем хорошо в своих разработках использовать "несвежачок". Для получения последних релизов нужно обратиться на другой официальный ресурс - http://system.data.sqlite.org. Итак, первый шаг, обращаемся к этому ресурсу в раздел "Download" и качаем нужный установочный пакет. Нужность определяется вашей средой разработки, в моем случае - Microsoft Visual C++ 2008 Express Edition, поэтому я скачал sqlite-netFx35-setup-bundle-x86-2008-1.0.82.0.exe. Почему? Потому что там же сказано:
This setup package features the mixed-mode assembly and will install all the necessary runtime components and dependencies for the x86 version of the System.Data.SQLite 1.0.83.0 (3.7.15.1) package. The Visual C++ 2008 SP1 runtime for x86 is included. The .NET Framework 3.5 SP1 is required.
This setup package is capable of installing the design-time components for Visual Studio 2008.
С самого начала я создал проект testDB (Templates - Windows Form Application) и все последующие действия буду сопровождать скриншотами, чтобы была наглядность.
Создание проекта testDB |
Свойства проекта |
Свойства проекта. Расширенное |
Установка пакета |
Шаг третий. После окончания установки нужно пройти в свойства проекта и добавить новые ссылки (References -> Add New References -> Вкладка .NET -> System.Data.SQLite.Core и другие).
Данный пакет расширит имена ссылок целевой платформы .NET framework 3.5 (расширение пространства имен System.Data).
Список активных ссылок |
Добавление новых ссылок на System.Data.SQLite |
Если Вы воспользовались версией SQLite-1.0.66.0, название ссылок может немного отличаться.
После установки пакета в установочной директории (если Вы ничего не меняли) - C:\Program Files\System.Data.SQLite в поддиректории \2008\bin будут располагаться те самые динамические библиотеки - System.Data.SQLite.dll и System.Data.SQLite.Linq.dll.
Для версии SQLite-1.0.66.0 немного иначе - C:\Program Files\SQLite.NET и поддиректория \bin.
Данные библиотеки уже готовы к использованию, в отличие от "C"шной SQLite библиотеки, где нужно проводить "линковку", например при разработке консольных приложений. Об этом можно почитать здесь - Связывание с динамической библиотекой в Visual C++, Разработка консольного приложения для работы с базой данных SQLite.
Каждая ссылка ссылается (поэтому она и называется ссылкой (Reference)) на соответствующую динамическую библиотеку (*.dll). Если использовать свежие релизы, то при установке пакета для удобства можно включить так называемый Caching metadata (флажок выставлен по-умолчанию), в результате вам не нужно будет располагать библиотеки в директории проекта, в отличии от SQLite-1.0.66.0, где такой возможности нет, а значит нужно будет ручками дополнительно ко всем манипуляциям скопипастить из \bin директории в директорию Вашего проекта соответствующие библиотеки.
Итак, мы готовы к кодингу. Для последующей самопроверки используя консольный движок sqlite3.exe (command-line shell) я создал простеньую базу данных sqlitedb.db состоящая из одной таблицы ipaddress. Далее в две колонки добавил записей. Созданную базу данных рассположил в директории проекта.
Что касается кодинга, для начала в месте объявлений используемых пространств имен прописываем:
//SQLite using namespace System::Data::SQLite; using namespace System::Text;
Изначально на форме были размещены такие активные компоненты как button и textbox, ими и воспользуемся:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { // Create The Connection Object SQLiteConnection ^db = gcnew SQLiteConnection(); try { // Open Database Connection MessageBox::Show("Opening Database Connection To sqlitedb.db ..."); db->ConnectionString = "Data Source=sqlitedb.db"; db->Open(); MessageBox::Show("Database Connection To sqlitedb.db Opened."); // Display Table try { MessageBox::Show("Displaying Table ..."); SQLiteCommand ^cmdSelect = db->CreateCommand(); cmdSelect->CommandText = "SELECT * FROM ipaddress;"; SQLiteDataReader ^reader = cmdSelect->ExecuteReader(); StringBuilder ^sb = gcnew StringBuilder(); for (int colCtr = 0; colCtr < reader->FieldCount; ++colCtr) { // Add Seperator (If After First Column) if (colCtr > 0) sb->Append("|"); // Add Column Name sb->Append(reader->GetName(colCtr)); } sb->AppendLine(); sb->Append("~~~~~~~~~~~~"); sb->AppendLine(); while (reader->Read()) { for (int colCtr = 0; colCtr < reader->FieldCount; ++colCtr) { // Add Seperator (If After First Column) if (colCtr > 0) sb->Append("|"); // Add Column Text sb->Append(reader->GetValue(colCtr)->ToString()); } sb->AppendLine(); } // Browse result // ...by use textBox1 this->textBox1->AppendText(sb->ToString()); // ...or like this method // MessageBox::Show(sb->ToString(), "SQLite MyTable"); } catch (Exception ^e) { MessageBox::Show("Error Executing SQL: " + e->ToString(), "Exception While Displaying MyTable ..."); } // Close Database Connection MessageBox::Show("Closing Database Connection To sqlitedb.db ..."); db->Close(); MessageBox::Show("Database Connection To sqlitedb.db Closed."); } finally { // Dispose Database Connection delete (IDisposable^)db; } }
Запускаем компиляцию. Вуаля, ни единой ошибки. Как итог, работающее приложение, для сравнения и упоминавшейся самопроверки сравним результаты:
Приложение in action. Результат на лицо |
Листинги, базу данных и "солюшн" под Visual Studio C++ 2008 EE можно скачать по ссылке - download.
Немного затрону тему инсталляции и распространения Вашего готового релиза.
Во-первых, нужно помнить, что в состав готового дистрибутива нужно в обязательном порядке включить используемые при разработке динамические библиотеки;
Во-вторых, так как приложение ориентировано на .NET framework платформу, то нужно обеспечить предустановку соответствующего фреймворка, в моем случае - .NET framework 3.5;
Для небольшого тестинга я попробывал перенести таким образом дистрибуив на другую машину. Изначально разработка велась под Windows 7 SP1 (иногда под Windows Vista HB), переносил и тестировал на Windows XP SP3.
Пойманное исключение. Отсутствие динамической библиотеки |
Приложение in action |
Еще раз по поводу предустановки .NET framework, для заметки. Работоспосбность приложения сохраняется независимо от версии фреймворка, но немного снижается быстрота отклика (чисто по наблюдениям, серьезно не воспринимать, все-таки нужны численные сравнения), при полном отстствии .NET фреймворков на запуск приложения система ругается меседжем:
The application failed to initialize properly (0xc0000135).
Итог отсутствия ".NET framework"-ов |
--------------------------------------------------------------------------------------------------------------
Почему столько много внимания и времени я уделил SQLite библиотеке? Конечно, есть другие технологии работы с базами данных MySQL, Microsoft SQL (также есть легковесная версия - microsoft sql server compact edition), другие. SQLite привлек меня тем, что он - 1) относится к независимым разработкам; - 2) действительно легковесный; - 3) возможность создания базы данных в памяти (виртуальная БД), можно использовать для расширения внутренней области памяти приложения или можно подключить к основной базе данных и использовать ее для кэширования; - 4) можно в любой момент к открытому подключению добавить до 10 баз данных; - 5) ну и все те возможности, присущие другим базам данных - журналы транзакции, логирование, режимы бэкапа и многое другое.