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层来说,当判断一个用户是否存在时,输入用户名之后,这个用户名就成为了参数,调用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 [email protected]"   '声明并实例化需要执行的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——只因为在人群中多看了你一眼

时间: 2024-08-22 12:45:44

SqlHelper——只因为在人群中多看了你一眼的相关文章

SqlHelper——仅仅由于在人群中多看了你一眼

一.SqlHelper 出场 不是由于大家都在用SqlHelper所以才用,是由于连接数据库关闭数据库查询数据库的多了也就加上了SqlHelper.当你的非常多需求都有一个同样的方法的时候我们没有必要完毕一个须要就要写一遍代码,完毕一个需求写一遍代码.这样不仅会把人累死(当然除了复制粘贴),这种话会造成代码的反复添加了耦合,产生了冗余. 为什么不把同样的代码单独拉出来封装成一个类,这样每一个需求使用时仅仅需调用这个被封装的类的对应的方法就好了. 当有多个关于数据库增删改成操作的时候就用到了Sql

如何从人群中看出真正优秀的人

不合群者,独来独往的人,必有过人之处.整天混在朋友之间的人绝对不可能有多大的能力.受周围人嫉妒,非议的人大多具有能力.人们从来不会去嫉妒弱者.人们也不会去踹一只死狗.找女朋友,找男朋友时,眼光很高的人也是有过人之处的,他们追求卓越完美.敢在人群中发出与众不同的声音的人,敢得罪人群的人,必是有大本领.固执的人多数时候要比随顺的人要强,狂妄的人也多数时候有过人之处.当然鸡毛蒜皮的小事上也固执狂妄的人,是没出息的人.走路比常人快,腰杆比常人直的人,多有过人之处.喜欢静静沉思的人,走在路上神情镇静稳定,

如何在人群中识别优秀的人才

1.不合群者,独来独往的人,通常必有其过人之处.整天混在朋友之间,随波逐流的人绝对不可能有多大的能力. 2.受周围人嫉妒.非议的人大多具有能力.人们或许会去踹一只死狗,但一般绝不会去嫉妒弱者. 3.找男女朋友时,眼光很高的人也是有过人之处的,他们追求卓越完美. 4.敢在人群中发出与众不同的声音的人,敢得罪人群的人,必是有大本领. 5.固执的人多数时候要比随顺的人要强,狂妄的人也多数时候有过人之处. 6.走路比常人快,腰杆比常人直的人,多有过人之处. 7.喜欢静静沉思的人,走在路上神情镇静稳定,不

掌握这几种OPPO手机拍照方式,让你在人群中脱颖而出

我们现在拿到新手机的第一时间不是去看看这款手机的系统有多好,也不是去看看这款手机的运行内存有多大,而是打开手机上的相机软件,看看自己手机上的相机像素有多高.现在我们出去旅游不用再打上一部相机到处拍照,手机就可以实现自己的拍照需求.但是我们会发现同样的手机有些人拍摄出来的相片就像是一部电影大片,但是自己却拍不出相同的效果.小编就用OPPO手机来介绍几种手机的拍照方式,让你在人群中脱颖而出.1.美颜打开OPPO手机中相机上自带的美颜功能,把相机中的美颜功能使用上.调整手机相机上的美颜程度,把白皙度用

只存在于理想中的客户端JavaScript时间线

1.Web浏览器根据URL地址下载文档内容,并创建Document对象,解析WEB页面,HTML元素,包含的文本内容,将这些节点添加到DOM树中.在这个阶段,document.readystate属性的值是 loading. 2.当解析器遇到没有async和defer属性的<script>元素时,它把这个元素添加到DOM树中,并且开始执行其中的JavaScript脚本,这些脚本会被同步执行,并且在下载(通过src属性引用的外部js)和执行的过程中,解析器会暂停.所以在这些脚本中可以使用docu

comm命令——对已经有序的文件进行比较——第一列只在文件1中出现的文件,第二列只在文件2中出现的文件,第三列在文件1和文件2中同事出现的文件

请注意前提条件:             comm对文件进行处理时,要求文件已经有序,如果没有顺序,请使用sort进行排序后进行处理. 语 法: comm [-123][--help][--version][第1个文件][第2个文件]补充说明: 这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3行显示: 第1行仅是在第1个 文件中出现过的列: 第2行是仅在第2个文件中出现过的列: 第3行则是在第1与第2个文件里都出现过的列. 若给予的文件名称为

人群中看到你的第一眼 -- 启动屏幕设计

背景 用户打开应用后看到的第一个画面就是启动屏幕,虽然说启动屏幕做的好坏对应用的最终功能影响不大,但是对用户来说,第一印象非常重要:另外,用户每次运行应用也都会看到启动屏幕,因此,启动屏幕的地位也还是挺重要的. 应用在显示主界面前,需要初始化一些数据,复杂一些的应用,其初始化用时也会长一些,可能需要初始化一些基础组件.登录到远程服务器.从远程同步数据等等,这些都会导致启动屏幕存在较长的时间,同时,默认的启动屏幕是一个静态的画面,用户会感觉体验不好.如果我们可以将启动屏幕做的生动一些,就可以使得用

【Java】【50】BeanUtils.copyProperties();只从源对象中拷贝自己为null的值

前言: 关联博客: [Java][3]BeanUtils.copyProperties():将一个实体类的值复制到另外一个实体类 - 花生喂龙 - 博客园https://www.cnblogs.com/huashengweilong/p/10690509.html 关联博客里的是最简单的两个实体类赋值的情况,将oldEntity的值,赋给newEntity.而项目中有时的要求是,newEntity里的对应字段有值,就用newEntity里的:没有值,才将oldEntity的值赋给newEntit

查询Elasticsearch嵌套类型数据,且只返回嵌套数据中命中的元素

测试环境 Elasticsearch 6.3 Kibana 6.3 造点测试数据 新建一个index作为测试 以下是一个存储博客文章及其评论的数据结构,评论(comments)是nested类型: PUT /es_blog { "mappings": { "blogpost": { "properties": { "title": { "type": "text" }, "su