ado.net的简单数据库操作(二)之封装SqlHelperl类
今天我书接上回,接着昨天的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类的更多相关文章
- ado.net的简单数据库操作(一)
摘要:接下来的几篇博客将要讲到如何使用ado.net实现简单的数据库操作,包括增删改等内容.首先会介绍基础的数据库操作,然后以一个实例来进行讲解,这个实例会把一个数据表读取到winform上,然后在w ...
- ado.net的简单数据库操作(三)——简单增删改查的实际应用
果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...
- DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集
复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...
- 二次封装Response类 | 视图类传递参数给序列化类context
二次封装Response类 源码: class Response(SimpleTemplateResponse): """ An HttpResponse that al ...
- Java Web----Java Web的数据库操作(二)
Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. http://blog.csdn.net/zhai ...
- FMDB 二次封装工具类,让你快速学会封装,集成数据库
来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...
- Android中SQLite数据库操作(2)——SQLiteOpenHelper类
如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...
- 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制
五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...
- ADO.NET 使用通用数据库操作类Database (SQL Server)
一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...
随机推荐
- AngularJs parent index
AngualrJs ng-repeat使用 $parent.$index 当时用ng-repeat的时候在其子原属中可以使用$parent.$index获取父级下标,当没有没有多一级的ng-if,一般 ...
- sublime text3简体中文版汉化教程
今天突然想到好像还有一个强大的编译器sublime text 3可是这个是外国的编译器,不过各位不用担心 这个编译器,已经支持中文编译了: 下面就是我关于汉化为中文方面的一些了解以及汉化方式(由于我的 ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- 前端教程(1)http协议的深刻理解
一 HTTP协议简介 作为学习前端开发的开始,我们必须搞明白以下几件事 1.什么是互联网 互联网=物理连接介质+互联网协议 2.互联网建立的目的? 数据传输打破地域限制,否则的话,我 ...
- 循环神经(LSTM)网络学习总结
摘要: 1.算法概述 2.算法要点与推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 长短期记忆网络(Long Short Term Memory ne ...
- 『这是一篇干货blog』
更新记录一些很好的干货博客以及工具网站. 各文章,工具网站版权归原作者所有,侵删. Articles 浅谈C++ IO优化--读优输优方法集锦 浅谈斜率优化 思维导图好助手--开心食用Xmind Ty ...
- Netty源码—五、内存分配概述
Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想--jemalloc.Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果 ...
- 入门系列之Scikit-learn在Python中构建机器学习分类器
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...
- C语言超级搞笑的代码,冷笑话我们程序员也会讲的啊!
百年修得足下点击本文 欢迎来到"C语言基础"专题,今天我们放松一天,不学习知识,来看下大千世界的千奇百怪的C语言代码,你见过那些? 1.关于随机数这回事 这个随机数有点意思哦. 2 ...