D层瘦身之SqlHelper

今天我也唠唠这三层架构中SqlHelper的事,在做机房收费的初期并没有用这个类,于是乎在n多个连接数据库的时候我的做法如下(以查询登录用户为例):

Imports System.Data
Imports System.Data.SqlClient
Imports Entity.entity
Public Class D_UserDAO
    '查询登录用户是否存在
    Public Function SelectUser(ByVal User As E_UserInfo) As E_UserInfo
        Dim conn As New SqlConnection       '创建连接对象
        Dim cmd As New SqlCommand           '创建命令对象

        conn = New SqlConnection(ConnStr.Connectstring())       '创建数据库连接
        cmd.Connection = conn

        '查询数据库
        cmd.CommandText = "Select * From UserInfo Where [email protected] And [email protected]"      '数据库连接字符串
        cmd.Parameters.Add(New SqlParameter("@UserName", User.UserName))                                '数据库连接参数
        cmd.Parameters.Add(New SqlParameter("@Password", User.Password))
        cmd.CommandType = CommandType.Text                  '获取SQL语句的具体类型,在这里为Select
        conn.Open()

        Dim reader As SqlDataReader = cmd.ExecuteReader     '执行查询语句,并生成一个DataReader
        Dim nuser As New E_UserInfo                         '实例化新的UserInfo,用于保存返回的实体

        '获取查询到的数据,并返回给相应的属性
        While reader.Read()
            '判断用户信息是否为空
            If nuser Is Nothing Then
                nuser = New E_UserInfo
            End If
            nuser.UserID = reader.GetInt32(0)
            nuser.UserName = reader.GetString(1)
            nuser.Password = reader.GetString(2)
            nuser.Level = reader.GetString(3)
        End While

        Return nuser            '返回得到的实体
        conn.Close()            '关闭数据库连接
    End Function
End Class

我相信懒惰的人中肯定存在我的身影,所以如果就四五六七八个连接的数据的过程,我会照单全收的按照上边的例子来,即省事又省脑(因为例子中那些cmd,我为了搞懂专门学了n个小时的ADO.net,所以实在是舍不得抛弃它们)。突然有一天当我敲代码敲到手抽筋,满脑子创建连接、关闭连接……的时候,实在是要抓狂了!不破不立,那好吧,微软既然那么聪明就不会耍我这样的小码虫的。结果可想而知,上网睁眼一搜,“哇喔”,我被自己耍了,微软派了helper来拯救我的sql了,一行行一条条关于减少精简数据库连接的SqlHelper看的眼花缭乱。让大家先看下上边那个例子用了SqlHelper后的结果:

Imports System.Data
Imports System.Data.SqlClient
Imports Entity.entity
Public Class D_UserDAO
    '查询登录用户是否存在
    Public Function SelectUser(ByVal User As E_UserInfo) As DataTable
        Dim mySqlHelper As New SqlHelper                '创建数据库连接对象
        Dim cmdText As String = "Select * From UserInfo Where [email protected] And [email protected]"  '创建连接字符串
        Dim paras As SqlParameter() = {New SqlParameter("@UserID", User.UserID), New SqlParameter("@Password", User.Password)}  '添加参数
        Dim dt As New DataTable                         '定义一个DataTable来接收数据库查询的结果

        dt = mySqlHelper.ExecSelect(cmdText, CommandType.Text, paras)       '执行数据库查询操作

        Return dt       '返回查询结果
    End Function
End Class

对比一下是不是用了SqlHelper的程序逻辑清晰易懂,最最重要的一点是不用再敲那么多代码了……现在你看出来点什么猫腻么?还是我来说吧,它主要把重复的去写那些数据库连接SqlConnection、SqlCommand、SqlDataReader等等给简化了,也就是通过封装的机制把这些重复的代码给抽取出来,那些需要连接数据库的,只要告诉它连接哪个数据库表、参数是什么就OK了,so恭喜你雇用了一个傻瓜机器为你服务。

接下来说重点,就是SqlHelper是什么东西,嗯,这个还是看百科吧http://baike.baidu.com/view/2765538.htm?fr=aladdin,介绍的简洁明了(看不懂的一带而过就好了,实践好盲人摸象很重要),如果再添油加点醋就太累赘了,毕竟在这篇博客中怎么用,用后的结果优点都告诉你了,一会儿再把自己写的SqlHelper呈上或者你下载个就可以用了,毕竟连我都会写会用你就更不用说了,相信你在一遍遍的使用中会深刻理解的。需要提醒一点,我写SqlHelper类不是因为想通过双手来深刻理解,而是用之前不知道微软已经写好了这么一个类,所以建议你还是锻炼下手指吧,好处多多

SqlHelper类

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration            '需要在管理器中添加相应的引用

'按照返回值的类型将对数据库的增删改查分为两类:"增删改"只需返回查询是否成功,而"查"需要返回查询到的信息。
'这两类每种还可分为有无参数的,所以在SqlHelper类中共有四个过程,分别表示对数据库的四类操作
Public Class SqlHelper
    '获得配置文件中的数据库连接字符串
    Private ReadOnly strConnection As String = ConfigurationManager.AppSettings("ConnStr")
    Dim conn As SqlConnection = New SqlConnection(strConnection)        '定义连接,并初始化SqlHelper类
    Dim cmd As New SqlCommand                                           '定义cmd命令

    Dim adp As New SqlDataAdapter                   '定义一个数据库适配器
    Dim ds As New DataSet                           '定义一个数据集
    Dim dt As New DataTable                         '定义一个数据表

    '关闭数据库连接
    Private Sub CloseConn()
        '判断数据库是否为关闭,在未关闭的情况下关闭数据库连接
        If conn.State <> ConnectionState.Closed Then
            conn.Close()
            conn = Nothing                          '不指向原来的对象
        End If
    End Sub

    '关闭数据库命令
    Private Sub CloseCmd()
        '判断cmd命令是否存在,若存在则销毁
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If
    End Sub

    '第一类,有参数的增删改操作,返回Boolean类型,True为成功,False为失败
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParas As SqlParameter()) As Boolean
        '用传入的参数填充SqlHelper类的cmd对象
        cmd.Parameters.AddRange(sqlParas)           '传入参数
        cmd.CommandText = cmdText                   '设置查询的语句
        cmd.CommandType = cmdType                   '设置一个值,解释cmdText
        cmd.Connection = conn                       '定义连接

        Try
            conn.Open()                             '打开数据库连接
            Return cmd.ExecuteNonQuery              '执行增删改操作

            cmd.Parameters.Clear()                  '清除传入的参数
        Catch ex As Exception
            Return False
        Finally
            Call CloseConn()                        '关闭连接
            Call CloseCmd()                         '关闭命令
        End Try

    End Function

    '第二种,无参数的增删改操作,返回Boolean类型,True为成功,False为失败
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType) As Boolean
        '用传入的参数填充SqlHelper类的cmd对象
        cmd.CommandText = cmdText                   '设置查询语句
        cmd.CommandType = cmdType                   '设置一个值,解释cmdText
        cmd.Connection = conn                       '定义连接

        Try
            conn.Open()                             '打开数据库连接
            Return cmd.ExecuteNonQuery              '执行增删改操作
            cmd.Parameters.Clear()                  '清除传入的参数
        Catch ex As Exception
            Return False
        Finally
            Call CloseConn()                        '关闭连接
            Call CloseCmd()                         '关闭命令
        End Try
    End Function

    '第三种,有参数的查询操作,返回DataTable
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParas As SqlParameter()) As DataTable
        '用传入的参数填充SqlHelper类的cmd对象
        cmd.Parameters.AddRange(sqlParas)           '传入参数
        cmd.CommandText = cmdText                   '设置查询的语句
        cmd.CommandType = cmdType                   '设置一个值,解释cmdText
        cmd.Connection = conn                       '定义连接
        adp = New SqlDataAdapter(cmd)               '实例化dap

        Try
            adp.Fill(ds)                            '用Adapter填充DataSet
            dt = ds.Tables(0)                       'DataTable是DataSet的第一个表
            'cmd.Parameters.Clear()                  '清除参数
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn()                        '关闭数据库连接
            Call CloseCmd()                         '关闭命令
        End Try
        Return dt                                   '返回查询到的表
    End Function

    '第四种,无参数的查询操作,返回DataTable
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        '用传入的参数填充SqlHelper类的cmd对象
        cmd.CommandText = cmdText                   '设置查询的语句
        cmd.CommandType = cmdType                   '设置一个值,解释cmdText
        cmd.Connection = conn                       '定义连接
        adp = New SqlDataAdapter(cmd)               '实例化dap

        Try
            adp.Fill(ds)                            '用Adapter填充DataSet
            dt = ds.Tables(0)                       'DataTable是DataSet的第一个表
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn()                        '关闭数据库连接
            Call CloseCmd()                         '关闭命令
        End Try
        Return dt                                   '返回查询到的表
    End Function
