首页 > 代码库 > D层瘦身之SqlHelper

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 UserName=@UserName And Password=@Password"      '数据库连接字符串
        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 UserName=@UserID And Password=@Password"  '创建连接字符串
        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的程序逻辑清晰易懂,最最重要的一点是不用再敲那么多代码了……现在你看出来点什么猫腻么?还是我来说吧,它主要把重复的去写那些数据库连接SqlConnectionSqlCommandSqlDataReader等等给简化了,也就是通过封装的机制把这些重复的代码给抽取出来,那些需要连接数据库的,只要告诉它连接哪个数据库表、参数是什么就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层最合适不过了。