輕輕的我走了,正如我輕輕的來…——ADO.NET核心類的滅度與SQLHelper的誕生——十八相送(下)


源代碼:13033480群共享

ADO.NET的SqlServer.NET數據提供程序,核心的類有4個,而在這個訂餐系統中,我們只使用了3個,SqlConnection、SqlCommand、SqlDataReader,就是這3個核心類,我們也將要把它們封裝到SQLHelper.cs類中。

 

前面,我們在使用這幾個類訪問數據庫的時候,有人,覺得很簡單;有人,甚至覺得很煩了。

 

我們再送它們幾程吧,不由得想起了那句詩:

 

輕輕的我走了,

正如我輕輕的來;

 

我輕輕的招手,

作別西天的雲彩……

 

 

四相送,送到代碼頁里的類SQLHelper中

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;

namespace WestGarden.Web
{
    public partial class Default6 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            IList<CategoryInfo> catogories = new List<CategoryInfo>();

            string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;
            string cmdText = "SELECT * FROM Category";

            //使用靜態類,應用程序運行的時候,它就存在於內存中了,所以,也就不需要再new了。
            SqlDataReader rdr = SqlHelper.ExecuteReader(connectionString, CommandType.Text, cmdText,null);

            while (rdr.Read())
            {
                CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
                catogories.Add(category);
            }
            rdr.Close();

            ddlCategories.DataSource = catogories;
            ddlCategories.DataTextField = "Name";
            ddlCategories.DataValueField = "CategoryId";
            ddlCategories.DataBind();
        }
    }

    //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中,
    //也只是Close(),放回到連接池中。並沒有注銷Dispose(),可以下次連接時,快速使用。
    public abstract class SqlHelper
    {
        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(connectionString);

            try
            {
                //cmd.Connection = conn;
                //cmd.CommandType = cmdType;
                //cmd.CommandText = cmdText;
                
                //conn.Open();

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

                //如果創建了 SqlDataReader 並將 CommandBehavior 設置為 CloseConnection,
                //則關閉 SqlDataReader 會自動關閉此連接。
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
            //finally
            //{
            //    conn.Close();
            //}
        }

        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
    }
}

 

五相送,送到App_Code文件夾中的類SQLHelper.cs中。

第一次在Web中添加類,會提示建立文件夾App_Code,放在這個文夾中的類,使用起來,和前面放在主頁中沒有任何區別,不需要添加引用,也不需要using…

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace WestGarden.Web
{

    /// <summary>
    /// SQLHelper 的摘要說明
    /// </summary>
    //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中,
    //也只是Close(),放回到連接池中。並沒有注銷Dispose(),可以下次連接時,快速使用。
    public abstract class SqlHelper
    {
        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(connectionString);

            try
            {
                //cmd.Connection = conn;
                //cmd.CommandType = cmdType;
                //cmd.CommandText = cmdText;

                //conn.Open();

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

                //如果創建了 SqlDataReader 並將 CommandBehavior 設置為 CloseConnection,
                //則關閉 SqlDataReader 會自動關閉此連接。
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
            //finally
            //{
            //    conn.Close();
            //}
        }

        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
    }
}

 

此時,主頁代碼不需要做任何改變,在這里,就不貼出來了。

 

六相送,送到類庫DBUtility中的類SQLHelper.cs中。

把類建立在類庫DBUtility中,使用起來就不一樣了。第一,要在Web中添加引用→項目→DBUtility;第二,要使用using WestGarden.DBUtility。使用類庫中的類,都需要這么兩步,如果這兩步都不少,還是出錯的話,那,極有可能是這個類庫單獨編譯就沒有通過,沒有生成dll文件。

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace WestGarden.DBUtility
{

    /// <summary>
    /// SQLHelper 的摘要說明
    /// </summary>
    //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中,
    //也只是Close(),放回到連接池中。並沒有注銷Dispose(),可以下次連接時,快速使用。
    public abstract class SqlHelper
    {
        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(connectionString);

            try
            {
                //cmd.Connection = conn;
                //cmd.CommandType = cmdType;
                //cmd.CommandText = cmdText;

                //conn.Open();

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

                //如果創建了 SqlDataReader 並將 CommandBehavior 設置為 CloseConnection,
                //則關閉 SqlDataReader 會自動關閉此連接。
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
            //finally
            //{
            //    conn.Close();
            //}
        }

        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
    }
}

 

 

此時,主頁代碼,只多了一句using WestGarden.DBUtility;在我們這個訂餐系統中,類別表主要使用了兩種呈現方式:下拉列表框和Repeater,這里,我們把使用Repeater的后台代碼貼一下吧,前台代碼,就略了…

sing System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;
using WestGarden.DBUtility;

namespace WestGarden.Web
{
    public partial class Default8 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            IList<CategoryInfo> catogories = new List<CategoryInfo>();

            string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;
            string cmdText = "SELECT * FROM Category";

            //使用靜態類,可直接調用,不需要new。
            SqlDataReader rdr = SqlHelper.ExecuteReader(connectionString, CommandType.Text, cmdText,null);

            while (rdr.Read())
            {
                CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
                catogories.Add(category);
            }
            rdr.Close();

            repCategories.DataSource = catogories;
            repCategories.DataBind();
        }
    } 
}

一點說明:

類庫DBUtility中的SQLHelper.cs,使用了抽象類和靜態函數。這個類,使用的時候,不需要實例化,可以直接調用。但,還不完全是微軟的SQLHelper,進一步的改進,是把連接字符串放在Web.config文件中,並建立了連接池,而在SQLHelper中讀出來,放在靜態的字符串中。這會進一步改進它的性能。

另:我們目前使用的這個SQLHelper,似乎並不是微軟的最新版本,最新版本的SQLHelper又做了哪些改進,它的詳細的運行機制怎么樣,有待於大家共同的探討哈...

版權所有©2012,WestGarden.歡迎轉載,轉載請注明出處.更多文章請參閱博客http://www.cnblogs.com/WestGarden/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM