C# 中使用 SQLite 数据库

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
    }
}
posted @ 2012-04-01 13:33  Charles Zhang  阅读(8959)  评论(4编辑  收藏  举报