Однажды понадобилось мне создать программку-мигратор базы данных из текстового XML в SQLite для проекта vanac. Дело в том, что XML меня перестал устраивать ввиду своих очень жадных потребностей в смысле места. К тому же, XML на лету было не так-то легко менять. Требовалась динамичность изменения данных.

Таким образом, для локального проекта наиболее оптимальным решением было выбрать базу данных SQLite.

Искать в Интернете информацию долго не пришлось. Сразу же натолкнулся на движок, разработанный специально для такого случая.

Скачав и установив его, я открыл Visual Studio и обнаружил в списке возможных для добавления References: System.Data.SQLite. Для тех, кто не знает, как добавлять зависимости для приложений приведу парочку скриншотов.

Давим в Solution Explorer правой кнопкой.

SQLite в .NET

Затем выбираем в списке System.Data.SQLite и давим OK.

SQLite в .NET

Зависимость добавлена.

Вот три основные функции, которые обеспечат вам понимание принципов работы с пространством имен System.Data.SQLite.

  • GetDataTable(string sql) выполняет запрос sql и возвращает результат его выполнения в структуре данных DataTable.
  • ExecuteNonQuery(string sql) используется в основном, когда необходимо выполнить операцию над данными (например, UPDATE или INSERT INTO). Возвращаемое значение – количество измененных / добавленных рядов данных.
  • ExecuteScalar(string sql) используется, когда ожидается получить одно единственное значение (например, количество юзеров в таблице users).
public static DataTable GetDataTable(string sql) {
    SQLiteConnection sqliteConnection = new SQLiteConnection("Data Source=Base.db");
    sqliteConnection.Open();
    SQLiteCommand sqliteCommand = new SQLiteCommand(sqliteConnection);
    DataTable dt = new DataTable();
    try {
        sqliteCommand.CommandText = sql;
        SQLiteDataReader sqliteReader = sqliteCommand.ExecuteReader();
        dt.Load(sqliteReader);
        sqliteReader.Close();
    } catch {
        // Закрывать соединение нужно в любом случае
        sqliteConnection.Close();
    }
    sqliteConnection.Close();
    return dt;
}

public static int ExecuteNonQuery(string sql) {
    SQLiteConnection sqliteConnection = new SQLiteConnection("Data Source=Base.db");
    sqliteConnection.Open();
    SQLiteCommand sqliteCommand = new SQLiteCommand(sqliteConnection);
    sqliteCommand.CommandText = sql;
    int rowsUpdated = sqliteCommand.ExecuteNonQuery();
    sqliteConnection.Close();
    return rowsUpdated;
}

public static string ExecuteScalar(string sql) {
    SQLiteConnection sqliteConnection = new SQLiteConnection("Data Source=Base.db");
    sqliteConnection.Open();
    SQLiteCommand sqliteCommand = new SQLiteCommand(sqliteConnection);
    sqliteCommand.CommandText = sql;
    object value = sqliteCommand.ExecuteScalar();
    sqliteConnection.Close();
    if (value != null) {
        return value.ToString();
    }
    return "";
}

Если при использовании SQLite у вас возникла проблема с кодировкой русских символов, попробуйте в базе использовать тип данных NVARCHAR вместо VARCHAR.