重构个人版机房收费系统——sqlhelper

        刚开始三层的时候就已经听说sqlhelper的强大了,这次机房收费系统很迫不及待的想试一试。


        以前我们编程序,每次执行增删改查操作都要写一整套的访问数据库的相关代码,除了sql语句基本上都是一样一样的~~所以我们的行为就相当于一直在复制粘贴。以前可能不觉得有什么,学习了c#后,我们了解了一些抽象、封装和代码复用的概念,是不是就觉得有点不舒服了?而SqlHelper就刚好帮我们解决了这一问题。


       SqlHelper,从表层意义来看SQL Helper,即SQL的辅助者。它是一个基于.NET FramWork的数据库操作组件,是对D层一些重复代码的封装,主要用于简化我们重复去写的一些过程,例如数据库连接sqlconnection,sqlcommand等等,通过SqlHelper封装后每种方法的重载都支持不同的方法参数,所以只需要给方法传入不同的参数就可以访问数据库了,大大减少了代码量,实现了代码的高度复用性,很方便。


       SqlHelper包含了一些专用函数,用于管理参数和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过sqlcommand对象来执行。在sqlcommand对象能够被执行前,所有的参数都必须添加到sqlparameters集合中,并且必须正确配置connection、commandtype、commandtext等属性。


       SqlHelper封装的增删改查操作主要分为两大类:有参和无参,每一大类又分为两种方法:对数据库的查询和更新(增、删、改)。呵呵,有没有一种晕乎乎的感觉啊?下面还是通过具体的代码来看一下吧~~


<span style="font-size:18px;">Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration      '需要在管理器中相应的类库下同时添加引用

