您的位置:首页 > 数据库

个人重构机房收费系统——SqlHelper介绍

2014-05-24 21:00 399 查看
在敲纯三层版的机房的过程中,对于D层数据库的查询,整个层中重复的代码达到了百分之八十,总结所有D层的代码无非有4中情况,所有的查询操作分为带参数和不带参数的,返回为实体或者datatable类型,所有的非查询操作同样也有带参数和不带参数两种,于是在敲的过程中,我就想着如何把这些代码简化一些,最开始的想法就是把那些重复的代码抽出来组成不同的方法放到一个新的类中,后来才知道原来这个过程早就已经定好了,这个就是大名鼎鼎的SqlHelper。在开始机房之前只是听说过这个,网上查资料也是不太懂,没用过不知道是什么,现在终于懂了!下面介绍一下如何编写SqlHelper类中的代码:

 

上篇博客中介绍了配置文件的使用,这里我们用配置文件的形式获取连接字符串

首先添加引用

<span style="font-size:18px;"><strong>Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
</strong></span>
<span style="font-size:18px;"><strong>Public Class SqlHelper
'读取配置文件
Private Shared strConnection As String = ConfigurationManager.AppSettings("strSqlconnection")
Dim conn As SqlConnection = New SqlConnection(strConnection) '设置连接
Dim cmd As SqlCommand '设置命令

'每次数据库关闭之后都要关闭连接和命令
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</strong></span>

 'SqlHelper中的操作总共有2大类,每类中有两种,分为查询操作和非查询操作,其中每类中包括有参数和无参数两种

<span style="font-size:18px;"><strong>  ''' <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
</strong></span>
<span style="font-size:18px;"><strong>  ''' <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
</strong></span>

一点新的认识:对于这几个查询和非查询的操作返回值类型的讲解:

相比于纯三层的数据库操作中,在SqlHelper中的查询操作返回值为datatable类型,将查询的结果放到一个表里,返回这个表,至于有没有查询数据我们不用管,直接在逻辑层对返回表的内容判断即可,有结果是什么情况和无结果是什么情况分别处理。对于非查询的操作,返回整型进行判断,如果非查询的操作运行成功,返回“1”,如果不成功,返回“0”,然后把这个整型的结果传回B层中,B层针对返回结果的整型类别进行相应处理,当然了,在非查询的返回值问题上还有其他的返回类型,比如boolean类型、实体类型等,如果有必要我们可以扩展SqlHelper类,一切代码以方便我们编写和维护为中心。

通过对SqlHelper的学习,对之前一次一次不耐烦的编写那些重复的代码感到无比痛心,浪费了不少时间呀!其实一个好的系统,不会有太多重复的东西,如果重复的东西太多,就使那些东西失去了本身的价值,在敲代码的过程中就已经意识到了,一个功能的实现过程决不是复制粘贴得来的!找一找他们之间的关系,总能得出好的结果!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: