• 轻轻的我走了,正如我轻轻的来…——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(下)


    源代码:13033480群共享

    ADO.NET的SqlServer.NET数据提供程序,核心的类有4个,而在这个订餐系统中,我们只使用了3个,SqlConnection、SqlCommand、SqlDataReader,就是这3个核心类,我们也将要把它们封装到SQLHelper.cs类中。

    前面,我们在使用这几个类访问数据库的时候,有人,觉得很简单;有人,甚至觉得很烦了。

    我们再送它们几程吧,不由得想起了那句诗:

    版权所有©2012,西园电脑工作室.欢迎转载,转载请注明出处.更多文章请参阅博客http://blog.csdn.com/yousuosi

    轻轻的我走了,

    正如我轻轻的来;

    我轻轻的招手,

    作别西天的云彩……

    四相送,送到代码页里的类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,西园电脑工作室.欢迎转载,转载请注明出处.更多文章请参阅博客http://blog.csdn.com/yousuosi

  • 相关阅读:
    数据库为什么要分区分表
    搜索时 搜索条件在被搜索范围内
    Spring RestTemplet https请求
    微信三方平台接入
    在安装RedisDesktopManager的时候遇到 .dll文件缺失解决办法
    Spring中常见的设计模式——装饰者模式
    Spring中常见的设计模式——适配器模式
    Spring中常见的设计模式——模板模式
    Spring中常见的设计模式——策略模式
    Spring中常见的设计模式——代理模式
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211618.html
Copyright © 2020-2023  润新知