关于MVC+dapper 记录SQL日志的问题

公司有个项目底层用的dapper,现在需要记录SQL日志,请问如何获取dapper最后执行的sql进行记录... 公司有个项目底层用的dapper,现在需要记录SQL日志,请问如何获取dapper最后执行的sql进行记录 展开
 我来答
277366155
2018-11-08 · TA获得超过561个赞
知道小有建树答主
回答量:306
采纳率:0%
帮助的人:92.6万
展开全部

可以参考dapper源码,或者反编译一下dapper.dll,在dapper之上再封装一层拓展方法,正好最近我也在做这个,下面代码可以参考一下:

   using Dapper;
   //封装的拓展类
    public static class DapperExtension
    {
        public static int CExecute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            var beginTime = DateTime.Now;
            return  SqlMapper.Execute(cnn, sql, param, transaction, commandTimeout, commandType).ToLog(sql,param, beginTime);
        }

        public static int CExecute(this IDbConnection cnn, CommandDefinition command)
        {
            var beginTime = DateTime.Now;
            return SqlMapper.Execute(cnn, command).ToLog(command.CommandText,command.Parameters,beginTime);
        }
        ……
        }
        
        //日志记录拓展方法
           private static T ToLog<T>(this T result, string sql, object param, DateTime beginTime, IDbConnection conn =null)
        {
            //日志记录要异步进行,防止日志记录时报错,影响业务流程
            Task.Run(()=> {
                var now = DateTime.Now;
                var log = new LogModel()
                {
                    CreateTime = now,
                    SqlStr = sql,
                    ExcuteResult = result.ToJsonString(),
                    Timespan = (now - beginTime).TotalMilliseconds                    
                };

                if (param != null)
                {
                    foreach (var p in param.GetType().GetProperties())
                    {
                        log.SqlStr=log.SqlStr.Replace("@"+p.Name,p.GetValue(param).ToString());
                    }
                }

                //日志记录到MongoDB中
                MongoDbHelper.SetCollection(log, "Log_"+ now.ToString("yyyyMMdd"), "ExcuteLog");
            });

            return result;
        }
//调用示例:

        public int GetInfo(string sql, object param = null)
        {
             var connStr="....";//数据库连接字符串
            using (var conn = new MySqlConnection(connStr))
            {
                var result = conn.CExecute(sql, param);
                return result;
            }
        }
TableDI
2024-07-18 广告
VLOOKUP 是 Excel 中一个非常实用的函数,它允许用户在一个区域或表格的首列中查找特定值,并返回同一行中指定列中的值。当进行跨表匹配时,你可以使用 VLOOKUP 函数将两个不同表格中的数据关联起来。通过指定查找值、表格数组、列号... 点击进入详情页
本回答由TableDI提供
百度网友5766f0b
2018-07-31
知道答主
回答量:89
采纳率:40%
帮助的人:6.5万
展开全部
应该是获取ID最大的或时间最大的那条数据吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
廖廖赏花旅程Cr79a
2018-07-30
知道答主
回答量:9
采纳率:0%
帮助的人:7185
展开全部
我好像也不知道
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式