C# и SQLite

Краткий опус о использование SQLite в приложениях написаных на C#
Что скачиваем:



Добавляем в проект:

  1. Создаем проект (у меня старенький VS 2008 Express)
  2. Выбираем в меню «Project» — «Add Reference»
  3. На закладке «Recent» выбираем «System.Data.SQLite.dll» и жмем «ОК»
  4. в диалоге «Solution Explorer» выбираем раздел «Reference» и находим «System.Data.SQLite.dll»
  5. Ставим свойство «Copy Local» = «True». Файл будет копироваться автоматически в каталог программы



Далее несколько функций для работы с базой. База зовется как exe файл только расширение db.
В коде встречается «Program.log» — это объект для логирования.

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

/// <summary>
/// Выполняем запрос к базе программы
/// </summary>
/// <param name="sql">Текст запроса</param>
/// <returns></returns>
public static DataTable ExecuteSQL(string sql)
{
	string app_path = Application.ExecutablePath;
	string db_app = System.IO.Path.GetDirectoryName(app_path) + "" + System.IO.Path.GetFileNameWithoutExtension(app_path) + ".db";   // каталог программы
	string connect_command = string.Format("Data Source={0}", db_app);     // строка подключения к логу           
	Program.log.Debug(string.Format("Выполняем запрос: {0}",sql));

	SQLiteConnection sqliteConnection = new SQLiteConnection(connect_command);
	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 (Exception ex)
	{
		sqliteConnection.Close();
		Program.log.Error("Ошибка выполнения запроса: " + ex.Message);
	}
	sqliteConnection.Close();
	return dt;
}

/// <summary>
/// Выполняет sql скрипт из файла
/// </summary>
/// <param name="name_file">путь до файла с sql скриптом</param>
/// <returns></returns>
public static bool ExecuteFileSQL(string name_file)
{
	Program.log.Debug("ExecuteFileSQL: {0}", name_file);
	string app_dir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
	string full_file = app_dir + "" + name_file; 
	if(!System.IO.File.Exists(full_file))
	{
		Program.log.Debug("Файла sql найден n {0}",full_file);
		return false;
	}

	StreamReader sr = File.OpenText(full_file);
	string sql = sr.ReadToEnd();
	if (string.IsNullOrEmpty(sql))
	{
		Program.log.Debug("Файл пуст!");
		return false;
	}
	else
		Utils.ExecuteSQL(sql);
	sr.Close();
	return true;
}
/// <summary>
/// Переводим дату в формат SQLite
/// </summary>
/// <param name="value">Переводимая дата</param>
/// <param name="include_time">включать время в дату</param>
/// <returns></returns>
public static string ToDateSQLite(DateTime value, bool include_time)
{
	string format_date = "yyyy-MM-dd HH:mm:ss.fff";
	if(!include_time)
		format_date = "yyyy-MM-dd 00:00:00.000";

	return value.ToString(format_date);
}

При большом количеств выполняемых операций в базе, объединениям их в одну транзакцию.

BEGIN TRANSACTION;
/* тут идут операции с базой */
COMMIT;

Через утилиту SQLite Expert можно посмотреть метаданные базы.
При необходимости можете скопировать их в отдельный файл и поставлять его клиентам. Только безусловное создание базы надо будет заменить на конструкцию «CREATE TABLE IF NOT EXISTS«. Пример:

CREATE TABLE IF NOT EXISTS [variables] ([NameValue] VARCHAR(100), [Value] TEXT);

C# и SQLite: 2 комментария

  1. Pasha

    Доброе время суток,Борис!А не могли бы объяснить как сделать запрос:
    select count(*) from table1;

    С созданной таблицы:

    CREATE TABLE [table1]([id] INTEGER PRIMARY KEY AUTOINCREMENT,[Pole1] TEXT NOT NULL,[bdate] datetime NOT NULL,[pole2] INTEGER DEFAULT 0);

    Значение даты записую :

    DateTime time = DateTime.Now;
    string tmptxt = String.Format(«{0:yyyy-MM-dd HH:MM:ss.fff}», time);
    sSql = («INSERT into table1(Pole1, bdate,pole2) values(‘» + textBox1.Text + «‘, ‘» + tmptxt + «‘,0);»);

    При выполнение запроса :
    select count(*) from table1;

    Вылетает ошибка: «Invalid DateTime Field Format: 2013-01-26 11:01:56.343» (Finisar.SQLite.SQLiteException)

    Зарание спасибо большое!

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

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