1.前言

上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 .

经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布环境还是走Dapper的参数化查询, 保持原有优势.

见如下代码.

2. 在开发调试阶段 抓最终SQL

将Dapper 查询Query 和执行Execute 进行了再包装, 插入了 抓最终sql 的代码

 public class DapperTaller
    {

        /// <summary>
        /// dapper 执行查询 sql
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static IEnumerable<T> Query<T>(string sql, object param)
        {
            IEnumerable<T> result = null;
            using (var con = DBHelper.GetConnection())
            {
                result = con.Query<T>(sql, param);
            }

            //开发环境代码
            if (GlobalVariable.env.IsDevelopment()) //IsDevelopment 方法为Asp.NET Core 自带的 是否为开发环境的判断方法
            {
                //最终SQL
                var debugSql = GetDebugSQL(sql, param);
                Debug.WriteLine(debugSql);
            }

            return result;
        }

        /// <summary>
        /// dapper 执行 增加, 删除 ,修改 sql
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static int Execute(string sql, object param)
        {
            int result;
            using (var con = DBHelper.GetConnection())
            {
                result = con.Execute(sql, param);
            }

            //开发环境代码
            if (GlobalVariable.env.IsDevelopment()) //IsDevelopment 方法为Asp.NET Core 自带的 是否为开发环境的判断方法
            {
                //最终SQL
                var debugSql = GetDebugSQL(sql, param);
                Debug.WriteLine(debugSql);
            }

            //生产环境代码
            if (GlobalVariable.env.IsProduction())
            {
                //根据需要将最终SQL 记录到日志

            }

            return result;
        }

        public static string GetDebugSQL(string sql, object param)
        {
            var sqlHelper = new SqlHelper();
            foreach (var item in param.GetType().GetProperties())
            {
                var name = item.Name;
                var value = item.GetValue(param);
                sqlHelper.Param.Add(name, value);
            }

            sqlHelper.ReplaceParam(ref sql);
            return sql;
        }

    }

    public class DBHelper
    {
        public static IDbConnection GetConnection()
        {
            return SQLServerHelper.GetConnection();
        }
    }

调用代码:

 public IEnumerable<Ptype> GetPtypeDetail()
        {
            var sql = @"
 SELECT
    *
 FROM dbo.CoacherStudentMoney a
 INNER JOIN dbo.BaseData b ON a.CourseTypeId=b.Id
 WHERE
 StudentUserId=@StudentUserId AND Amount=@Amount
 AND IsPay=@IsPay AND CreateDate=@CreateDate

";
            var param = new
            {
                StudentUserId = "001",
                CreateDate = DateTime.Now,
                Amount = 3,
                IsPay = true
            };

            IEnumerable<Ptype> plist = new List<Ptype>();
            plist = DapperTaller.Query<Ptype>(sql, param);

            return plist;
        }

最上面代码的此处为最终SQL 抓取

          //开发环境代码
            if (GlobalVariable.env.IsDevelopment())
            {
                //最终SQL
                var debugSql = GetDebugSQL(sql, param);
                Debug.WriteLine(debugSql);
            }
    

并且会在VS 的输出窗口输出

进一步方便了调试.

3.最后

现在最终SQL 的抓取发生在 调试开发阶段 .

发布代码后, 将不会进行最终SQL的抓取. 并且走的还是Dapper 原有参数化查询的方式, 依旧拥有执行计划重用, 防SQL注入的优势.

写出易调试的SQL—西科软件的更多相关文章

  1. 写出易调试的SQL(修订版)

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  2. 写出易调试的SQL

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  3. 写出易于调试的SQL

    1.前言 相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦. 在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让 ...

  4. 《西科软件》一个高级PHP工程师所应该具备的

    初次接触PHP,就为他的美所折服,于是一发不可收拾.很多面试,很多人员能力要求都有"PHP高级工程师的字眼",如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师 ...

  5. 如何写出性能好的sql

    开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...

  6. Mysql写出高质量的sql语句的几点建议

    CleverCode在实际的工作也写过一些低效率的sql语句.这些语句会给数据库带来非常大的压力.最基本的表现就是sql语句执行慢,后来逐渐的去优化和尝试. 总结了一些高质量的sql语句的写法.这里C ...

  7. Oracle 如何写出高效的 SQL

    转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽 ...

  8. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  9. Oracle如何写出高效的SQL

    转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...

随机推荐

  1. R&S学习笔记(二)

    1.OSPF:路由条目1万多条.收敛时间1s:ISIS:路由条目可以达2万多条,收敛时间50ms().ISIS在链路层上面,不依赖IP这层,这样给了它很多可能.比如IPv4, IPv6路由的混合承载, ...

  2. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  3. IOS 设置导航栏全局样式

    // 1.设置导航栏背景 UINavigationBar *bar = [UINavigationBar appearance]; [bar setBackgroundImage:[UIImage r ...

  4. 新做的一个基于OPENGL的gui库

    #include <BGE/All> ,text);     button->setName(name);     button->setSize(Vector2f(,)); ...

  5. View Controller Relationships

    Parent-child relationshipsParent-child relationships are formed when using view controller container ...

  6. WIN7-修改域名

    前言:访问本地项目有如下的几种方式,其中通过修改域名配置文件的方式使用的较少,不过在某些项目中也会使用的到(比如:我曾经参与的一个项目使用到SpringCloud框架,需要将每个微服务注册到,服务控制 ...

  7. 2016/9/25编写java实验报告时对synchronized(同步代码块)的一些感悟

    通过此次实验,明白了多线程的设置和启动.synchronized代码块的用法.线程的优先级使用方法.知道了那几类资源是线程共享的. 我现在理解的多线程是:实例化一个继承了Thread类或实现了Runn ...

  8. C中的qsort函数和C++中的sort函数的理解与使用

    一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...

  9. linux系统的常用命令

    linux系统中常用的命令如下(以后经常补充): cd ..   返回上一级 cd use  进入use目录

  10. vi、vim 查找替换

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...