SqlHelper——仅仅由于在人群中多看了你一眼
一、SqlHelper 出场
不是由于大家都在用SqlHelper所以才用,是由于连接数据库关闭数据库查询数据库的多了也就加上了SqlHelper。当你的非常多需求都有一个同样的方法的时候我们没有必要完毕一个须要就要写一遍代码,完毕一个需求写一遍代码。这样不仅会把人累死(当然除了复制粘贴),这种话会造成代码的反复添加了耦合,产生了冗余。
为什么不把同样的代码单独拉出来封装成一个类,这样每一个需求使用时仅仅需调用这个被封装的类的对应的方法就好了。
当有多个关于数据库增删改成操作的时候就用到了SqlHelper,由于D层是直接操作数据库,完毕数据库的增删改查的,所以SqlHelper是属于D层的。可是我是单独拿出来成为一层的。把D层的全部对数据库的操作方法都封装起来。
分为两种操作,一种是增删改,一种是查询操作,而每种又分为有參数的和无參数的。这样减轻了D的负担,使D层不会显得太臃肿。
在做机房之前一直在看别人的博客,总是有提到SqlHelper。所以就在众博客中多看了它一眼。
仅仅由于在人群中多看了你一眼,再也不能忘掉你的容颜,在这里写下我一个人对你的情有独钟……
二、SqlHelper 使用方法
1、首先,它的方法
(1)为什么要分成有參数和没有參数的呢?
这就是一种思想了,当想要获取数据库的所有信息和部分信息时,须要所有信息直接给它指定查找哪个表即可,可是当要在一个表中获取一部分信息就要有查询条件。就要有參数。
(2)为什么要分为查询和增删改两种呢?
查询是要返回给用户想要查询到的信息,增删改都能够归纳为改或者更新,更新要返回给用户更新的是否成功或失败,不须要返回详细信息。所以查询返回的是DataTable类型,而更新返回受影响的行即可,当更新好一行数据就返回整数1。这就和它的返回值产生了关系,既然有同样的就要合并起来成为一个方法。这样降低冗余,使代码简单化。学了面向对象,事实上就是怎么简单怎么来。
2、然后,SqlHelper的每个方法都要有一个返回值,由于返回值的不同会造成对应调用此方法的方法也要有一样的返回值。
(1)返回DataTable
DataTable又是什么呢?
DataTable是一个暂时保存数据的网络虚拟表,能够被创建和訪问,当SqlHelper查询后就要返回到DataTable虚拟表中,推断它的第一行是否有数据来推断是否查到记录。
(2)返回Integer
返回受影响的行数,假设受影响的行数大于0说明查到的记录,假设为0说明没有查询到数据。假设受影响的行数大于0说明增删改操作成功。假设为0,说明操作没有成功。我们通过返回受影响的行数到B层进行逻辑推断。然后返回对应的提示给U层。这样就非常好的再一条线中实现。思路清晰。
三、SqlHelper举例应用
以下就举一个返回值是DataTable型的有參数的方法。
'方法(2)有參数的查询
'return DataTable 查询出的表格
Public Function ExecuteNonQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable
Using conn As New SqlConnection(strConnection) '使用连接池,能够在使用完毕后自己主动关闭连接
Dim cmd As SqlCommand = conn.CreateCommand() '
cmd.CommandText = cmdText '须要运行的SQL语句
cmd.CommandType = cmdType '给出Sql语句的类型
cmd.Parameters.AddRange(sqlParams) '參数数组,參数个数依据实际情况而定
adp = New SqlDataAdapter(cmd)
Try
conn.Open()
adp.Fill(ds)
Return ds.Tables(0)
Catch ex As Exception
Return Nothing
Throw ex
End Try
End Using
End Function
它的使用,就拿D层来说,当推断一个用户是否存在时,输入username之后,这个username就成为了參数,调用SqlHelper的ExecuteNonQuery()方法。通过返回的DataTable的行数是否大于0来推断此用户是否存在。
Public Function SelectUser(ByVal user As Entity.UserInfo) As DataTable Implements IDAL.IUser.SelectUser
Dim strUserName As String = user.UserName
Dim helper As New Helper.SqlHelper
Dim dt As New DataTable '声明一个DataTable类型变量
Dim cmdText As String = "select * from User_Info where UserName=@UserName" '声明并实例化须要运行的SQL语句
Dim sqlParams As SqlParameter() = {New SqlParameter("@UserName", strUserName)} '声明并实例化參数
dt = helper.ExecuteNonQuery(cmdText, CommandType.Text, sqlParams) '调用SqlHelper类中的ExecSelect()方法来运行查询,并获取返回值
Return dt '返回查询结果
End Function
四、我的SqlHelper的问题
这样就又出现了一个问题,当我们删除用户的时候。或者须要查询到多条记录显示出来的时候,尽管返回的是DataTable类型,可是它默认了返回DataTable的第一行数据。出现这样情况解决方法有两种:
(1)通过遍历思想循环查数据库中的记录。返回一条和上一次不同的记录的第一行。
比如返回某一级别的用户
If dt.Rows.Count > 0 Then For i = 0 To dt.Rows.Count - 1 '查到内容显示
DataGridView.Rows.Add() '一開始没有行和列。所以要加入一行和一列,避免错误发生
For j = 0 To dt.Columns.Count - 1
DataGridView(j, i).Value = dt.Rows(i).Item(j)
Next j
'DataGridView.AllowUserToAddRows = False '假设放在这里。还是会有最后一行
Next i
(2)利用绑定数据集
直接dataGridView=table
http://blog.csdn.net/liutengteng130/article/details/8643863
另外一种方法显然是比第一种好非常多,但为什么非常多人还是要仅仅返回DataTable的第一行数据呢?
这是由于:……^^……… 我就是不把它循环遍历出来不罢休的人。然后再去尝试另外一种方法,
五、我的感悟——SqlHelper
就像设计模式一样,事实上一開始并不存在什么设计模式。大加就仅仅是在写代码啊写代码。可是须要写的代码也多了,当时会编程的人又少,就要提高写代码的效率。所以一些设计模式就出现了,面向对象的出现也是有一定的时间积累的,人们须要复用代码。又先要少写代码就行实现要求,并且是系统软件看起来更简洁,达到高内聚低耦合的效果。
假设说设计模式的出现是认识思想的升华,那SqlHelper就是人们思想的结晶。
当我用了SqlHelper的时候一開始会认为非常难,可是会慢慢的发现它的思想它的优点。人们最大的进步就是会使用工具。当有人给我们创造出了工具后我们要做的就是好好的使用工具,然后创造更好的工具给别人使用。
SqlHelper——仅仅由于在人群中多看了你一眼的更多相关文章
- SqlHelper——只因为在人群中多看了你一眼
对SQLHelper,还是有一点陌生的,但是大多数人都在使用,我就有一种想了解并使用的意愿,于是查了很多资料,发现一片不错的博客,放在下面,作为自己或读者使用的材料. 一.SqlHelper 出场 不 ...
- ICCV2021 |重新思考人群中的计数和定位:一个纯粹基于点的框架
论文:Rethinking Counting and Localization in Crowds:A Purely Point-Based Framework 代码:https://github ...
- QT_仅仅直接在构造函数中创建对象的不可行的原因
#include "mainwidget.h" #include <QApplication> int main(int argc, char *argv[]) { Q ...
- 以SqlHelper为例论面向对象中封装的使用(续)
上文以SqlHelper为例说明了面向对象中封装的好处,但是上文只是简单封装,考虑下面代码的情况: public static Activate GetByCode(string code) { Li ...
- 以SqlHelper为例论面向对象中封装的使用
引言: 在使用面向对象方法编写的程序中,会有一些工具类,如Utility,xxHelper等. 比如1)操作数据库的过程,一般步骤都是:1.准备数据库地址.表名等信息:2.建立连接:3.准备要执行sq ...
- IDEA高颜值之最吸引小姐姐插件集合!让你成为人群中最靓的那个崽!
经常有小伙伴会来找TJ君,可能觉得TJ君比较靠谱,要TJ君帮忙介绍女朋友.TJ君一直觉得程序猿是天底下最可爱的一个群体,只不过有时候不善于表达自己的优秀,所以TJ君今天准备介绍几款酷炫实用的IDEA插 ...
- 【春华秋实】.NET Core之只是多看了你一眼
感官初体验 技术学习是一件系统性的事情,如果拒绝学习,那么自己就会落后以至于被替代..NET也是一样,当开源.跨平台成为主流的时候,如果再故步自封,等待.NET的就是死路一条,幸好.NET Core问 ...
- Ant在Java项目中的使用(一眼就看会)
参考:http://www.cnblogs.com/zhengqiang/p/5557155.html Ant是跨平台的构建工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将A ...
- 【Linux探索之旅】开宗明义+第一部分第一课:什么是Linux?
内容简介 1.课程大纲 2.第一部分第一课:什么是Linux? 3.第一部分第二课预告:下载Linux,免费的噢! 开宗明义 我们总听到别人说:Linux挺复杂的,是给那些追求逼格的程序员用的.咱 ...
随机推荐
- Php learn note
Php learn note 1. Between two part of ECHO, there is , sign rather than + sign. echo 'Hello World!!' ...
- [Java] 总结1.5/1.6/1.7版本的特性
开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,以下是测试代码: JDK1.5新特性: 1.自动装箱与拆箱: I ...
- docker(部署常见应用):docker部署mysql
上节回顾:docker(部署常见应用):docker部署nginx docker部署mysql:5.7.26 # 下载镜像 docker pull mysql: # 查看镜像 docker image ...
- iterator和iterable的区别
相关博客: http://blog.csdn.net/lipengcn/article/details/51700153 Java中Iterable和Iterator的辨析 http ...
- html中<frameset>标签,框架结构各窗口的父级菜单子级菜单关系
这个问题搞得我头大,并且在查过百度后各位大佬给出的解释我都不能理解,应该是我太白的原因,希望我写的能好理解. 下面文章窗口1.2.3,在代码里分别为chuangkou.chuangkou1.chuan ...
- ComboBoxEdit 添加键值
ComboBoxEdit combo = new ComboBoxEdit(); var coll = combo.Properties.Items; coll.BeginUpdate(); try ...
- Windows 下修改 MySQL 编码为 utf8
问题 Windows 下安装 MySQL 后,默认编码不全utf8. mysql> show variables like '%char%'; +------------------------ ...
- [ Linux ] [ OS ] [ memory ] Linux 如何查看系統硬體的記憶體(RAM)資訊
cat /proc/meminfo https://blog.longwin.com.tw/2013/05/linux-ram-memory-info-2013/
- Mac使用ssh登录远程linux系统查看jetty日志及同时使用github工具
转载请注明出处:http://www.houxiurong.com/?post=27 Mac默认是安装了ssh工具软件的. 先用mac的 终端工具生成 id_rsa 和id_rsa.pub 秘钥,生成 ...
- ios 编译版本 最低版本 运行版本 动态链接库
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) 运行环境判断: #if __IPHONE_OS_VERSION_ ...