SQLHelper的妙用

        在做三层的时候,我们会发现一个问题,在D层有两个功能,一个是用户登录,一个是增加分数,通过分析发现,这两个方法都会有一个相同的地方,那就是对数据库的操作,其代码基本上是相同的。可能现在不会有什么问题,因为就只有两个功能而已。假如说要敲一个完整的系统的话,其中涉及到的功能不知道有多少,而每一个功能都会产生对数据库的操作问题,比如说连接,打开,关闭,大致都是相同的。而这个时候相同的代码会是一个非常庞大的数量,如果说其中一个错了,就得修改所有的功能,这无疑会是一个非常庞大的工作量。

由上面的问题可知,既然D层操作数据库的代码大部分都是相同的,何不把它抽象出来,作为公共法方法。因此SQLHelper由此诞生,其功能就是专门负责对数据库进行操作:无非就是两种情况,一是对表的查询,一个对表的更改(增、删、改)。如下:

    <span style="color:#006600;">''' <summary>
    ''' 执行不带参数的增删改操作
    ''' </summary>
    ''' <param name="cmdTxt">参数cmdTxt为所要执行的sql语句</param>
    ''' <param name="cmdType">SqlCommand的执行类型</param>
    ''' <returns>整形返回值res,执行成功则res!=0,不成功则res=0</returns>
    ''' <remarks></remarks></span>
    Public Shared Function ExecuteNoQuery(ByVal cmdTxt As String, ByVal cmdType As CommandType) As Integer

        Dim conn As SqlConnection = New SqlConnection(ConnectionString)    <span style="color:#006600;">'定义连接变量conn,进行数据库连接</span>
        Dim cmd As SqlCommand     <span style="color:#006600;">'定义执行命令变量</span>
        Dim res As Integer    <span style="white-space:pre">	</span>  <span style="color:#006600;">'定义返回值变量res</span>

        cmd = New SqlCommand(cmdTxt, conn)    <span style="color:#009900;">'实例化conn上的SqlCommand命令,执行语句为cmdTxt</span>
        cmd.CommandType = cmdType     <span style="color:#009900;">'命令执行的类型</span>

        Try
           <span style="color:#009900;"> '如果数据库连接状态为关闭则将其打开</span>
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If

            <span style="color:#009900;">'执行cmdTxt语句,并将执行结果返回给res(执行成功返回的记录总数)</span>
            res = cmd.ExecuteNonQuery()

        Catch ex As Exception
            <span style="color:#009900;">'错误处理程序,出错则提示</span>
            MsgBox(ex.Message, , "数据库操作")
        Finally
           <span style="color:#009900;"> '如果连接状态为打开则将其关闭,释放内存</span>
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try

        Return res   
    End Function



   <span style="color:#009900;"> ''' <summary>
    ''' 执行带参数的增删改操作
    ''' </summary>
    ''' <param name="cmdTxt">参数cmdTxt为所要执行的sql语句</param>
    ''' <param name="cmdType">SqlCommand的执行类型</param>
    ''' <param name="paras">sql语句中引用的参数</param>
    ''' <returns>整形返回值res,执行成功则res!=0,不成功则res=0</returns>
    ''' <remarks></remarks></span>
    Public Shared Function ExecuteNoQuery(ByVal cmdTxt As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Integer

        Dim conn As SqlConnection = New SqlConnection(ConnectionString)         
        Dim cmd As SqlCommand      
        Dim res As Integer         

        cmd = New SqlCommand(cmdTxt, conn)       
        cmd.CommandType = cmdType        <span style="color:#009900;">'命令执行的类型</span>
        cmd.Parameters.AddRange(paras)   <span style="color:#009900;">'执行cmdTxt语句时所带的参数</span>

        Try
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If

            res = cmd.ExecuteNonQuery()

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try

        Return res  

    End Function



  <span style="color:#009900;">  ''' <summary>
    ''' 执行不带参数的查询操作
    ''' </summary>
    ''' <param name="cmdTxt">cmdTxt作为查询时的sql语句</param>
    ''' <param name="cmdType">查询时的查询方式</param>
    ''' <returns>查询后以表的方式返回,如下面的adataset.Tables(0)</returns>
    ''' <remarks></remarks></span>
    Public Shared Function GetDataTable(ByVal cmdTxt As String, ByVal cmdType As CommandType) As DataTable

        Dim conn As SqlConnection = New SqlConnection(ConnectionString)   
        Dim cmd As New SqlCommand      
        Dim adataset As DataSet       <span style="color:#009900;"> '定义数据缓存变量</span>
        Dim adaptor As SqlDataAdapter  <span style="color:#009900;">'定义数据适配器变量</span>

        cmd = New SqlCommand(cmdTxt, conn) 
        adaptor = New SqlDataAdapter(cmd)   <span style="color:#009900;">'将结果绑定到数据适配器变量adaptor上面</span>
        adataset = New DataSet    <span style="white-space:pre">	</span>    <span style="color:#009900;">'实例化数据缓存变量adataset</span>
        cmd.CommandType = cmdType   <span style="white-space:pre">	</span>    <span style="color:#009900;">'选择命令执行的类型</span>

        Try
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If

            adaptor.Fill(adataset)

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try

<span style="color:#009900;">        '以表格形式返回结果</span>
        Return adataset.Tables(0)

    End Function




<span style="color:#009900;">    ''' <summary>
    ''' 执行带参数的查询操作
    ''' </summary>
    ''' <param name="cmdTxt">参数cmdTxt为所要执行的sql语句</param>
    ''' <param name="cmdType">查询时的查询方式</param>
    ''' <param name="paras">查询时的命令参数paras</param>
    ''' <returns>查询后以表的方式返回,如下面的adataset.Tables(0)</returns>
    ''' <remarks></remarks></span>
    Public Shared Function GetDataTable(ByVal cmdTxt As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable

        Dim conn As SqlConnection = New SqlConnection(ConnectionString)     
        Dim cmd As SqlCommand      
        Dim adaptor As SqlDataAdapter  
        Dim adataset As DataSet    

        cmd = New SqlCommand(cmdTxt, conn)  
        cmd.CommandType = cmdType     <span style="color:#009900;">  '命令执行的类型</span>
        cmd.Parameters.AddRange(paras) <span style="color:#009900;"> '命令执行时的参数</span>

        adaptor = New SqlDataAdapter(cmd)   
        adataset = New DataSet

        Try
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            adaptor.Fill(adataset)          <span style="color:#009900;">'向adaptor对象中填充查询的数据</span>
        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try

        Return adataset.Tables(0)

    End Function


        总结:通过对以上的抽象,将SQLHelper单独拿出来,使得对数据库的操作集中到一个类中,提高了代码的可用性。当然每一个程序都会对数据库进行操作,所以SQLHelper是通用的,其前景很是广阔。

缺点:当然指的是我这篇文章中的代码,通过比较就会发现,其中相同的东西还是很多的,其还可以进一步进行抽象概括,具体如何进行,就交给阅读此文章的大牛了。

你可能感兴趣的:(数据库,三层)