博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
轻轻的我走了,正如我轻轻的来…——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(下)...
阅读量:6405 次
发布时间:2019-06-23

本文共 8915 字,大约阅读时间需要 29 分钟。

源代码: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
catogories = new List
(); 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{    ///     /// SQLHelper 的摘要说明    ///     //这个类是静态的,应用程序启动时,自动驻留在内存中,所建连接,在使用过程中,    //也只是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{    ///     /// SQLHelper 的摘要说明    ///     //这个类是静态的,应用程序启动时,自动驻留在内存中,所建连接,在使用过程中,    //也只是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
catogories = new List
(); 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.欢迎转载,转载请注明出处.更多文章请参阅博客

 

转载于:https://www.cnblogs.com/WestGarden/archive/2012/06/05/2535523.html

你可能感兴趣的文章
Oracle10g RAC 修改IP [转载]
查看>>
关于char p[] = "hello world"; char *p = "hello world";
查看>>
FIREDAC的心得
查看>>
NPOI批量导入大量数据
查看>>
了解 Windows Azure 存储计费 – 带宽、事务和容量
查看>>
设计模式学习3 观察者模式
查看>>
SSH框架之Hibernate
查看>>
LightOJ 1074 spfa判断负环
查看>>
AngularJS 中{{}}与ng-bind指令
查看>>
discuz 自带的地区四级联动调用方法
查看>>
Android 音视频深入 九 FFmpeg解码视频生成yuv文件(附源码下载)
查看>>
filter与map函数
查看>>
Vue 知识整理—03-指令2
查看>>
取出根路径
查看>>
python学习之老男孩python全栈第九期_第一次周末考试题(over)第三次添加完毕...
查看>>
这些天写的技术微博
查看>>
如何解决KEIL中文乱码问题
查看>>
hash codes in java I : gneral usage and how to produce hash codes
查看>>
C#中的Params、ref、out的区别
查看>>
前后端交互
查看>>