今天我书接上回,接着昨天的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文件,然后在下图所示位置加入如下代码:

代码:

 <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;

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

2.ExecuteNonQuery()方法

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

   public static int ExecuteNonQurey(string sql,params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql,con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms); //这个函数是用来添加参数值的,然后传递给存储过程,意思就是把需要的参数放到sql语句的指定位置
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}

首先说返回值,因为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()方法:

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

  public static object ExecuteScalar(string sql,params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql,con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteScalar();
} } }

说是逐步解释,其实也没啥好解释的吧,这个跟上面那个几乎一样,哈哈!

4.Execute.Reader():

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

  public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] pms)
{
SqlConnection con = new SqlConnection(conStr);
using (SqlCommand cmd = new SqlCommand(sql,con))
{
if ( pms != null)
{
cmd.Parameters.AddRange(pms);
}
try
{
con.Open();
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            //System.Data.CommandBehavior.CloseConnection这个枚举参数,表示将来使用完毕SqlDataReader后,在关闭reader的同时,在SqlDataReader内部会将关联的Connection对象也关闭掉 }
catch {
con.Close();
con.Dispose();
throw;
}
}
}

这个里面的写法不太一样,这里的创建连接数据库对象时没有用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

ado.net的简单数据库操作(二)之封装SqlHelperl类的更多相关文章

  1. ado.net的简单数据库操作(一)

    摘要:接下来的几篇博客将要讲到如何使用ado.net实现简单的数据库操作,包括增删改等内容.首先会介绍基础的数据库操作,然后以一个实例来进行讲解,这个实例会把一个数据表读取到winform上,然后在w ...

  2. ado.net的简单数据库操作(三)——简单增删改查的实际应用

    果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...

  3. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  4. 二次封装Response类 | 视图类传递参数给序列化类context

    二次封装Response类 源码: class Response(SimpleTemplateResponse): """ An HttpResponse that al ...

  5. Java Web----Java Web的数据库操作(二)

    Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. http://blog.csdn.net/zhai ...

  6. FMDB 二次封装工具类,让你快速学会封装,集成数据库

    来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...

  7. Android中SQLite数据库操作(2)——SQLiteOpenHelper类

    如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...

  8. 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制

    五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...

  9. ADO.NET 使用通用数据库操作类Database (SQL Server)

    一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...

随机推荐

  1. numpy C语言源代码调试(三)

    鉴于ddd过于简陋,希望找一个新一些的调试工具,看到有很多人推荐gdbgui,这是一个非常新的调试工具,前端使用浏览器,现在采用这一架构的软件越来越多,可以完全不必依赖庞大的gui类库,安装使用比较方 ...

  2. SpringCloud分布式微服务搭建(三)

    本例子是一个springcloud的configserver,client例子 利用git存储各个服务的配置文件 server获取配置文件的仓库位置,并把server注册到eureka中,同时为了实现 ...

  3. Polaristech 刘洋:基于 OpenResty/Kong 构建边缘计算平台

    2019 年 3 月 23 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·北京站,Polaristech 技术专家刘洋在活动上做了<基于 ...

  4. 版本号对比 -- Python实现

    相同位数版本号大小比较: def abc(str1, str2): if str1 == "" or str2 == "": print("输入包含空 ...

  5. 请给你的短信验证码接口加上SSL双向验证

    序言 去年年底闲来几天,有位同事专门在网上找一些注册型的app和网站,研究其短信接口是否安全,半天下来找到30来家,一些短信接口由于分析难度原因,没有继续深入,但差不多挖掘到20来个,可以肆意被调用, ...

  6. windows下,读取快捷方式lnk所指向的路径

    BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...

  7. mybatis入门系列一之创建mybatis程序

    Mybatis基础系列一 创建第一个mybatis程序 需要配置项 1. 在conf.xml的需要配置配置两个标签数据库连接和mapper,xml文件加载信息 <-- 进行数据库环境参数的配置 ...

  8. ["1", "2", "3"].map(parseInt)`返回的结果是[1,2,3]?

    今天刷到一道面试题,["1", "2", "3"].map(parseInt)返回的结果是什么呢?可能大家第一个想到的是 [1,2,3],但 ...

  9. Vue.js 学习笔记 第1章 初识Vue.js

    本篇目录: 1.1 Vue.js 是什么 1.2 如何使用Vue.js 本章主要介绍与Vue.js有关的一些概念与技术,并帮助你了解它们背后相关的工作原理. 通过对本章的学习,即使从未接触过Vue.j ...

  10. HTML 练习实现遮罩层

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...