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

时间:2022-12-20 15:06:54

        刚开始三层的时候就已经听说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这个小助手,确实给我们带来了很大的方便,在以后的实践应用中还要慢慢理解和吸收,主要是这种思想:编程,既不能偷懒,又要学会适当的偷懒~~~