机房收费重构(四)-SqlHelper

     最近由于学校专业课考试,导致上一篇的一些博客没有及时补上,让读者久等了,下面来说说关于DAL中一个模板吧-SqlHelper。

     在敲机房收费中,有好多都是重复的访问数据库这些操作,这样我们可以将这些步骤抽象出来,命名为SqlHelper。在任何时候想到抽象和封装。面向对象的思想深入骨髓。

     在SQLHelper中主要有四类,分别是:

不带参数的sql增删改语句或存储过程(无返回行或值)

带参数的sql增删改语句或存储过程(无返回行或值)

不带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)

带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)

     好了废话少说,直接上代码模板了。

     1. 首先要通过配置文件获得字符串

<span style="font-size:14px">Imports System.Data.SqlClient
Imports System.Configuration        '添加对配置文件的引用
Public Class SqlHelper

    '通过配置文件获取连接字符串并赋值给所声明的变量strConnection
    Dim strConnection As String = ConfigurationManager.AppSettings("strSqlConnection")

    Dim conn As SqlConnection = New SqlConnection(strConnection)                    '设置连接
    Dim cmd As New SqlCommand                                                       '声明SqlCommand类变量cmd</span>

     2.提取重复的代码:

<span style="font-size:14px">    ''' <summary>
    ''' 关闭连接
    ''' </summary>
    ''' <param name="conn">需要关闭的连接</param>
    ''' <remarks></remarks>
    Private Sub CloseConn(ByVal conn As SqlConnection)
        '如果没有关闭,则关闭连接
        If (conn.State <> ConnectionState.Closed) Then
            conn.Close()
            conn = Nothing
        End If
    End Sub

    ''' <summary>
    ''' 关闭命令
    ''' </summary>
    ''' <param name="cmd">需要关闭的命令</param>
    ''' <remarks></remarks>
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If
    End Sub</span>

    3.具体操作。分别是有参增删改、无参增删改、有参查询、无参查询。

