机房重构之SqlHelper
在机房重构中,D层中有很多的类,其中很多都需要跟数据库打交道,就是所谓的增删改查,这些命令的执行就都是重复性的,仅仅是查询内容和数据表不同,就是所谓的查询参数和查询数据库的语句不同。
但是,执行查询的语句都是相同的,所以,就没有必要在D层的每个类中都写数据库的执行语句,而是把它们拿出来写成一个一个的自定义函数,并把这些函数封装到一个类当中,这个类就是SqlHelper,SqlHelper就是封装了一些对数据库操作的方法。
在VB版本的机房中,也是把对数据库的操作封装成了一个函数,把这个函数放在公共模块中,供所有的窗体调用,代码如下可以看出具体的操作分为了两类,一个是增删改操作,一个查询操作。
<span style="font-size:24px;">Public Function Executesql(ByVal sql As String, msgstring As String) As ADODB.Recordset Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim stokens() As String stokens = Split(sql) Set cnn = New ADODB.Connection cnn.Open connectstring If InStr("insert,delete,update", UCase$(stokens(0))) Then cnn.Execute sql msgstring = stokens(0) & "query successful" Else Set rst = New ADODB.Recordset rst.Open Trim$(sql), cnn, adOpenKeyset, adLockOptimistic Set Executesql = rst msgstring = "查询到" & rst.RecordCount & "条记录" End If executesql_exit: Set rst = Nothing Set cnn = Nothing Exit Function End Function </span>
在VB.NET版的机房重构中,具体的操作也是分为了两类,一类是查询,一类是增删改操作,根据是否带参数,分为四个自定义函数。
查询就是要去查东西,肯定都必须要有返回值Boolean,或者有返回结果DataTable,而增删改操作直接在数据中进行执行,不要求必须要有返回的结果,但是在对数据库的执行过程中,要设置异常处理,就是如果遇到错误之后,它会马上把该错误的具体的信息抛出,表示对数据库的操作失败。
1、带参数的查询,比如学生查看余额,查看充值记录,查看学生信息,返回的结果是表DataTable。
2、不带参数的查询,比如查询操作员工作记录,查询的是整张表,不需要任何的参数,返回的结果也是DataTable。
3、带参数的增删改,比如删除某个用户参数为——选中要删除的用户,修改密码和充值参数为——卡号,用户充值等,不要求有返回结果。
4、不带参数的增删改,比如学生注册,用户退卡添加退卡信息,添加用户充值记录等,不要求有返回结果。
下面是具体的代码,仅供参考。
Public Class SqlHelper '利用配置文件寻找连接字符串,建立cmd文件 '定义变量,获得数据库连接字符串 '定义cmd命令 Private ReadOnly constr As String = System.Configuration.ConfigurationSettings.AppSettings("strConn") Dim conn As New SqlConnection(constr) Dim cmd As New SqlCommand '一共是四个自定义的函数,但是只有两个方法名 '系统会自动根据参数的不同,是否有参数,决定调用哪一个方法 '就是方法的名字相同,但是参数不同 'cmdText——用来传递SQl语句 'cmdType——决定Command如何解释CommandText属性的内容默认取值为Text,即SQL语句 'sqlParameters——是CommandText属性所指定的SQL语句或存储过程的参数集合 '查询操作,带参数,返回结果是表 Public Function GetDataTable(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlparams As SqlParameter()) As DataTable '建立数据库连接 cmd = conn.CreateCommand() '将该函数的三个参数,分别赋给相应的对象 '设置具体的sql语句 '设置解释CommandText的方式 '设置具体的执行参数 cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Parameters.AddRange(sqlparams) '定义数据适配器变量,并实例化,将cmd绑定在adapter上面 '定义数据缓存变量 '定义变量返回数据表 Dim sqlAdapter As New SqlDataAdapter(cmd) Dim ds As New DataSet Dim dt As New DataTable Try '打开连接 '用adapter将dataset填充 '返回查询的结果,数据表 conn.Open() sqlAdapter.Fill(ds) dt = ds.Tables(0) '捕获,并且抛出该异常 'Exception——系统抛出的异常 'ex——通过ex,显示该异常内容 Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseConn(conn) Call CloseCmd(cmd) End Try Return dt End Function '查询操作,不带参数,返回结果是表 Public Function GetDataTable(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable cmd = conn.CreateCommand() cmd.CommandText = cmdText cmd.CommandType = cmdType '定义数据适配器变量,并实例化,将cmd绑定在adapter上面 '定义数据缓存变量 Dim sqlAdapter As New SqlDataAdapter(cmd) Dim ds As New DataSet Dim dt As New DataTable Try conn.Open() sqlAdapter.Fill(ds) dt = ds.Tables(0) Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseConn(conn) Call CloseCmd(cmd) End Try Return dt End Function '增删改操作,带参数,没有返回结果 Public Function NoReturn(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlparams As SqlParameter()) cmd = conn.CreateCommand cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Parameters.AddRange(sqlparams) Try conn.Open() cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseConn(conn) Call CloseCmd(cmd) End Try Return True End Function '增删改操作,不带参数,没有返回结果 Public Function NoReturn(ByVal cmdText As String, ByVal cmdType As CommandType) cmd = conn.CreateCommand cmd.CommandText = cmdText cmd.CommandType = cmdType Try conn.Open() cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseConn(conn) End Try Return True End Function ''' <summary> ''' 关闭连接 ''' </summary> '''<param name="conn ">需要关闭的连接</param> '''<remarks>2015-3-29 17:22:31</remarks> Public 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>2015-3-29 17:22:31</remarks> Public Sub CloseCmd(ByVal cmd As SqlCommand) If Not IsNothing(cmd) Then '如果cmd命令存在 cmd.Dispose() '销毁 cmd = Nothing End If End Sub End Class