2014年6月19日 星期四

Glimpse + ASP.NET WebForms + ADO.NET

前一篇「MiniProfiler 3 + ASP.NET WebForms + ADO.NET」是說明怎麼在 ASP.NET WebForms 與 ADO.NET 的情況下去怎麼使用 MiniProfiler 以及如何修改設定,同樣的在 twMVC#15 裡也有分享另一個套件「Glimpse」。

與 MiniProfiler 比較起來,Glimpse 不止是提供 EF 的 SQL Command 追蹤或執行方法的效能追蹤,此外還有提供多種的頁面訊息,讓我們在開發時可以掌握更多的資訊,這些在以前的文章都曾經有介紹過,可以查看部落格裡的 Glimpse 相關文章

之前的文章都是以 ASP.NET MVC + Entity Framework 的情況下來做說明,而 Glimpse 在 1.7.0 版之後也發布了對於 ASP.NET WebForms 的支援,而 Glimpse.WebForms 可以說是原本 ASP.NET Trace 功能的進階加強版,所能提供的資訊與內容是更多樣且更為清晰。

但是在使用 ASP.NET WebForms + ADO.NET 的情況下,如果使用 Glimpse 而沒有經過任何調整的處理,那麼在 SQL Tab 是不會有任何作用與資訊,所以這一篇就來說明要怎麼調整讓 Glimpse 的 SQL Tab 可以顯示頁面執行 ADO.NET 存取資料的 SQL Command 內容。

 


Glimpse

http://getglimpse.com/

image

對於 Glimpse 不了解或是不知道它有什麼用處的朋友,可以前往下面的連結,先體驗一下 Glimpser 的功能,

http://play.getglimpse.com/

而至於想要了解 Glimpse for ASP.NET WebForms 的朋友,可以看看以下連結的影片,大概就能夠了解,

https://www.youtube.com/watch?v=vS6ONq6YwyI

 

實作

範例程式的架構跟前一篇文章「MiniProfiler 3 + ASP.NET WebForms + ADO.NET」的是一樣的,

image

然後透過 NuGet 加入以下的 Glimpse 相關套件:

Glimpse Core

Glimpse WebForms

Glimpse ADO

Glimpse ASP.NET

image

安裝完成之後並不需要修改 Global.asax.cs 與 Site.Master,不過必須要修改透過 ADO.NET 資料存取的部份程式內容,因為要使用 Glimpse 所提供的方法來建立 DbConnection 與 DbCommand,如此才能在 Glimpse 的 SQL Tab 顯示 SQL Command 內容。

 

BaseRepository.cs

在 BaseRepository 裡有一個 CreateGlimpseDbConnection 方法,這是用來建立 GlimpseDbConnection。

namespace WebApplication1.Models.Repository
{
    public abstract class BaseRepository
    {
        private string _connectionString;
        public string ConnectionString
        {
            get { return _connectionString; }
            set { _connectionString = value; }
        }
 
        public string ProviderName
        {
            get
            {
                return WebConfigurationManager.ConnectionStrings["Northwind"].ProviderName;
            }
        }
 
        public BaseRepository()
        {
            this.ConnectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
        }
 
        public BaseRepository(string connectionString)
        {
            if (!string.IsNullOrWhiteSpace(connectionString))
            {
                this._connectionString = connectionString;
            }
        }
 
        public GlimpseDbConnection CreateGlimpseDbConnection()
        {
            return new GlimpseDbConnection(new SqlConnection(this.ConnectionString));
        }
    }
}

 

CategoryRepository  - GetCategories 方法

DbConnection 要使用在 BaseRepository 的 GetGlimpseDbConnection 方法來取得 GlimpseDbConnection,在方法裡的 DbCommand 建立,這地方要建立 Glimpse.ADO 的 GlimpseDbCommand 類別的物件,除此之外就沒有地方要做修改了。

public List<Category> GetCategories()
{
    var categories = new List<Category>();
 
    string sqlStatement = "select * from Categories order by CategoryID desc";
 
    using (var conn = this.CreateGlimpseDbConnection())
    using (var command = new GlimpseDbCommand(new SqlCommand()))
    {
        command.Connection = conn;
        command.CommandType = CommandType.Text;
        command.CommandTimeout = 180;
        command.CommandText = sqlStatement;
 
        if (conn.State != ConnectionState.Open) conn.Open();
 
        using (IDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var item = new Category
                {
                    CategoryID = int.Parse(reader["CategoryID"].ToString()), 
                    CategoryName = reader["CategoryName"].ToString(), 
                    Description = reader["Description"].ToString()
                };
 
                categories.Add(item);
            }
        }
    }
    return categories;
}

 

CategoryRepository – GetOne 方法

/// <summary>
/// Gets the one.
/// </summary>
/// <param name="id">The id.</param>
/// <returns></returns>
public Category GetOne(int id)
{
    string sqlStatement = "select * from Categories where CategoryID = @CategoryID";
 
    var item = new Category();
 
    using (var conn = this.CreateGlimpseDbConnection())
    using (var command = new GlimpseDbCommand(new SqlCommand()))
    {
        command.Connection = conn;
        command.CommandType = CommandType.Text;
        command.CommandTimeout = 180;
        command.CommandText = sqlStatement;
 
        command.Parameters.Add(new SqlParameter("CategoryID", id));
 
        if (conn.State != ConnectionState.Open) conn.Open();
 
        using (IDataReader reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                item.CategoryID = int.Parse(reader["CategoryID"].ToString());
                item.CategoryName = reader["CategoryName"].ToString();
                item.Description = reader["Description"].ToString();
            }
        }
    }
    return item;
}

 

執行結果

image

image

image

image

image

image

image

image

image

image

 


參考連結

Manual ADO Integration · Glimpse/Glimpse Wiki

asp.net - Can Glimpse provide diagnostics when using the SqlClient namespace classes - Stack Overflow

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。