<span style="font-size:14px">    ''' <summary>
    ''' 关闭命令
    ''' </summary>
    ''' <param name="cmd">需要关闭的命令</param>
    ''' <remarks></remarks>
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If
    End Sub
    ''' <summary>
    ''' 有参数的 增删改 操作
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>
    ''' <param name="sqlParams">参数数组</param>
    ''' <returns>返回执行 增删改 语句受影响的行数,为Integer类型</returns>
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Integer

        '将传入的值,分别为cmd的属性赋值
        cmd.Parameters.AddRange(sqlParams)      '将参数传入
        cmd.CommandType = cmdType               '设置一个值,解释cmdText
        cmd.Connection = conn                   '设置连接
        cmd.CommandText = cmdText               '设置查询的语句  

        '执行操作
        Try
            conn.Open()                         '打开连接
            Return cmd.ExecuteNonQuery()        '执行增删改操作并返回受影响的行数
            cmd.Parameters.Clear()              '清除参数
        Catch ex As Exception
            Return 0                            '如果出错,返回0
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try

    End Function

    ''' <summary>
    ''' 无参数的 增删改 操作
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>
    ''' <returns>返回执行 增删改 语句受影响的行数,为Integer类型</returns>
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer

        '将传入的参数,分别为cmd的属性赋值
        cmd.CommandType = cmdType               '设置一个值,解释cmdText
        cmd.Connection = conn                   '设置连接
        cmd.CommandText = cmdText               '设置查询的语句  

        '执行操作
        Try
            conn.Open()                         '打开连接
            Return cmd.ExecuteNonQuery()        '执行增删改操作并返回受影响的行数
            cmd.Parameters.Clear()              '清除参数
        Catch ex As Exception
            Return 0                            '如果出错,返回0
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try

    End Function

    ''' <summary>
    ''' 有参数的 查询 操作
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>
    ''' <param name="sqlParams">参数数组</param>
    ''' <returns>返回执行 查询 得到的结果,为DataTable类型</returns>
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable

        Dim sqlAdapter As SqlDataAdapter        '声明适配器
        Dim dt As New DataTable                 '声明数据表
        Dim ds As New DataSet                   '声明数据缓存

        '将传入的值,分别为cmd的属性赋值
        cmd.Parameters.AddRange(sqlParams)      '将参数传入
        cmd.CommandType = cmdType               '设置一个值,解释cmdText
        cmd.Connection = conn                   '设置连接
        cmd.CommandText = cmdText               '设置查询的语句  

        sqlAdapter = New SqlDataAdapter(cmd)    '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)                 '用适配器对ds进行填充
            dt = ds.Tables(0)                   '返回数据集的第一个表
            cmd.Parameters.Clear()              '清除参数
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try
        Return dt

    End Function

    ''' <summary>
    ''' 无参数的 查询 操作,返回值为DataTable类型
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>
    ''' <returns>返回执行 查询 得到的结果,为DataTable类型</returns>
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable

        Dim sqlAdapter As SqlDataAdapter        '声明适配器
        Dim dt As New DataTable                 '声明数据表
        Dim ds As New DataSet                   '声明数据缓存

        '将传入的值,分别为cmd的属性赋值
        cmd.CommandType = cmdType               '设置一个值,解释cmdText
        cmd.Connection = conn                   '设置连接
        cmd.CommandText = cmdText               '设置查询的语句  

        sqlAdapter = New SqlDataAdapter(cmd)    '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)                 '用适配器对ds进行填充
            dt = ds.Tables(0)                   '返回数据集的第一个表
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try
        Return dt

    End Function

End Class</span>

      在今后的机房收费,我想都会用到这个步骤,大家不会每次访问数据库的总是重复的写那么查询数据库的代码吧,从SqlHelper中我们可以学到面向对象的思想,以后在今后的编程中要注意会使用模板。这样精简代码,提高代码利用率。

  

机房收费重构(四)-SqlHelper,布布扣,bubuko.com

时间: 2025-01-11 19:20:52

机房收费重构(四)-SqlHelper的相关文章

机房收费重构之总结篇

<机房收费重构>之路终于接近了尾声,这么一个月的时间做梦都在敲代码.总结<机房收费重构>的道路需要从学习方法,注意问题,知识总结三方面来进行! <机房收费重构>之路的背景: 1.设计模式: 设计模式的思想这次在<机房收费重构>中体现出来了,算是对设计模式的一种考察吧,思想运用于实践.本次机房收费系统使用了外观模式,模板模式,原型模式等.具体在哪里应用大家都可以运用自有. 2.三层架构的基本认知 三层架构主要是让我们了解了关于分层的主要思想,算是给项目打下良好

机房收费重构——关于面向对象和分层的纠结

机房收费系统的重构已经开始很久了,最近两天才感到有了一点儿头绪. 对这次重构,刚开始计划的是先做数据库,然后优化下,列出每个窗体对表的访问关系,抽出常用的访问作为存储过程,然后把访问数据库的常用方法封装成SqlHelper.这部分就是数据库的部分. 然后就是软件的结构:整体上是分了七层:三层+实体+外观+抽象工厂+D层接口.虽然计划的很好,但是在具体分层这里想了很久. 最先是对D层开始下手的.D层是什么?是对表的访问,将对数据库的读取和写入都封装成D层的类,那么,类又按照什么分呢?后来想了想以前

机房收费重构——关于上下机的再思考

有句话叫做no zuo no die,我大概就是这种人吧.why?做机房收费系统的时候,按照一般方法也能实现,但这次做上下机的时候,总感觉这么做对自己来说,没什么提高,然后就停下来,重新想想上下机还能怎么做? 后来,大致采用的思路是这样的:将上下机的读写数据的过程写成两个存储过程,负责读取和更改数据.中间的计算过程写在代码里面:中间判断时间的过程用职责链模式来实现,判断一般用户还是临时用户用策略模式实现.这样,整个上下机的过程就是这样的: 1,用上机的存储过程使学生上机,然后将学生上机信息写入表

黎明前的黑暗---开启机房收费重构

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

机房收费系统中sqlhelper的应用

在接受了三层的思想之后,sqlhelper被传的沸沸扬扬,它给我们的编码带来多少优势.让编码者少花了多少时间.多少精力,等等的赞美之词不绝于耳.自己也是将信将疑的,毕竟自己没有亲身经历,所以没有很大的体会.而如今,自己多次使用了sqlhelper,穿梭在各层之间确实也体会到了它带给我们的简便之处,结合很多人的版本自己编写了属于自己的那一版,以下便是具体代码: <span style="font-family:KaiTi_GB2312;font-size:18px;">Imp

机房收费系统重构(五)—登陆窗口完整版

     在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那几部分的理解,并没有写贴出代码让大家研究的.可是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中全部的代码,贴出来供大家拍砖斧正.还有最后我在谈谈针对BLL层和外观层的理解.      首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成.    

机房收费系统重构(五)

     在上上篇,<机房收费系统重构(3)>,中主要是介绍了自己关于DAL层,工厂层,以及接口层,还有实体层的理解,但是好多读者再问我,你的代码呢,我在这解释一下,就是我只是写出关于那几部分的理解,并没有写贴出代码让大家研究的,但是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中所有的代码,贴出来供大家拍砖斧正,还有最后我在谈谈针对BLL层和外观层的理解.      首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成.      

机房收费系统——SqlHelper

前面自己将了一大堆ADO.NET的基础知识,现在该认真的实践一下了,下面我介绍一下vb.net版机房收费系统中,SqlHelper的使用,在机房收费中,SqlHelper是自己编写的一个类,里面用到的前面讲的几个对象的简单实例. SqlHelper简介:SqlHelper是一个基于·NETFramework的数据库操作组件.组件中包含数据库操作方法.SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等.SqlHe

机房收费系统个人重构关于SQLHelper

近期在敲机房,对于SQLHelper也是心里有些怵,由于原来没用过,可是看了一些博客和资料后发现,假设不用这个类,会大大添加代码量,并且,事实上它并不新,它是一个有多个关于数据库增删改查操作的语句函数的类,使用这个类能够方便D层调用,对数据库的操作,我们无非就是增删改查,而函数就是有无參数,有无返回值,SQLHelper是个新词,只是我们却一直在用,仅仅是我们不这么叫,之所以叫SQLHelper,理所当然它是D层操作数据的助手, 在SQLHelper类中实现的方法包含: ExecuteNonQu