End Class

小结:

SqlHelper类的精华在于思想,即通过封装抽离相同的内容,再通过重载使用从而达到代码的复用,从整体的应用来看也是三层架构“高内聚、低耦合”思想的体现。所以不管学习还是生活,都不要以体力为代价来换取脑力,不然结果只能是夙兴夜寐且碌碌为无。

ps:SqlHelper类属于数据库操作类,又感觉它内容很精简个人觉得放D层最合适不过了。

D层瘦身之SqlHelper

时间: 2024-10-15 21:32:28

D层瘦身之SqlHelper的相关文章

iOS安装包瘦身的那些事儿

在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100M.对于超过100M的安装包,只能在WIFI环境下下载,不能直接通过4G网络进行下载. 在这里,我们提交App Store的安装包大小为67.6MB,在App Store上显示的下载大小和实际下载下来的大小,我们通过下表做一个对比: iPhone型号 系统 AppStore 显示大小 下载到设备大小

iOS:使用MVC模式帮ViewController瘦身

如何给UIViewController瘦身 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种设计模式就是MVC,但在实际开发过程中,我们因为这样.那样的原因让单纯

iOS开发&gt;学无止境 - 使用MVC模式帮ViewController瘦身

随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种设计模式就是MVC,但在实际开发过程中,我们因为这样.那样的原因让单纯的ViewController变成了集Mod

如何给UIViewController瘦身

本文转载至  http://www.cocoachina.com/ios/20141128/10356.html 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2.3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种

iOS架构师之路:控制器(View Controller)瘦身设计

前言 古老的MVC架构是容易被iOS开发者理解和接受的设计模式,但是由于iOS开发的项目功能越来越负责庞大,项目代码也随之不断壮大,MVC的模糊定义导致我们的业务开发工程师很容易把大量的代码写到视图控制器中,行业中对这种控制器有个专业词汇Massive ViewControler(臃肿的视图控制器).代码臃肿导致可读性可维护性差,而且这种不清晰的设计还有许多的副作用,比如代码重用性差.作为架构师需要关注项目的代码质量.指导业务开发工程师写出高质量,高健壮性,高可用的代码也是很重要的工作.因此需要

iOS控制器瘦身-面向超类编程

点击查看作者简书地址 今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tableView的代理方法cellForRow和heightForRow的代码是不是也是非常多?里面夹杂着switch和大量if esle的判断逻辑的代码.后期维护看着这些if else是不是特别烦躁?特别是自己在维护前人写的代码,并且还没有注释 一团糟,是不是有更想骂人的冲动?别怕,这里给您提供一种解决

性能优化7--App瘦身

1. 前言 如果你对App优化比较敏感,那么Apk安装包的大小就一定不会忽视.关于瘦身的原因,大概有以下几个方面: 对于用户来说,在功能差别不大的前提下,更小的Apk大小意味更少的流量消耗,也意味着更多的用户下载: 对于产品来说,大于竞品的Apk意味着较低的下载基数,不利于验证产品策略: 对于开发人员来说,App瘦身则是一次技术优化.技术提升的机会: 2. Apk的组成 2.1 Apk典型组成 一个典型的Apk组成 下表为Apk目录及文件说明: 文件/目录 说明 assets/ 存放一些静态文件

Android性能优化之APK瘦身详解(瘦身73%)

公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段.你在写上个版本的内容,好了,下个版本的更新内容已经定稿了.基于这种快速开发的现状,我们app优化前已经有87.1M了,包大了,运营说这样转化不高,只能好好搞一下咯.优化过后包大小为23.1M(优化了73%,不要说我标题党).好了好了,我要阐述我的apk超级无敌魔鬼瘦身之心得了. 文章目录: 文章主要内容从理论出

怎样给你的Android 安装文件(APK)瘦身

本文源地址:怎样给你的Android 安装文件(APK)瘦身 Android的apk文件越来越大了这已经是一个不争的事实. 在Android 还是最初版本号的时候,一个app的apk文件大小也还仅仅有2 MB左右,到了如今.一个app的apk文件大小已经升级到10MB到20MB这个范围了.apk文件大小的爆炸式增长主要是由于用户对app质量的期待越来越高以及开发人员的开发经验增长,详细体如今下面几个方面: Android设备 dpi 的多样化 ([l|m|tv|h|x|xx|xxx]dpi) A