查看Dapper最终生成的SQL语句的函数方法[超简单]

Dapper的SQL语句和参数,一般形式如下:

      public static t_User RunLogin(string userName, string pwd)
        {
            var user = DapperHelper<t_User>
                .QueryFirstOrDefault("select * from [t_User] where IsValid=1 and UserName=@UserName and PassWord=@PassWord",
                new { UserName = userName, PassWord = pwd });
            return user;
        }

调试的时候不是很方便,参数值和SQL语句是分离的...

怎样吧参数的值替换到Sql语句对应的位置上面?让他变成:

select * from [t_User] where IsValid=1 and UserName='admin' and PassWord='admin01'

这个样子....


思路:只要把object型的匿名对象param转换一下,做成一个包含了key和value的数组,key就是参数名,value就是参数值,只要遍历一下参数集合,把SQL语句的 value值 去替换 @+key的字符串 即可:

    /// <summary>
    /// 查看Dapper最终生成的SQL语句
    /// </summary>
    public class KeyValue
    {
        public string Key { get; set; }
        public string Value { get; set; }
        public static string GetSqlStr(string sql, object param = null)
        {
            try
            {
                string tempSql = sql;
                if (param != null)
                {
                    if (param.ToString().Contains("{") && param.ToString().Contains("}"))//匿名类型
                    {
                        string[] arr = param.ToString().Replace("{", "").Replace("}", "").Split(',');
                        List<KeyValue> paramList = new List<KeyValue>();
                        foreach (var item in arr)
                        {
                            KeyValue kv = new KeyValue();
                            string[] temp = item.Split('=');
                            kv.Key = temp[0].Trim();
                            kv.Value = temp[1].Trim();
                            paramList.Add(kv);
                        }
                        foreach (var par in paramList)
                        {
                            tempSql = tempSql.Replace("@" + par.Key, "'" + par.Value + "'");
                        }            
                    }
                    else//自定义实体类型
                    {               
                        Type type = param.GetType();
                        foreach (PropertyInfo p in type.GetProperties())
                        {                           
                            var Key = p.Name;      
                            var Value = p.GetValue(param);
                            tempSql = tempSql.Replace("@" + Key, "'" + Value + "'");
                        }
                    }
                }
                return tempSql;
            }
            catch
            {
                return sql;
            }
        }
    }

调用此方法:

  string sqlStr = KeyValue.GetSqlStr(sql, param);//仅供调试用的SQL语句

举例:

       public static T QueryFirstOrDefault(string sql, object param = null)
        {
            string sqlStr = KeyValue.GetSqlStr(sql, param);//仅供调试用的SQL语句
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    return con.Query<T>(sql, param).ToList().FirstOrDefault();
                }
                catch
                {
                    return default(T);
                }
            }
        }

实际效果:

终于可以直接复制拼接好参数值的SQL语句到sqlserver2014里粘贴执行起来看结果了....

可能生成的SQL语句也有意想不到的情况,但稍微改一下就行了...

 

自用 DapperHelper:https://blog.csdn.net/djk8888/article/details/108726056

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值