網頁

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

 

以上

沒有留言:

張貼留言