前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ado.net的简单数据库操作(二)之封装SqlHelperl类

ado.net的简单数据库操作(二)之封装SqlHelperl类

作者头像
CherishTheYouth
发布2019-09-11 14:35:37
7430
发布2019-09-11 14:35:37
举报
文章被收录于专栏:Vue技术实践Vue技术实践

  今天我书接上回,接着昨天的ado.net的数据库操作的相关知识来讲哈!

  从上篇文章给出的实例来看,你一定会发现,操作数据库其实还挺麻烦的,就连一个最简单的数据库操作语句都要包括 定义数据库连接字符串、创建数据库连接对象、打开数据库连接、定义sql语句、实例化操作数据库操作对象、操作数据库、关闭数据库等等步骤。但是,我们接触项目的时候会发现,数据库操作是项目中使用最频繁的功能了,那么有没有跟简单的方法去使用数据库的操作呢?有的,答案当然是,有的!怎么做?把数据库的操作封装成一个类呀,这就是我今天要记录的 封装SqlHelper类啦,哈哈!

  下面,我一步步来讲,如何封装吧,哈哈!

第一步:添加SqlHelper类

  首先,在项目里右击 ==》 添加 ==》新建项 ==》类 ==》 命名为 SqlHelper.cs ==》点击添加,如下图所示:

打开后我们就可以开始编写SqlHeiperl类了。

第二步:确定类中方法的参数

我们在编写SqlHelper类时,肯定是希望把固定不变的东西写在类中,然后把那些变化的,需要我们手动输入的东西变成参数传递进来,那么哪些内容是需要我们通过参数传进来的呢?根据上一篇对数据库操作的基本讲解,我们知道,应该会有这样一些参数:

Sql语句:根据要操作的类型不同,sql语句肯定也会不同,insert\delete\update\select,这几个都不一样,所以这个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文件,然后在下图所示位置加入如下代码:

代码:

代码语言:javascript
复制
 <connectionStrings>
    <add name="mssqlserver" connectionString="Data Source = acer-pc; Initial Catalog = FirstDB ; Integrated Security = true"/>
  </connectionStrings>
代码语言:javascript
复制
connectionString = 后面写你自己的数据库连接信息

(2)右击引用 ==》添加引用 ==》程序集 ==》勾选System.Configuration ==》确定:如下图所示

(3)在SqlHelper中定义连接字符串,代码如下:

代码语言:javascript
复制
 private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;

接下来可以开始编写数据库操作方法了,上一篇中讲了操作数据库的三种方法,分别是:ExcuteNonQuery\ExcuteScalar\ExcuteReader,那么我们在写SqlHelper的时候同样对应要有这三个方法,下面分别介绍三个方法的编写:

2.ExecuteNonQuery()方法

先给代码,再逐步解释哈:

代码语言:javascript
复制
 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()方法:

同样还是先上代码,再逐步解释啊:

代码语言:javascript
复制
 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():

第三个略有不同,先看代码

代码语言:javascript
复制
 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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档