''' <summary>
''' sqlhelper类封装了广大用户用于高性能、可升级好最佳练习的sql数据操作
''' </summary>
''' <remarks></remarks>
Public Class SqlHelper
    '定义变量
    '获得数据库的连接字符串
    Private ReadOnly strConnection As String = ConfigurationManager.AppSettings("ConnStr")
    '设置连接
    Dim conn As SqlConnection = New SqlConnection(strConnection)
    '定义cmd命令
    Dim cmd As New SqlCommand

    ''' <summary>
    ''' 执行增删改三个操作(有参),返回值为Boolean类型,确认是否执行成功
    ''' </summary>
    ''' <param name=" cmdText ">需要执行语句,一般是sql语句,也有存储过程</param >
    ''' <param name=" cmdType ">判断sql语句的类型,一般都不是存储过程</param >
    ''' <param name="paras" >参数数组,无法确认有多少参数</param >
    ''' <returns></returns >
    ''' <remarks></remarks>
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Integer
        '将传入的值分别为cmd的属性赋值
        cmd.Parameters.AddRange(paras)      '传入参数
        cmd.CommandType = cmdType            '设置一个值来解释cmdText
        cmd.Connection = conn               '设置连接,全局变量
        cmd.CommandText = cmdText           '设置查询语句

        '执行操作
        Try
            conn.Open()                      '打开连接
            Return cmd.ExecuteNonQuery()     '执行增删改操作
            cmd.Parameters.Clear()           '清除参数
        Catch ex As Exception                '如有异常,返回值为0
            Return 0
        Finally
            Call CloseConn(conn)        '关闭连接        
            Call CloseCmd(cmd)          '关闭命令
        End Try

    End Function

    ''' <summary>
    ''' 执行增删改三个操作(无参)
    ''' </summary>
    ''' <param name=" cmdText ">需要执行语句,一般是sql语句,也有存储过程</param >
    ''' <param name=" cmdType ">判断sql语句的类型,一般都不是存储过程</param >
    ''' <returns>Integer,受影响的行数</returns >
    ''' <remarks></remarks>
    Public Function ExecAddDelUpdateNo(ByVal cmdText As String, ByVal cmdType As CommandType ) As Integer
        '为要执行的cmd赋值
        cmd.CommandText = cmdText              '设置sql语句
        cmd.CommandType = cmdType              '设置一个值来解释sql语句
        cmd.Connection = conn                   '设置连接

        '执行操作
        Try
            conn.Open()                       '先是打开连接
            Return cmd.ExecuteNonQuery        '执行增删改操作
        Catch ex As Exception
            Return 0
            'Finally
            '    Call CloseConn(conn)
            '    Call CloseCmd(cmd)
        End Try
    End Function
    ''' <summary>
    ''' 执行查询操作(有参)
    ''' </summary>
    ''' <param name=" cmdText ">需要执行语句,一般是sql语句,也有存储过程</param >
    ''' <param name=" cmdType ">判断sql语句的类型,一般都不是存储过程</param >
    ''' <param name="paras" >传入的参数</param >
    ''' <returns></returns >
    ''' <remarks></remarks>
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dt As New DataTable
        Dim ds As New DataSet

        cmd.Parameters.AddRange(paras)
        cmd.CommandText = cmdText
        cmd.CommandType = cmdType
        cmd.Connection = conn

        sqlAdapter = New SqlDataAdapter(cmd)    '实例化adapter
        Try
            'conn.Open()
            sqlAdapter.Fill(ds)               '用adapter将dataset填充
            dt = ds.Tables(0)                 'datatable为dataset的第一个表
            'dt.Load(cmd.ExecuteReader)
            cmd.Parameters.Clear()
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally

            Call CloseCmd(cmd)                   '销毁cmd
        End Try

        Return dt
    End Function
    ''' <summary>
    ''' 执行查询操作(无参)
    ''' </summary>
    ''' <param name=" cmdText ">需要执行语句,一般是sql语句,也有存储过程</param >
    ''' <param name=" cmdType ">判断sql语句的类型,一般都不是存储过程</param >
    ''' <returns>datatable,查询到的表格</returns >
    ''' <remarks></remarks>
    Public Function ExecSelectNo(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim ds As New DataSet

        cmd.CommandText = cmdText
        cmd.CommandType = cmdType
        cmd.Connection = conn
        sqlAdapter = New SqlDataAdapter(cmd)    '实例化adapter
        Try
            sqlAdapter.Fill(ds)               '用adapter将dataset填充
            Return ds.Tables(0)              'datatable为dataset的第一个表
        Catch ex As Exception
            Return Nothing
        Finally
            Call CloseCmd(cmd)                   '销毁cmd
        End Try

    End Function
    ''' <summary>
    ''' 关闭连接
    ''' </summary>
    ''' <param name="conn">需要关闭的连接</param>
    ''' <remarks></remarks>
    Public Sub CloseConn(ByVal conn As SqlConnection)
        If (conn.State <> ConnectionState.Closed) Then         '如果没有关闭
            conn.Close()                                       '关闭连接
            conn = Nothing                                     '不指向原对象
        End If
    End Sub

    Public Sub CloseCmd(ByVal cmd As SqlCommand)
        If Not IsNothing(cmd) Then                   '如果命令存在
            cmd.Dispose()                            '销毁命令
            cmd = Nothing
        End If
    End Sub
End Class
</span>


那么我们把方法都抽象封装了,该怎么调用呢?下面就以登录窗体为例来应用一下吧。。。


<span style="font-size:18px;">Imports System.Data
Imports System.Data.SqlClient
Imports Entity
Imports SqlHelper</span>
<span style="font-size:18px;">
Public Class UserDAO 
    Dim dt As New DataTable
    Dim sqlhelper As New Global.SqlHelper.SqlHelper
    Dim flag As Boolean

    ''' <summary>
    ''' 根据ID号得到用户信息
    ''' </summary>
    ''' <param name="user"></param>
    ''' <returns>datatable</returns>
    ''' <remarks></remarks>
    Public Function GetUserInfo(ByVal user As En_UserInfo) As DataTable Implements IUserInfo.GetUserInfo
        Dim sql As String = "select * from user_table where userID=@UserID"            '查询语句
        Dim paras As SqlParameter() = {New SqlParameter("@UserID", user.UserID)}
        '添加参数
        dt = sqlhelper.ExecSelect(sql, CommandType.Text, paras)
        Return dt
    End Function</span>

        有了SqlHelpe这个小助手,确实给我们带来了很大的方便,在以后的实践应用中还要慢慢理解和吸收,主要是这种思想:编程,既不能偷懒,又要学会适当的偷懒~~~







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 37
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值