SQLite 是一個輕量級別數據庫, 是遵守 ACID 的關系型數據庫管理系統,它包含在一個相對小的 C 庫中。它是 D.RichardHipp 建立的公有領域項目。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百 K 的內存就夠了。它能夠支持 Windows/Linux/Unix 等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java 等,還有 ODBC 接口,同樣比起 Mysql、PostgreSQL 這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。
SQLite 官網:http://www.sqlite.org/
項目中使用了類庫,下載地址:http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
下載好后,在項目右鍵添加引用即可。
代碼:
using System;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
namespace Blog.Data
{
/// <summary>
/// SQLiteHelper
/// </summary>
public class SQLiteHelper : IDisposable
{
#region 私有字段..
private SQLiteConnection _connection = null;
private SQLiteTransaction _transaction = null;
private bool _transacted = false;
private string _connectionString = String.Empty;
private bool _disposed = false;
private bool _autoCommit = false;
#endregion
#region 構造函數...
/// <summary>
/// 使用默認的連接字符串初始化 <see cref="SQLiteHelper"/> 類的新實例。
/// </summary>
public SQLiteHelper()
: this(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)
{
}
/// <summary>
/// 初始化 SQLiteHelper
/// </summary>
/// <param name="connectionString">數據庫連接字符串。</param>
public SQLiteHelper(string connectionString)
{
_connectionString = connectionString;
_connection = new SQLiteConnection(_connectionString);
_connection.Commit += new SQLiteCommitHandler(Transaction_Commit);
_connection.RollBack += new EventHandler(Transaction_RollBack);
}
/// <summary>
/// SQLiteHelper 析構函數
/// </summary>
~SQLiteHelper()
{
Dispose(false);
}
#endregion
#region 方法...
/// <summary>
/// 打開數據庫連接。
/// </summary>
private void Open()
{
if (_connection.State == ConnectionState.Closed)
{
_connection.Open();
}
}
/// <summary>
/// 關閉數據庫連接。
/// </summary>
private void Close()
{
if (_connection.State != ConnectionState.Closed)
{
if (_transacted && _autoCommit)
{
Commit();
}
_connection.Close();
}
}
/// <summary>
/// 開始數據庫事務。
/// </summary>
public void BeginTransaction()
{
_connection.BeginTransaction();
_transacted = true;
}
/// <summary>
/// 開始數據庫事務。
/// </summary>
/// <param name="isolationLevel">事務鎖級別。</param>
public void BeginTransaction(IsolationLevel isolationLevel)
{
_connection.BeginTransaction(isolationLevel);
_transacted = true;
}
/// <summary>
/// 提交當前掛起的事務。
/// </summary>
public void Commit()
{
if (_transacted)
{
_transaction.Commit();
_transacted = false;
}
}
/// <summary>
/// 回滾當前掛起的事務。
/// </summary>
public void Rollback()
{
if (_transacted)
{
_transaction.Rollback();
_transacted = false;
}
}
/// <summary>
/// 對連接執行 Transact-SQL 語句並返回受影響的行數。
/// </summary>
/// <param name="commandText">SQL 語句</param>
/// <returns>返回受影響的行數。</returns>
public int ExecuteNonQuery(string commandText)
{
int result = 0;
Open();
using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText))
{
result = sqliteCommand.ExecuteNonQuery();
}
Close();
return result;
}
/// <summary>
/// 對連接執行 Transact-SQL 語句並返回受影響的行數。
/// </summary>
/// <param name="commandText">SQL 語句</param>
/// <param name="parmeters">要添加的 <see cref="SQLiteParameter"/> 值。</param>
/// <returns>返回受影響的行數。</returns>
public int ExecuteNonQuery(string commandText, SQLiteParameter[] parmeters)
{
int result = 0;
Open();
using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText))
{
sqliteCommand.Parameters.AddRange(parmeters);
result = sqliteCommand.ExecuteNonQuery();
}
Close();
return result;
}
/// <summary>
/// 執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <returns>結果集中第一行的第一列;如果結果集為空,則為空引用。返回的最大字符數為 2033 個字符。</returns>
public object ExecuteScalar(string commandText)
{
object result = null;
Open();
using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText))
{
result = sqliteCommand.ExecuteScalar();
}
Close();
return result;
}
/// <summary>
/// 執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <param name="parmeters">要添加的 <see cref="SQLiteParameter"/> 值。</param>
/// <returns>結果集中第一行的第一列;如果結果集為空,則為空引用。返回的最大字符數為 2033 個字符。</returns>
public object ExecuteScalar(string commandText, SQLiteParameter[] parmeters)
{
object result = null;
Open();
using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText))
{
sqliteCommand.Parameters.AddRange(parmeters);
result = sqliteCommand.ExecuteScalar();
}
Close();
return result;
}
/// <summary>
/// 查詢數據並返回一個 <see cref="DataSet"/>。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <returns>返回一個 <see cref="DataSet"/> 對象。</returns>
public DataSet GetDataSet(string commandText)
{
return GetDataSet(commandText, string.Empty);
}
/// <summary>
/// 查詢數據並返回一個 <see cref="DataSet"/>。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <param name="tableName">用於表映射的源表的名稱。</param>
/// <returns>返回一個 <see cref="DataSet"/> 對象。</returns>
public DataSet GetDataSet(string commandText, string tableName)
{
DataSet dataSet = new DataSet();
Open();
using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText, _connection))
{
using (SQLiteDataAdapter sqlAdapter = new SQLiteDataAdapter(sqliteCommand))
{
if (string.Empty.Equals(tableName))
{
sqlAdapter.Fill(dataSet);
}
else
{
sqlAdapter.Fill(dataSet, tableName);
}
}
}
Close();
return dataSet;
}
/// <summary>
/// 查詢數據並返回一個 <see cref="DataSet"/>。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <param name="sqlCommand"><see cref="SQLiteCommand"/> 對象。</param>
/// <returns>返回一個 <see cref="DataSet"/> 對象。</returns>
public DataSet GetDataSet(string commandText, out SQLiteCommand sqlCommand)
{
return GetDataSet(commandText, string.Empty, out sqlCommand);
}
/// <summary>
/// 查詢數據並返回一個 <see cref="DataSet"/>。
/// </summary>
/// <param name="commandText">用於查詢的 Sql 語句。</param>
/// <param name="tableName">用於表映射的源表的名稱。</param>
/// <param name="sqlCommand"><see cref="SQLiteCommand"/> 對象。</param>
/// <returns>返回一個 <see cref="DataSet"/> 對象。</returns>
public DataSet GetDataSet(string commandText, string tableName, out SQLiteCommand sqlCommand)
{
DataSet dataSet = new DataSet();
Open();
SQLiteCommand sqliteCommand = new SQLiteCommand(commandText, _connection);
using (SQLiteDataAdapter sqlAdapter = new SQLiteDataAdapter(sqliteCommand))
{
sqlAdapter.Fill(dataSet);
}
sqlCommand = sqliteCommand;
Close();
return dataSet;
}
/// <summary>
/// 為具有指定 <see cref="DataTable"/> 名稱的 <see cref="DataSet"/> 更新數據。
/// </summary>
/// <param name="dataSet">用於更新數據源的 <see cref="DataSet"/>。</param>
/// <param name="sqlCommand">指定的一個 <see cref="SQLiteCommand"/> 對象。</param>
/// <returns><see cref="DataSet"/> 中成功更新的行數。</returns>
public int Update(DataSet dataSet, ref SQLiteCommand sqlCommand)
{
return Update(dataSet, string.Empty, ref sqlCommand);
}
/// <summary>
/// 為具有指定 <see cref="DataTable"/> 名稱的 <see cref="DataSet"/> 更新數據。
/// </summary>
/// <param name="dataSet">用於更新數據源的 <see cref="DataSet"/>。</param>
/// <param name="tableName">用於表映射的源表的名稱。</param>
/// <param name="sqlCommand">指定的一個 <see cref="SQLiteCommand"/> 對象。</param>
/// <returns><see cref="DataSet"/> 中成功更新的行數。</returns>
public int Update(DataSet dataSet, string tableName, ref SQLiteCommand sqlCommand)
{
int result = 0;
Open();
using (SQLiteDataAdapter sqlAdapter = new SQLiteDataAdapter(sqlCommand))
{
using (SQLiteCommandBuilder sqlCommandBuilder = new SQLiteCommandBuilder(sqlAdapter))
{
if (string.Empty.Equals(tableName))
{
result = sqlAdapter.Update(dataSet);
}
else
{
result = sqlAdapter.Update(dataSet, tableName);
}
}
}
Close();
return result;
}
/// <summary>
/// 釋放該實例的托管資源。
/// </summary>
public virtual void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 釋放非托管資源。
/// </summary>
/// <param name="disposing"></param>
protected void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// 定義釋放非托管資源
}
_disposed = true;
}
}
#endregion
#region 屬性...
/// <summary>
/// 獲取數據庫連接字符串。
/// </summary>
public string ConnectionString
{
get
{
return _connectionString;
}
}
/// <summary>
/// 設置是否自動提交事務。
/// </summary>
public bool AutoCommit
{
get
{
return _autoCommit;
}
set
{
_autoCommit = value;
}
}
#endregion
#region 事件...
/// <summary>
/// 事務回滾事件。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Transaction_RollBack(object sender, EventArgs e)
{
_transacted = false;
}
/// <summary>
/// 事務提交事件。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Transaction_Commit(object sender, CommitEventArgs e)
{
_transacted = false;
}
#endregion
}
}
