今天我书接上回,接着昨天的ado.net的数据库操作的相关知识来讲哈!
从上篇文章给出的实例来看,你一定会发现,操作数据库其实还挺麻烦的,就连一个最简单的数据库操作语句都要包括 定义数据库连接字符串、创建数据库连接对象、打开数据库连接、定义sql语句、实例化操作数据库操作对象、操作数据库、关闭数据库等等步骤。但是,我们接触项目的时候会发现,数据库操作是项目中使用最频繁的功能了,那么有没有跟简单的方法去使用数据库的操作呢?有的,答案当然是,有的!怎么做?把数据库的操作封装成一个类呀,这就是我今天要记录的 封装SqlHelper类啦,哈哈!
下面,我一步步来讲,如何封装吧,哈哈!
第一步:添加SqlHelper类
首先,在项目里右击 ==》 添加 ==》新建项 ==》类 ==》 命名为 SqlHelper.cs ==》点击添加,如下图所示:
打开后我们就可以开始编写SqlHeiperl类了。
第二步:确定类中方法的参数
我们在编写SqlHelper类时,肯定是希望把固定不变的东西写在类中,然后把那些变化的,需要我们手动输入的东西变成参数传递进来,那么哪些内容是需要我们通过参数传进来的呢?根据上一篇对数据库操作的基本讲解,我们知道,应该会有这样一些参数:
Sql语句:根据要操作的类型不同,sql语句肯定也会不同,insertdeleteupdateselect,这几个都不一样,所以这个sql语句肯定是作为一个参数传进来的;
Sql语句中的限定条件:执行sql语句时,我们大部分情况下会有某些限定条件吧,比如"删除id = xxx的那个行"、"查询某个名字是否存在" 之类的,那么这些限定条件肯定也是要传进来的。
上面两个参数是肯定得有的,另外还有一个东西,它不是需要我们传进去的参数,而是一个需要我们进行配置的值,那就是数据库连接字符串conStr,在我的第一篇博客里也提到了这个东西的配置,这是方便我们更改连接的数据库而设定的一个参数。通常情况下,我们把" Data Source = .;Initial Catalog = 数据库名;Integrated Security = true" 这串配置信息放到一个叫 App.config的配置文件中,然后在SqlHelper中获取配置文件里的这个信息 ,然后执行连接数据库的操作就好了。这样做的好处是,我们不用在每个SqlHelper方法中定义conStr字符串,那么我们就可以把封装好的SqlHelper用在任意一个项目和连接任意数据库了。
以上是确定的几个参数。下面来具体封装一下SqlHelper:
第三步:封装SqlHelper
1.conStr配置
(1)首先,打开App.config文件,然后在下图所示位置加入如下代码:
代码:
<connectionStrings> <add name="mssqlserver" connectionString="Data Source = acer-pc; Initial Catalog = FirstDB ; Integrated Security = true"/> </connectionStrings>
connectionString = 后面写你自己的数据库连接信息
(2)右击引用 ==》添加引用 ==》程序集 ==》勾选System.Configuration ==》确定:如下图所示
(3)在SqlHelper中定义连接字符串,代码如下:
private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;
接下来可以开始编写数据库操作方法了,上一篇中讲了操作数据库的三种方法,分别是:ExcuteNonQueryExcuteScalarExcuteReader,那么我们在写SqlHelper的时候同样对应要有这三个方法,下面分别介绍三个方法的编写:
2.ExecuteNonQuery()方法
先给代码,再逐步解释哈:
1 public static int ExecuteNonQurey(string sql,params SqlParameter[] pms) 2 { 3 using (SqlConnection con = new SqlConnection(conStr)) 4 { 5 using (SqlCommand cmd = new SqlCommand(sql,con)) 6 { 7 if (pms != null) 8 { 9 cmd.Parameters.AddRange(pms); //这个函数是用来添加参数值的,然后传递给存储过程,意思就是把需要的参数放到sql语句的指定位置 10 } 11 con.Open(); 12 return cmd.ExecuteNonQuery(); 13 } 14 } 15 }
首先说返回值,因为ExcuteNonQuery返回的是整形数据,所以返回值肯定是int类型的,然后说下参数呀,第一个是字符串类型(string)的sql语句,而第二个是参数类型(params)的数组,这个我来说一下,因为我学c语言的时候没见过这个类型,学php的时候也没见过这个类型,所以有点懵:
params是一个参数数组类型,什么意思呢,就是你可以把各种不同类型,不同数量的参数放到这个数组中进行传参,这个参数必须是一维数组,就这意思,想要了解更多关于params的同学可以戳这个链接:https://www.cnblogs.com/wangliu/p/3876672.html。
这就是两个参数了。
然后接着下面就是按部就班的写代码往下走了,到第7行,我们要对参数数组进行校验,看其是否为空,如果为空,那就啥也不说直接执行就行了,如果不为空,那就得先做一件事,就是把需要的参数放到sql语句的指定位置,让它去执行就完了。关于Parameters.AddRange()方法的讲解可以看这篇博客:https://blog.csdn.net/wang13667539325/article/details/9672829.
3.ExcuteScalar()方法:
同样还是先上代码,再逐步解释啊:
1 public static object ExecuteScalar(string sql,params SqlParameter[] pms) 2 { 3 using (SqlConnection con = new SqlConnection(conStr)) 4 { 5 using (SqlCommand cmd = new SqlCommand(sql,con)) 6 { 7 if (pms != null) 8 { 9 cmd.Parameters.AddRange(pms); 10 } 11 con.Open(); 12 return cmd.ExecuteScalar(); 13 } 14 15 } 16 17 }
说是逐步解释,其实也没啥好解释的吧,这个跟上面那个几乎一样,哈哈!
4.Execute.Reader():
第三个略有不同,先看代码:
1 public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] pms) 2 { 3 SqlConnection con = new SqlConnection(conStr); 4 using (SqlCommand cmd = new SqlCommand(sql,con)) 5 { 6 if ( pms != null) 7 { 8 cmd.Parameters.AddRange(pms); 9 } 10 try 11 { 12 con.Open(); 13 return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//System.Data.CommandBehavior.CloseConnection这个枚举参数,表示将来使用完毕SqlDataReader后,在关闭reader的同时,在SqlDataReader内部会将关联的Connection对象也关闭掉 14 15 } 16 catch { 17 con.Close(); 18 con.Dispose(); 19 throw; 20 } 21 } 22 }
这个里面的写法不太一样,这里的创建连接数据库对象时没有用using,这是为啥呢?
记得我们前面说过,这个方法返回的对象 reader它不是一个装东西的仓库,它只是一个纽带,那么我们返回这个东西后,我们还要用这个东西来从数据库取值,但是如果用using的话,那默认就是using结束后就把数据库关掉了,这个时候,数据库已经关掉了,我们即使得到了返回的这个reader,也没法用它来取值了,就相当于返回的reader对我们并无卵用了。所以啊,这里连接数据库的时候,我们就不用using啦。
那你又要问了,那数据库用完了难道就不管吗?当然不是,继续看后面的代码,后面有个 try....catch...,try里面有段注释说明,看到了吧!什么?太小了,看不到,我气得喷了一口老血,好吧,那我把这句话copy到下面:
System.Data.CommandBehavior.CloseConnection这个枚举参数,表示将来使用完毕SqlDataReader后,在关闭reader的同时,在SqlDataReader内部会将关联的Connection对象也关闭掉,也关闭掉,也关闭掉!
关于SqlHelper的封装,我就说到这里啦,文中有些地方我写的时候也不是很懂,但是写完了就懂了。这里参考了一篇csdn的博客,也是写封装SqlHelper,没我啰嗦,但写的更全面,附上链接:https://blog.csdn.net/langji1234/article/details/44724779 ,有需要的可以戳进去看看哦。
今天就写到这里啦,哈哈,菜鸡下午要去学点新东西哈哈!
我的QQ:3074596466