SQLite в .NET

Не так давно, у меня появилась необходимость сохранять довольно большие объёмы данных в софтинке, которую пишу в свободное время. А именно это список пиров, состоящий из нескольких полей: ID|PEER_IP|STATUS. Возникла необходимость их как-то структурировано хранить, обновлять, и вообще — производить те или иные операции над записями. Логичным решением выглядит использование тех или иных БД. Но — по факту для целостной программы подходит только один тип решения — это SQLite. Дело в том, что это библиотека БД, которая может встраиваться в приложение и использоваться прямо из неё, без коннекта к стороннему серверу, наподобие MySQL. Для небольшого объёма данных (< 1000000 записей) это оптимально. Во-первых, вам достаточно просто включить библиотеку (*.dll) в комплект поставки, и не надо устанавливать на клиентском компьютере какие-то посторонние приложения, вроде MySQL сервера, которые (хотя на современных машинах это и неважно) потребляют некоторое количество ресурсов, как память, например. А зачастую нам нужно получить некоторый набор данных только при загрузке приложения — и постоянно держать ради этого включённым сервер БД — не нужно, плюс переносимость хромает. Встраиваемое решение в виде SQLite позволяет преодолеть эти трудности (и заиметь некоторые другие). Но — по порядку.

Что нужно для того, чтобы использовать SQLite в программах на C#? Для начала, нужно скачать провайдер ADO .NET для работы с SQLite в C#, да и в любом языке платформы .NET. Скачать его можно здесь. Там справа ссылочка «Downloads», которая перебросит на sourceforge. Качаем, устанавливаем. В комплекте идут библиотеки как для x86, так и для x64 платформ, а также для Compact .NET Framework, и экзотики вроде Itanium. Ещё есть полезная приблуда для Visual Studio — позволяет конструировать таблицы прямо из среды разработки. Также, для полноценной работы SQLite в .NET после того, как вы установили провайдер, требуется во-первых, указать в менеджере проектов использование библиотеки System.Data.SQLite, а во-вторых, подключить к файлу пространства имён:

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

Всё, теперь вам доступны для манипуляций объекты  типа SQLiteConnection, SQLiteFactory, SQLiteCommand, SQLiteDataReader. По большому счёту, с ними можно сделать все основные операции, которые встречаются на базах данных. В качестве примера приведу свой вариант класса, для работы с базой SQLite:

Spoiler Inside SelectShow

Вы можете использовать его свободно, при сохранении комментария вверху. Если не хотите — можете просто задействовать из него идеи и написать нечто лучшее :) Отдельного разговора требуют пара методов, которые обозначены здесь как public int NonExecuteQuery(string query) и public SQLiteDataReader Query(string query). Первый — используется для запросов на БД типа INSERT/UPDATE/CREATE — одним словом таких, которые не подразумевают возврата результатов запроса. Хотя кое-что он возвращает — это число строк задетых запросами типа UPDATE/INSERT. Второй — как раз таки предназначен для исполнения запросов с возвратом результата. Результирующий объект — SQLiteDataReader— требует отдельного рассмотрения.

Простейший код для получения результатов смотрите ниже:

Spoiler Inside SelectShow

Здесь мы выводим все данные из таблицы в консоль. В нашем случае это три поля таблицы peers. УЖЕ СОЗДАННОЙ и НАПОЛНЕННОЙ данным в базе base.sqlite. Обратите внимание — здесь нет ассоциативных индексов столбцов как в PHP. Обращение происходит по числовому индексу, и отсчёт начинается с нуля.

Дополнительно я рекомендую вам прочитать вот эту страничку: http://www.sqlite.org/lang.html — если вы знаете английский язык. И http://sb-money.ru/sqlite.php?page=21 — если вы не знаете английский, и хотите документацию на русском. Эти две ссылки представляют собой описание диалекта SQL запросов в SQLite.

Да, и ещё очень важный момент — SQLite в .NET начинает глючить при работе программы на сменном носителе с работой на запросах INSERT/UPDATE — например флешке, она выдаёт исключение типа «Some kind of disk I/O error occurred disk I/O errorSQLite. at System.Data.SQLite» Полазив по оф. форуму, а также иным англоязычным ресурсам решения я нигде не нашёл, только доводы почему это происходит. Если вы вдруг найдёте решение этой проблемы, то пожалуйста, потратьте минутку и отпишите в камент к этой заметке.

http://sqlite.phxsoftware.com/

Автор

Алекс Разгибалов

Сумасшедший мужчина, неопределённого возраста, наслаждающийся манией преследования. Паталогически недоверчив, эгоистичен, авторитарен. Вторичные диагнозы - программист и поц. Владеет английским языком на уровне около хренового разговорного. Также знаком с некоторыми другими языками. Интересуется всем и вся, за счёт чего в любой области знания являются поверхностными, неглубокими. Характер невыдержанный. Крепость - 55 градусов.

