More

    .Net Core Project 從零開始 — Miniprofiler record Dapper SQL Statement

    繼上次分享的.Net Core Project 從零開始 — Miniprofiler針對application進行效能監控,這次要使用Miniprofiler套件將Dapper execute 的 SQL Statement錄製下來。

    先看看舊的code

    有個缺點,在使用Dapper Query 查資料的時候,Query function都要再自行建立 SQL Connection使用起來滿麻煩的,這次的範例我會把這些初始化SQL Connection抽成共用,讓程式對於資料庫連線更方便使用。

    *目前有兩件事要做到的

    1. 使用Miniprofiler 將Dapper execute 的 SQL Statement錄製下來

    2. 把初始化SQL Connection抽成共用

    Step 1: CakeMyBlog.Platform Project 使用Nuget加入套件

    1.Dapper
    2.Microsoft.VisualStudio.Services.Client
    3.MiniProfiler.AspNetCore.Mvc

    Step 2: 對 DataAccessService.cs 進行加工,加入初始化function 把 SQL Connection 共用與 MiniProfiler record SQL Statement

            /// <summary>
            /// 建立資料庫連線
            /// </summary>
            /// <returns>資料庫連線</returns>
            private IDbConnection GetDbConnection()
            {
                IDbConnection dBConnection;
    
                if (!_enableMiniprofiler)
                {
                    dBConnection = new SqlConnection(_connectionStr);
                }
                else
                {
                    dBConnection = new ProfiledDbConnection(
                        new SqlConnection(_connectionStr), MiniProfiler.Current);
                }
    
                if (dBConnection.State != ConnectionState.Open)
                {
                    dBConnection.Open();
                }
    
                return dBConnection;
            }

    Step 3: DataAccessService.cs 加入兩個 Query function 查詢多筆資料與單筆資料

            /// <summary>
            /// 查詢資料
            /// </summary>
            /// <typeparam name="TReturn">回覆的資料類型</typeparam>
            /// <param name="querySql">SQL敘述</param>
            /// <param name="param">查詢參數物件</param>
            /// <param name="commandType">敘述類型</param>
            /// <returns>資料物件</returns>x
            public async Task<IEnumerable<TReturn>> QueryAsync<TReturn>(string querySql, object param = null, CommandType commandType = CommandType.Text)
            {
                using (IDbConnection con = GetDbConnection())
                {
                    return await con.QueryAsync<TReturn>(querySql, param, null, _connectionTimeout, commandType).ConfigureAwait(false);
                }
            }
    
            /// <summary>
            /// 查詢第一筆資料
            /// (無結果回傳Null)
            /// </summary>
            /// <typeparam name="TResult">回傳的資料型態</typeparam>
            /// <param name="querySql">SQL敘述</param>
            /// <param name="param">查詢參數</param>
            /// <param name="commandType">敘述類型</param>
            /// <returns>資料物件</returns>
            public async Task<TResult> QueryFirstOrDefaultAsync<TResult>(string querySql, object param = null, CommandType commandType = CommandType.Text)
            {
                using (IDbConnection con = GetDbConnection())
                {
                    return await con.QueryFirstOrDefaultAsync<TResult>(querySql, param, null, _connectionTimeout, commandType).ConfigureAwait(false);
                }
            }

    Final Step: 在對Provider.cs進行調整,呼叫共用的Query Service

    來看看效果是怎麼樣

    這樣在開發時就會記錄背後實際執行了什麼 SQL Statement,開發階段Debug非常方便又輕鬆。

    Conclusion:這次將初始化SQL Connection抽成共用並且在抽共用的同時把要執行的SQL Statement使用Miniprofiler把執行Script 記錄下來,在開發階段對於背後執行的SQL Statement Debug變得非常輕鬆又方便。

    Source : .Net Core Project 從零開始 — Miniprofiler record Dapper SQL Statement

    .Net Core Project GitHub:Link

    參考文章

    MiniProfiler .NET Documentation

    Recent Articles

    spot_img

    Related Stories

    Stay on op - Ge the daily news in your inbox