您的位置:首页 > 数据库

【个人重构】Sqlhelper我们的小助手

2015-12-04 20:48 381 查看
背景:敲机房有一段时间了,一直都没敢写博客,因为好多东西一直都是一知半解的,在后来不断的调试过程中,不断的实践中越来越能体会sqlHelper的强大之处了,在之前看到很多人都在用只知道肯定有好处,但是具体的好处确实不知道,反正富人=接受+了解,虽然不是很懂,但可以先用着,废话不多说,进入正题,讲讲我都学到了什么。

一、 SqlHelper含义

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

二、SqlHelper功能

1、方法

(1)ExecuteNonQuery。此方法用于执行(有参数或无参数的)不返回任何行或值的命令。这些命令通常用于执行数据库(增\删\改)更新,但也可用于返回存储过程的输出参数。

(2) ExecuteReader。此方法用于返回 SqlDataReader 对象,该对象包含由某一命令返回的结果集。

(3)ExecuteDataset。此方法返回 DataSet 对象,该对象包含由某一命令返回的结果集。

SqlHelper的每一个方法都要有一个返回值,因为返回值的不同会造成相应调用此方法的方法也要有一样的返回值。可以返回DataTable(DataTable是一个临时保存数据的网络虚拟表,可以被创建和访问,当SqlHelper查询后就要返回到DataTable虚拟表中,判断它的第一行是否有数据来判断是否查到记录。)也可以返回Integer

2、函数:

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

三、何时用SqlHelper

当有多个关于数据库增删改成操作的时候就用到了SqlHelper,因为D层是直接操作数据库,完成数据库的增删改查的,所以SqlHelper是属于D层的,但是我是单独拿出来成为一层的。把D层的所有对数据库的操作方法都封装起来。分为两种操作,一种是增删改,一种是查询操作,而每种又分为有参数的和无参数的。这样减轻了D的负担,使D层不会显得太臃肿。

四、代码展示

<span style="font-size:14px;">Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration   '必须要在管理器中添加引用
Public Class SqlHelper
    '定义变量
    '获取数据库连接字符串
    Private ReadOnly strConnection As String = ConfigurationSettings.AppSettings("strConnection")
    '设置连接
    Dim conn As SqlConnection = New SqlConnection(strConnection)
    '定义cmd命令

    Dim cmd As New SqlCommand

    '执行增删改三个操作,(有参)返回值为Boolean类型,确认是否执行成功
    'cmdText 需要执行语句,一般是SQL语句,也有存储过程
    'paras 参数数组,无法确认有多少参数
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Integer
        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
            MsgBox(ex.Message, , "数据库操作")     '如果出错,返回0
            Return False

            'ruturn 0
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)

        End Try
    End Function
    ''' <summary>
    ''' 执行增删改三个操作,(无参)返回值为Boolean类型,确认是否执行成功
    ''' </summary>
    ''' <param name="cmdText"></param> 需要执行语句,一般是sql语句,也有存储过程
    ''' <param name="cmdType"></param>
    ''' <returns> 受影响的行数</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
            MsgBox(ex.Message, , "数据库操作")     '如果出错,返回0
            Return False
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)

        End Try
    End Function
    ''' <summary>
    ''' 执行查询操作,(有参),返回值为datatable类型,参数不限
    ''' </summary>
    ''' <param name="cmdText">需要执行语句,一般为sql语句,也有存储过程</param>
    ''' <param name="cmdType"></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.CommandText = cmdText
        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.Parameters.AddRange(paras) '参数添加

        sqlAdapter = New SqlDataAdapter(cmd) '实例化adapter

        Try
            sqlAdapter.Fill(ds)  '用adapter将dataset填充
            dt = ds.Tables(0)
            cmd.Parameters.Clear()

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")  '如果操作,返回0
        Finally
            Call CloseCmd(cmd)
        End Try
        Return dt

    End Function
    ''' <summary>
    ''' 执行查询操作,(无参),返回值为datatable
    ''' </summary>
    ''' <param name="cmdText">需要执行语句,一般是sql语句,也有存储过程</param>
    ''' <param name="cmdType">判断sql语句的类型,一般都不是存储过程</param>
    ''' <returns></returns>
    ''' <remarks></remarks>

    Public Function ExecSelectNo(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.CommandText = cmdText
        cmd.CommandType = cmdType
        cmd.Connection = conn
        sqlAdapter = New SqlDataAdapter(cmd) '实例化adapter

        Try
            sqlAdapter.Fill(ds)  '用adapter将dataset填充
            dt = ds.Tables(0)
        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")  '如果操作,返回0
        Finally
            Call closeCmd(cmd)
        End Try
        Return dt

    End Function

    Public Sub CloseCmd(ByVal cmd As SqlCommand)
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If

    End Sub
    Public Sub CloseConn(ByVal conn As SqlConnection)
        If (conn.State <> ConnectionState.Closed) Then
            conn.Close()
            conn = Nothing
        End If
    End Sub
End Class</span>


五、具体应用

<span style="font-size:18px;"> </span><span style="font-size:14px;">Public Function SelectStudentNo(studentEntity As Entity.StudentEntity) As List(Of Entity.StudentEntity) Implements IDAL.IStudentInfo.SelectStudentNo
        Dim sql As New SqlHelper.SqlHelper
        Dim dt As New DataTable
        Dim mylist As New List(Of Entity.StudentEntity)

        Dim sqlparams As SqlParameter() = {New SqlParameter("@studentNo", studentEntity.StudentNo)}
        Dim strsql As String = "select * from T_Student where Chr_StudentNo=@studentNo"

        dt = sql.ExecSelect(strsql, CommandType.Text, sqlparams)
        mylist = ConvertHelper.convertToList(Of Entity.StudentEntity)(dt)
        Return mylist
        
    End Function</span>


六、总结

通过用SqlHelper小助手让我知道了如何为D层减负,通过归类的方法使增删改查更加细化,更加方便我们查询。同时我积极学习大家都用的东西,只有了解了才知道好不好。同时通过自己用也可以想出更好的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: