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


      今天我书接上回,接着昨天的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

    声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。对于本博客如有任何问题,可发邮件与我沟通,我的QQ邮箱是:3074596466@qq.com
  • 相关阅读:
    NOIP2018游记-DAY1
    NOIP2018游记-DAY0
    18.11.7绍一模拟赛
    [SPOJ]SELTEAM
    18.11.5绍一模拟赛
    18.11.2绍一模拟赛
    [模拟赛]世界杯
    [模拟赛]路途
    乘法逆元的研究
    子查询,TOP_N,分页,行转列
  • 原文地址:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_802.html
Copyright © 2020-2023  润新知