zoukankan      html  css  js  c++  java
  • 学习Dapper 1.50.0.0 支持.Net4.0 和 XP

    为什么今天才开始学Dapper?
    回答:
    1、因为轻量、小巧、支持多种数据库,对于经常要改动SQL DataTable的项目,EF不适合。前几年在EF框架兴起的时候,学过几小时,发现每次修改表结构之后,EF要修改的地方太多,实在麻烦。所谓“最好的,不一定是最适合的”。
    2、一直沿用Ado.net开发,因为项目是企业级应用,要求灵活、多变,敲了十多年SQL代码。所谓“1年经验用10年”。

    举3个灵活例子:
    * 主键修改示例
    比如父子表的子表【条码品质信息表】,主键由【BarcodeTxt+TestID+ChildID】3列构成,如果要修改【TestID+ChildID】 这2列,就要多2列数据表不存在的实体列【baseTestID+baseChildID】;
    update Table set TestID = @TestID , ChildID=@ChildID ,Flag=Flag+1 where BarcodeTxt=@BarcodeTxt and baseTestID=@baseTestID and baseChildID=@baseChildID and Flag=@Flag -1
    此时用Ado.net最为方便,灵活修改。
    * 灵活删除示例
    Web开发,如Bootstrap和Angular的一些项目,前端DataTable初始化的时候绑定一个Del按钮,后续根据该按钮的Click(row_index)事件进行AJAX作业,JS这方面很灵活,不用初始化Del这一列。
    但是桌面程序WinForm开发,这样就不行,Datagridview需要给该Del列checkbox赋值,bool值 or customer值(Y:N),此时,最常用的方式是直接select table.*,'N' as [del_dgv] from table,然后直接binding给Del列。
    通过灵活使用SQL语句,减少了很多开发工作。
    * 灵活修改示例
    通常一个表colunms.count 从几列到几十列不等,代码框架批量生成的语句,都是修改全部列,这个不符合实际,所以批量生成之后,update 方法的修改工作量最大。
    StringBuilder sb = new StringBuilder();
    sb.Append(“ update table set Flag=Flag+1 ”);

    List<SqlParameter> list1 = new List<SqlParameter>();
    list1.Add(new SqlParameter("@Flag",SqlDbType.Int) {Value=1});

    //关键时候要判断列是否Null
    if( !string.IsNullOrEmpty ( model.column ) )
    {
    sb.Append(“ ,column =@column ”);
    list1.Add(new SqlParameter("@column ",SqlDbType.VarChar,100) {Value=model.column});
    }

    当table 里面有几十、上百列的时候,这个if判断就非常多了。

    3、带着疑问,已经2020年,抗美援朝70周年,开始进入Dapper学习。

    为什么用 Dapper 1.50.0.0 版本?
    回答:因为很多客户还在用XP,高版本以及Dapper.SimpleCRUD下章继续学习。

    怎么安装Dapper ?
    NuGet 或者 直接引用DLL。

    DapperHelper 帮助类:网上找的,具体版权是谁,已经不清楚了,感激。

    #region DapperHelper帮助类
        public class DapperHelper<T>
        {
            /// <summary>
            /// 数据库连接字符串
            /// </summary>
            private static readonly string connectionString =
                ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
    
            /// <summary>
            /// 查询列表
            /// </summary>
            /// <param name="sql">查询的sql</param>
            /// <param name="param">替换参数</param>
            /// <returns></returns>
            public static List<T> Query(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.Query<T>(sql, param).ToList();
                }
            }
    
            /// <summary>
            /// 查询第一个数据
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static T QueryFirst(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.QueryFirst<T>(sql, param);
                }
            }
    
            /// <summary>
            /// 查询第一个数据没有返回默认值
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static T QueryFirstOrDefault(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.QueryFirstOrDefault<T>(sql, param);
                }
            }
    
            /// <summary>
            /// 查询单条数据
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static T QuerySingle(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.QuerySingle<T>(sql, param);
                }
            }
    
            /// <summary>
            /// 查询单条数据没有返回默认值
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static T QuerySingleOrDefault(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.QuerySingleOrDefault<T>(sql, param);
                }
            }
    
            /// <summary>
            /// 增删改
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static int Execute(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.Execute(sql, param);
                }
            }
    
            /// <summary>
            /// Reader获取数据
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static IDataReader ExecuteReader(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.ExecuteReader(sql, param);
                }
            }
    
            /// <summary>
            /// Scalar获取数据
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static object ExecuteScalar(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.ExecuteScalar(sql, param);
                }
            }
    
            /// <summary>
            /// Scalar获取数据
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static T ExecuteScalarForT(string sql, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    return con.ExecuteScalar<T>(sql, param);
                }
            }
    
            /// <summary>
            /// 带参数的存储过程
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            public static List<T> ExecutePro(string proc, object param)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    List<T> list = con.Query<T>(proc,
                        param,
                        null,
                        true,
                        null,
                        CommandType.StoredProcedure).ToList();
                    return list;
                }
            }
    
    
            /// <summary>
            /// 事务1 - 全SQL
            /// </summary>
            /// <param name="sqlarr">多条SQL</param>
            /// <param name="param">param</param>
            /// <returns></returns>
            public static int ExecuteTransaction(string[] sqlarr)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    using (var transaction = con.BeginTransaction())
                    {
                        try
                        {
                            int result = 0;
                            foreach (var sql in sqlarr)
                            {
                                result += con.Execute(sql, null, transaction);
                            }
    
                            transaction.Commit();
                            return result;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            return 0;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 事务2 - 声明参数
            ///demo:
            ///dic.Add("Insert into Users values (@UserName, @Email, @Address)",
            ///        new { UserName = "jack", Email = "380234234@qq.com", Address = "上海" });
            /// </summary>
            /// <param name="Key">多条SQL</param>
            /// <param name="Value">param</param>
            /// <returns></returns>
            public static int ExecuteTransaction(Dictionary<string, object> dic)
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    using (var transaction = con.BeginTransaction())
                    {
                        try
                        {
                            int result = 0;
                            foreach (var sql in dic)
                            {
                                result += con.Execute(sql.Key, sql.Value, transaction);
                            }
    
                            transaction.Commit();
                            return result;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            return 0;
                        }
                    }
                }
            }
    
    
        }
        #endregion
    

    有了Dapper这个神器,90%的CURD工作已经可以顺利完成,List<User> list1 =  DapperHelper<userinfo>.Query("select * from User ",model);

    只是问题又来了:

    1、手写SQL的地方还是太多,应该反射并扩展方法,改成 var user = connection.GetList<User>();  

    这个是Dapper.SimpleCRUD 的功能,需要.NET 4.4 以上版本,XP 就无法享受这样的福利。

    2、上面提到的灵活示例,1和2解决了,3还是无法解决,还是需要手写很多if, 请问 Dapper.SimpleCRUD 能解决吗? 明天继续。

    The End.

  • 相关阅读:
    php安装xcache (5.4)
    nginx博客系统(内含nginx图片缩略图处理代码,不错)
    一个mysql开启多个端口
    mysql源码重启
    ecshop支付时减库存方法
    n阶幻方问题
    codeforces 710A King Moves(水)
    关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
    codeforces 701C. They Are Everywhere(尺取法)
    codeforces 701 B. Cells Not Under Attack
  • 原文地址:https://www.cnblogs.com/cyg17173/p/12895781.html
Copyright © 2011-2022 走看看