为了提高软件的灵活性和可维护性,软件的代码须要科学的管理。我们引入了架构这个词。设计模式提醒我们,软件中反复性的代码须要封装起来。
近期在做收费系统时。须要和数据库进行频繁的联系。既然是反复的使用,就须要封装,这里使用到了sql helper 。
先来看看百度对sqohelper的解释:一个基于.NETFframework的数据库操作组件。尽管不知道组件的详细含义。还是能够猜出来它就是D层中对数据库操作进行封装的工具。
数据库的操作,不外乎四种模式,增、删、改、查,依据返回值来区分,能够分为有返回值和无返回值两大类,增、删、改操作是不须要返回值的,查询操作返回值就是查询结果。这些操作各自都有两种操作方式,有參数和无參数的。无參数的就是对整张表的操作,有參数的是对个别字段的操作。
sql helper用到的方法或函数或參数:
ExecuteNonQuery :此方法用于运行没有返回值的命令(有參数或者没有參数)。它通经常使用于运行数据库(增、删、改)命令,也可用于返回存储过程的输出參数。
Parameters:此參数用于运行有參数的查询或更新(增、删、改)操作。
sql Command: 此函数用于封装数据库操作命令。
CommandType:用于设置数据库连接类型
CommandText:用于设置数据库连接语句。
看一下sql helper类代码:
Imports System.Data.SqlClient Imports System.Configuration Imports System.Data '须要在管理器中加入引用 Public Class sqlHelper '定义变量 Dim ConnString As String = "Server=.;Database=Charge;User=sa;PassWord=123456" '获得数据库连接字符串 Private ReadOnly strConnection As String = ConfigurationSettings.AppSettings("ConnString") Dim conn As SqlConnection = New SqlConnection(strConnection) '定义CMD命令 Dim cmd As New SqlCommand ''' <summary> ''' 运行查询操作(有參数),參数没有限制 ''' </summary> ''' <param name="cmdText">须要运行的语句,通常是SQL语句。也可能是存储过程</param> ''' <param name="cmdType">推断SQL语句的类型。一般不是存储过程</param> ''' <param name="sqlparameters">传入參数</param> ''' <returns></returns> ''' <remarks></remarks> Public Function ParaSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlparameters As SqlParameter()) As DataTable ' Using conn As New SqlConnection(ConnString) ' Dim sqlAdapter As SqlDataAdapter ' Dim dt As New DataTable ' Dim ds As New DataSet ' '给CMD赋值 cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Connection = conn cmd.Parameters.AddRange(sqlparameters) '加入參数 sqlAdapter = New SqlDataAdapter(cmd) '实例化adapter Try sqlAdapter.Fill(ds) '用adapter将dataSet填充 dt = ds.Tables(0) 'datatable为dataSet的第一个表 cmd.Parameters.Clear() '清除參数 Catch ex As Exception '抛出异常 MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告") Finally Call CloseCmd(cmd) '销毁cmd命令 End Try Return dt End Using End Function ''' <summary> ''' 运行查询操作(无參数) ''' </summary> ''' <param name="cmdText">同上</param> ''' <param name="cmdType">同上</param> ''' <returns>dataTable查询到表格</returns> ''' <remarks></remarks> Public Function NonParaSelect(cmdText As String, cmdType As CommandType) As DataTable Using conn As New SqlConnection(ConnString) Dim sqlAdapter As SqlDataAdapter Dim ds As New DataSet cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Connection = conn sqlAdapter = New SqlDataAdapter(cmd) Try sqlAdapter.Fill(ds) Return ds.Tables(0) '抛出异常。无返回值 Catch ex As Exception Return Nothing Finally Call CloseCmd(cmd) '关闭CMD命令 End Try End Using End Function ''' <summary> ''' 运行增、删、改操作(有參数)。使用Integer作为返回值类型。0操作失败。1操作成功 ''' </summary> ''' <param name="cmdText">须要运行的语句</param> ''' <param name="cmdType">推断SQL语句类型</param> ''' <param name="sqlParameter">參数数组,參数没有限制</param> ''' <returns></returns> ''' <remarks></remarks> Public Function ParaDataManager(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParameter As SqlParameter()) As Integer '使用Usingkeyword实例化连接字符串。给cmd赋值 Using conn As New SqlConnection(ConnString) cmd.Parameters.AddRange(sqlParameter) 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 Finally Call CloseConn(conn) Call CloseCmd(cmd) End Try End Using End Function ''' <summary> ''' 运行增、删、改操作(无參数) ''' </summary> ''' <param name="cmdType">同上</param> ''' <param name="cmdText">同上</param> ''' <returns></returns> ''' <remarks></remarks> Public Function NonParaDataManager(ByVal cmdType As CommandType, ByVal cmdText As String) As Integer '使用Using keyword实例化连接字符串 Using conn As New SqlConnection(ConnString) cmd.CommandText = cmdText '设置查询语句 cmd.CommandType = cmdType '设置SQL语句类型 cmd.Connection = conn '设置连接 Try '运行操作 conn.Open() Return cmd.ExecuteNonQuery '返回值 Catch ex As Exception Return 0 '抛出异常。返回0表示操作失败 Finally Call CloseCmd(cmd) Call CloseConn(conn) End Try End Using 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 ''' <summary> ''' 关闭命令 ''' </summary> ''' <param name="cmd">须要关闭的命令</param> ''' <remarks></remarks> Public Sub CloseCmd(ByVal cmd As SqlCommand) If Not IsNothing(cmd) Then '假设CMD命令存在 cmd.Dispose() '销毁命令 cmd = Nothing End If End Sub End Class
sqlhelper类代码分为三部分。第一部分为数据库连接设置部分;第二部分是四个数据库操作,从上到下依次为:有參数的查询、无參数的查询、有參数的更新、无參数的更新;第三部分为关闭连接和销毁命令部分。每一次调用这个类,在结尾都须要关闭命令和连接。查询操作须要返回查询结果,没有返回值得须要返回Integer类型的0或1来推断是否操作成功。
看看D层代码时怎样调用sql helper的:查询操作(有參数):
Imports System.Data.SqlClient Imports System.Data Imports Charge.DAL.sqlHelper Public Class Login Public user1 As Charge.Model.User Dim strSQL As String Dim help As New sqlHelper Public Function SelectUsers(user1 As Charge.Model.User) As DataTable strSQL = "select * from User_Info where UserName=@UserName and PassWord=@PassWord" Dim sqlPara As SqlParameter() = { New SqlParameter("@UserName", user1.UserName), New SqlParameter("@PassWord", user1.PassWord) } Return help.ParaSelect(strSQL, CommandType.Text, sqlPara) End Function End Class
这个模块时登录模块,使用username和password作为參数,返回值为DataTable表格。
更新(加入)操作(有參数):
Imports System.Data.SqlClient Imports Charge.DAL.sqlHelper Imports System.Data Public Class AddUsers Dim strSQL As String Dim help As New sqlHelper Public Function AddUser(user3 As Charge.Model.User) As Integer strSQL = "insert into [User_Info] (UserName,PassWord,Level,RealName)values(@UserName,@PassWord,@Level,@RealName) " Dim sqlPara As SqlParameter() = { New SqlParameter("@UserName", user3.UserName), New SqlParameter("@PassWord", user3.PassWord), New SqlParameter("@Level", user3.Level), New SqlParameter("@RealName", user3.RealName) } Return help.ParaDataManager(strSQL, CommandType.Text, sqlPara) End Function End Class这个模块时插入模块。使用了四个參数。返回值类型为Integer。
这里没实用到设计模式,仅仅是进行了封装,没实用到泛化和继承。随着进一步的学习,会有更好的办法来解决反复的问题。