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
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM