zoukankan      html  css  js  c++  java
  • 轻轻的我走了,正如我轻轻的来…——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/

     

  • 相关阅读:
    LeetCode 252. Meeting Rooms
    LeetCode 161. One Edit Distance
    LeetCode 156. Binary Tree Upside Down
    LeetCode 173. Binary Search Tree Iterator
    LeetCode 285. Inorder Successor in BST
    LeetCode 305. Number of Islands II
    LeetCode 272. Closest Binary Search Tree Value II
    LeetCode 270. Closest Binary Search Tree Value
    LeetCode 329. Longest Increasing Path in a Matrix
    LintCode Subtree
  • 原文地址:https://www.cnblogs.com/WestGarden/p/2535523.html
Copyright © 2011-2022 走看看