Dapper+Sqlite執行增刪改查功能


樓主前段時間無聊買了個阿里雲的服務器配置是最低配的 如果裝了mysql  內存貌似不夠用,於是用了sqlite代替關系型數據庫。

首先說下sqlite優缺點

優點

   1. sqlite不用安裝,不用配置,不用啟動,整個數據庫相當於一個文件,直接存放在磁盤上,因此它有很好的遷移性。

   2. sqlite是輕量級數據庫,它可以用作關系數據庫,不用任何啟動任何系統進程。

   3. 它可以運行在Windows,Linux,Mac OSX等系統,同樣,它也可以工作在許多嵌入式操作系統下。

缺點

  1.它的性能發揮只能在存放較小的數據量情況下。不能當做MYSQL甚至ORACLE來使用。

  2.在大數據量的情況下表現較差 但是中小站點一般情況下數據量不超過10萬。

  3. sqlite 的寫入速度很慢(使用Dapper插入1000條數據差不多1-2秒),同時也不適合多線程插入。

適用場景

   個人網站基本上是一個人管理,一般情況下只有一個人在訪問后台,沒有並發。

   可以在一些設備本身的存儲設備或者外接的存儲設備中創建用於保存數據的文件。

使用Dapper連接sqlite關系型數據庫代碼如下:

public class DbBase : IDisposable
    {
        private string paramPrefix = "@";
        private string providerName = "System.Data.SQLite";
        private IDbConnection dbConnecttion;
        private DbProviderFactory dbFactory;
        private DBType _dbType = DBType.SqlServer;
        public IDbConnection DbConnecttion
        {
            get
            {
                return dbConnecttion;
            }
        }
        public IDbTransaction DbTransaction
        {
            get
            {
                return dbConnecttion.BeginTransaction();
            }
        }
        public string ParamPrefix
        {
            get
            {
                return paramPrefix;
            }
        }
        public string ProviderName
        {
            get
            {
                return providerName;
            }
        }
        public DBType DbType
        {
            get
            {
                return _dbType;
            }
        }

        public DbBase(string connectionStringName)
        {
            var connStr = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
            if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName))
                providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
            else
                throw new Exception("ConnectionStrings中沒有配置提供程序ProviderName!");
            dbFactory = DbProviderFactories.GetFactory(providerName);
            dbConnecttion = dbFactory.CreateConnection();
            dbConnecttion.ConnectionString = connStr;
            dbConnecttion.Open();
            SetParamPrefix();
        }


        private void SetParamPrefix()
        {
            string dbtype = (dbFactory == null ? dbConnecttion.GetType() : dbFactory.GetType()).Name;

            // 使用類型名判斷
            if (dbtype.StartsWith("MySql")) _dbType = DBType.MySql;
            else if (dbtype.StartsWith("SqlCe")) _dbType = DBType.SqlServerCE;
            else if (dbtype.StartsWith("Npgsql")) _dbType = DBType.PostgreSQL;
            else if (dbtype.StartsWith("Oracle")) _dbType = DBType.Oracle;
            else if (dbtype.StartsWith("SQLite")) _dbType = DBType.SQLite;
            else if (dbtype.StartsWith("System.Data.SqlClient.")) _dbType = DBType.SqlServer;
            // else try with provider name
            else if (providerName.IndexOf("MySql", StringComparison.InvariantCultureIgnoreCase) >= 0) _dbType = DBType.MySql;
            else if (providerName.IndexOf("SqlServerCe", StringComparison.InvariantCultureIgnoreCase) >= 0) _dbType = DBType.SqlServerCE;
            else if (providerName.IndexOf("Npgsql", StringComparison.InvariantCultureIgnoreCase) >= 0) _dbType = DBType.PostgreSQL;
            else if (providerName.IndexOf("Oracle", StringComparison.InvariantCultureIgnoreCase) >= 0) _dbType = DBType.Oracle;
            else if (providerName.IndexOf("SQLite", StringComparison.InvariantCultureIgnoreCase) >= 0) _dbType = DBType.SQLite;

            if (_dbType == DBType.MySql && dbConnecttion != null && dbConnecttion.ConnectionString != null && dbConnecttion.ConnectionString.IndexOf("Allow User Variables=true") >= 0)
                paramPrefix = "?";
            if (_dbType == DBType.Oracle)
                paramPrefix = ":";
        }

        public void Dispose()
        {
            if (dbConnecttion != null)
            {
                try
                {
                    dbConnecttion.Dispose();
                }
                catch { }
            }
        }
    }
    public enum DBType
    {
        SqlServer,
        SqlServerCE,
        MySql,
        PostgreSQL,
        Oracle,
        SQLite
    }
 /// <summary>
        /// 插入數據
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dbs"></param>
        /// <param name="t"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        public static bool Insert<T>(this DbBase dbs, T t, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
        {
            var db = dbs.DbConnecttion;
            var sql = SqlQuery<T>.Builder(dbs);
            var flag = db.Execute(sql.InsertSql, t, transaction, commandTimeout);
            return flag == 1;
        }

        /// <summary>
        /// 插入數據
        /// </summary>
        /// <typeparam name="T">模型類型</typeparam>
        /// <param name="dbs">理解數據</param>
        /// <param name="t">數據內容</param>
        /// <param name="transaction">事物</param>
        /// <param name="commandTimeout">連接時間</param>
        /// <returns></returns>
        public static int InsertTwo<T>(this DbBase dbs, T t, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
        {
            var db = dbs.DbConnecttion;
            var sql = SqlQuery<T>.Builder(dbs);
            NewId identity = new NewId();

            string strSql = sql.InsertSql + ";SELECT LAST_INSERT_ID() as Id;";
            identity = db.Query<NewId>(strSql, t, transaction, true, commandTimeout, null).Single<NewId>();

            return identity.Id;
        }

        /// <summary>
        ///  批量插入數據
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dbs"></param>
        /// <param name="lt"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <returns></returns>
        public static bool InsertBatch<T>(this DbBase dbs, IList<T> lt, IDbTransaction transaction = null, int? commandTimeout = null) where T : class
        {
            var db = dbs.DbConnecttion;
            var sql = SqlQuery<T>.Builder(dbs);
            var flag = db.Execute(sql.InsertSql, lt, transaction, commandTimeout);
            return flag == lt.Count;
        }

        /// <summary>
        /// 按條件刪除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dbs"></param>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static bool Delete<T>(this DbBase dbs, SqlQuery sql = null) where T : class
        {
            var db = dbs.DbConnecttion;
            if (sql == null)
            {
                sql = SqlQuery<T>.Builder(dbs);
            }
            var f = db.Execute(sql.DeleteSql, sql.Param);
            return f > 0;
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dbs"></param>
        /// <param name="t">如果sql為null,則根據t的主鍵進行修改</param>
        /// <param name="sql">按條件修改</param>
        /// <returns></returns>
        public static bool Update<T>(this DbBase dbs, T t, SqlQuery sql = null) where T : class
        {
            var db = dbs.DbConnecttion;
            if (sql == null)
            {
                sql = SqlQuery<T>.Builder(dbs);
            }
            sql = sql.AppendParam<T>(t);
            var f = db.Execute(sql.UpdateSql, sql.Param);
            return f > 0;
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dbs"></param>
        /// <param name="t">如果sql為null,則根據t的主鍵進行修改</param>
        /// <param name="updateProperties">要修改的屬性集合</param>
        /// <param name="sql">按條件修改</param>
        /// <returns></returns>
        public static bool Update<T>(this DbBase dbs, T t, IList<string> updateProperties, SqlQuery sql = null) where T : class
        {
            var db = dbs.DbConnecttion;
            if (sql == null)
            {
                sql = SqlQuery<T>.Builder(dbs);
            }
            sql = sql.AppendParam<T>(t)
                .SetExcProperties<T>(updateProperties);
            var f = db.Execute(sql.UpdateSql, sql.Param);
            return f > 0;
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <typeparam name="T">模型類型</typeparam>
        /// <param name="dbs">db</param>
        /// <param name="t">修改的數據</param>
        /// <param name="sql">修改的SQL語句</param>
        /// <returns></returns>
        public static bool Update<T>(this DbBase dbs, T t, string sql) where T : class
        {
            var db = dbs.DbConnecttion;
            var f = db.Execute(sql, t);
            return f > 0;
        }

 測試源代碼如下

鏈接: https://pan.baidu.com/s/1dFlPHDJ 密碼: ja8h


免責聲明!

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



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