SQLite в .NET: 13 комментариев

  1. Спасибо, было интересно почитать, хотя я и не кодер)) Давно заметил во многих софтинах SQLite, например FlyLink, Но я почему-то думал, что если небольшой обьем информации — то создается своя, текстовая база, ну понятное дело, что она тормознутее. Ды ладн, тебе, как программисту виднее;)

    1. Ну, на самом деле специализированное для задачи решение как правило быстрее, за счёт исключения ненужных функций… Но — увы, использовать готовое — куда быстрее в плане разработки. А железо сейчас стоит дешевле рабочего времени программиста… Вообще повторное использование кода было отлично реализовано в .NET Framework — это такая система программных кирпичиков, из которой можно построить дом любой сложности. Вот, к примеру, один из сложнейших алгоритмов — RSA — занимает в моей программе 200 строк кода на спец. класс. Причем треть — комментарии самодокументации. AES-3DES — 210 строк… И так далее. Само собой, это не просто так — просто до меня сам алгоритм реализовали уже программисты из майкрософта, а я повторно использую их код, чем экономлю своё время… Также и с SQLite. Кстати, этот движок используется и в мозилла файрфокс… ))

      Вообще, очень жаль, что по SQLite + .NET так мало документации на русском… Надеюсь, эта статья хоть немного но восполнит пробел))

  2. >>Вот, к примеру, один из сложнейших алгоритмов – RSA – занимает в моей программе 200 строк кода на спец. класс. Причем треть – комментарии самодокументации. AES-3DES – 210 строк…
    Ты часом не военную ДубнаOS кодишь?))

    1. Не, у меня всё более мирное, просто алгоритмы зашифровки стойкие используются для защиты данных :) Пока, правда, даже альфа-версия софтинки не написана, а так, общие модули сделаны тока.

  3. подумываю возродить свой блог, подумываю давно а вот времени нет.. WordPress — стал жутко огромным и тормозным, со всем уважением в оному — ставить его вновь желание отпало.. Собсно вопрос: есть нормальный двиг, меня полностью устраивает, но хранит все в тексте, как считаешь — в нете что надежнее, мб все-таки пренебречь скоростью и поставить WordPress, да пусть все хранится в sql или текстовая база не так страшна? Я понимаю, что большой вопрос еще в реализации, но просмотр кода мною — ни к чему не приведет)) Двиг не сильно распространен, пишет русский энтузиаст, это тоже приятный момент. Твое мнение?

    1. Ну, на самом деле вордпресс не такой тормозной ) Нагрузку в 3-4 обращения в секунду он выносит довольно успешно. А если извратиться, и поставить кэшировщик (который все страницы переводит в статику) — так и вовсе… По сути будет отдаваться статический HTML контент. Там плагин есть, но у меня вот всё руки не доходят поставить))

      ЗЫ: Если блог заведёшь, дай линк)))

  4. Конечно дам. Скажи, т.е. ты считаешь, что с ВП не все так плохо? Я слышал, что в 3й версии уклон делается на медиа и на «комбайность»(AIO) а ресурсов стал жрать еще больше и стал на порядок тормознее, про кеш в нем я слышал, просто все руки не доходят поставить у себя и потестить немного, да и глаза уже разбегаются от движков всякоразных, а на ВП не сразу решился забить, опираясь на то, что как бы его не ругали, раз уж он «самый_в_мире» — то не такое уж и говно соответственно..

    1. Ну, этот блог обитает именно на нём :) В целом да, не так всё плохо)) Масса плагинов позволяет избавиться от головной боли с придумыванием нужного функционала, вот здесь, к примеру, их стоит 18 штук, или около того. По крайней мере мне пришлось писать один-единственный плагин к нему, за всё время использования, ибо готовые меня не удовлетворили… И переходить с самописного двигателя на этот когда решил — ваял конвертор из своего формата БД в вордпрессовский. В общем-то и всё :) На самом деле я может быть доберусь сегодня до того кэшировщика, посмотрим что он умеет :) По большому счёту, если не так важно иметь блог на собственном домене и заморачиваться на характеристики хостинга, можно поступить проще: wordpress.com, блог будет [name].wordpress.com — правда как там с плагинами и функционалом дело обстоит я не проверял))

  5. То, что твой сайт на ВП — это понятно, и про wordpress.com тож знаю, да и многие бесплатные хостинги дают возможность устанавливать по-умолчанию бесплатные двиги, в т.ч. и ВП, да только приятнее на своем домене)) Как только выкрою время — обязательно поставлю новый ВП, посмотрю на него..

    1. Кстати рекомендую регить где-нить в международной зоне типа .net, .org, .com, .info — с опцией Private Whois Protection)) Сам уже давно подумываю туда куда-нить перенестись, да никак руки не доходят…

  6. Да-да, я сразу так решил! Хотя очень уж .su нравится.. Хост тож зарубежный хочу, по ряду причин, даже потому, что там большая часть хостов xmpp предоставляют, а у нас, те о которых отзывы хорошие — даже не думают пока..Хотя я слышал, что джабб на своем домене можно и через gmail сделать, но там какие-то трабли с протоколом, то-ли с конфами, то-ли с закладками, хз, всяк приятнее, когда от хостинга, а еще лучше, когда свой серв, я тут интереса ради поднимал дома джабб серв — гениально и просто, мне понравилось, а вот тонкой настойкой не заморачивался.

    1. Самое любопытное, джаббер-сервера кажется тоже в большинстве своём на яве написаны)) По крайней мере то, что я поднимал было на ява… Правда извращался я с этим годика два назад, так что теперь даже названия того сервера не помню))

  7. Как сделать бд sqlite переносимой?? делал приложение, все библиотеке и бд находится в одной папке. Но приложение на другом компе не запускается( В чем здесь беда?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Собирать идеально - не обязательно, просто приблизительно соберите картинку (должен быть включен JavaScript).WordPress CAPTCHA