重构之SqlHelper
重構(gòu)之SqlHelper
?
? ? ? ? ? 在重構(gòu)中,D層中有很多的類,其中很多都需要跟數(shù)據(jù)庫打交道,就是所謂的增刪改查,這些命令的執(zhí)行就都是重復(fù)性的,僅僅是查詢內(nèi)容和數(shù)據(jù)表不同,就是所謂的查詢參數(shù)和查詢數(shù)據(jù)庫的語句不同。
? ? ? ? ??但是,執(zhí)行查詢的語句都是相同的,所以,就沒有必要在D層的每個(gè)類中都寫數(shù)據(jù)庫的執(zhí)行語句,而是把它們拿出來寫成一個(gè)一個(gè)的自定義函數(shù),并把這些函數(shù)封裝到一個(gè)類當(dāng)中,這個(gè)類就是SqlHelper,SqlHelper就是封裝了一些對數(shù)據(jù)庫操作的方法。
? ? ? ? ??在VB版本的機(jī)房中,也是把對數(shù)據(jù)庫的操作封裝成了一個(gè)函數(shù),把這個(gè)函數(shù)放在公共模塊中,供所有的窗體調(diào)用,代碼如下可以看出具體的操作分為了兩類,一個(gè)是增刪改操作,一個(gè)查詢操作。
?
?
<span style="font-size:24px;">Public Function Executesql(ByVal sql As String, msgstring As String) As ADODB.RecordsetDim cnn As ADODB.ConnectionDim rst As ADODB.RecordsetDim stokens() As Stringstokens = Split(sql)Set cnn = New ADODB.Connectioncnn.Open connectstringIf InStr("insert,delete,update", UCase$(stokens(0))) Thencnn.Execute sqlmsgstring = stokens(0) & "query successful"ElseSet rst = New ADODB.Recordsetrst.Open Trim$(sql), cnn, adOpenKeyset, adLockOptimisticSet Executesql = rstmsgstring = "查詢到" & rst.RecordCount & "條記錄"End If executesql_exit:Set rst = NothingSet cnn = NothingExit Function End Function </span>?
?
?
? ? ? ? ??在VB.NET版的機(jī)房重構(gòu)中,具體的操作也是分為了兩類,一類是查詢,一類是增刪改操作,根據(jù)是否帶參數(shù),分為四個(gè)自定義函數(shù)。
? ? ? ? ??查詢就是要去查東西,肯定都必須要有返回值Boolean,或者有返回結(jié)果DataTable,而增刪改操作直接在數(shù)據(jù)中進(jìn)行執(zhí)行,不要求必須要有返回的結(jié)果,但是在對數(shù)據(jù)庫的執(zhí)行過程中,要設(shè)置異常處理,就是如果遇到錯(cuò)誤之后,它會(huì)馬上把該錯(cuò)誤的具體的信息拋出,表示對數(shù)據(jù)庫的操作失敗。
? ? ? ? ??1、帶參數(shù)的查詢,比如學(xué)生查看余額,查看充值記錄,查看學(xué)生信息,返回的結(jié)果是表DataTable。
? ? ? ? ??2、不帶參數(shù)的查詢,比如查詢操作員工作記錄,查詢的是整張表,不需要任何的參數(shù),返回的結(jié)果也是DataTable。
? ? ? ? ??3、帶參數(shù)的增刪改,比如刪除某個(gè)用戶參數(shù)為——選中要?jiǎng)h除的用戶,修改密碼和充值參數(shù)為——卡號,用戶充值等,不要求有返回結(jié)果。
? ? ? ? ? 4、不帶參數(shù)的增刪改,比如學(xué)生注冊,用戶退卡添加退卡信息,添加用戶充值記錄等,不要求有返回結(jié)果。
? ? ? ? ??下面是具體的代碼,僅供參考。
?
Public Class SqlHelper'利用配置文件尋找連接字符串,建立cmd文件'定義變量,獲得數(shù)據(jù)庫連接字符串 '定義cmd命令Private ReadOnly constr As String = System.Configuration.ConfigurationSettings.AppSettings("strConn")Dim conn As New SqlConnection(constr)Dim cmd As New SqlCommand'一共是四個(gè)自定義的函數(shù),但是只有兩個(gè)方法名'系統(tǒng)會(huì)自動(dòng)根據(jù)參數(shù)的不同,是否有參數(shù),決定調(diào)用哪一個(gè)方法'就是方法的名字相同,但是參數(shù)不同'cmdText——用來傳遞SQl語句'cmdType——決定Command如何解釋CommandText屬性的內(nèi)容默認(rèn)取值為Text,即SQL語句'sqlParameters——是CommandText屬性所指定的SQL語句或存儲(chǔ)過程的參數(shù)集合'查詢操作,帶參數(shù),返回結(jié)果是表Public Function GetDataTable(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlparams As SqlParameter()) As DataTable'建立數(shù)據(jù)庫連接cmd = conn.CreateCommand()'將該函數(shù)的三個(gè)參數(shù),分別賦給相應(yīng)的對象'設(shè)置具體的sql語句'設(shè)置解釋CommandText的方式'設(shè)置具體的執(zhí)行參數(shù)cmd.CommandText = cmdTextcmd.CommandType = cmdTypecmd.Parameters.AddRange(sqlparams)'定義數(shù)據(jù)適配器變量,并實(shí)例化,將cmd綁定在adapter上面'定義數(shù)據(jù)緩存變量'定義變量返回?cái)?shù)據(jù)表Dim sqlAdapter As New SqlDataAdapter(cmd)Dim ds As New DataSetDim dt As New DataTableTry'打開連接'用adapter將dataset填充'返回查詢的結(jié)果,數(shù)據(jù)表conn.Open()sqlAdapter.Fill(ds)dt = ds.Tables(0)'捕獲,并且拋出該異常'Exception——系統(tǒng)拋出的異常'ex——通過ex,顯示該異常內(nèi)容Catch ex As ExceptionMsgBox(ex.Message, , "數(shù)據(jù)庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn dtEnd Function'查詢操作,不帶參數(shù),返回結(jié)果是表Public Function GetDataTable(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTablecmd = conn.CreateCommand()cmd.CommandText = cmdTextcmd.CommandType = cmdType'定義數(shù)據(jù)適配器變量,并實(shí)例化,將cmd綁定在adapter上面'定義數(shù)據(jù)緩存變量Dim sqlAdapter As New SqlDataAdapter(cmd)Dim ds As New DataSetDim dt As New DataTableTryconn.Open()sqlAdapter.Fill(ds)dt = ds.Tables(0)Catch ex As ExceptionMsgBox(ex.Message, , "數(shù)據(jù)庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn dtEnd Function'增刪改操作,帶參數(shù),沒有返回結(jié)果Public Function NoReturn(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlparams As SqlParameter())cmd = conn.CreateCommandcmd.CommandText = cmdTextcmd.CommandType = cmdTypecmd.Parameters.AddRange(sqlparams)Tryconn.Open()cmd.ExecuteNonQuery()Catch ex As ExceptionMsgBox(ex.Message, , "數(shù)據(jù)庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn TrueEnd Function'增刪改操作,不帶參數(shù),沒有返回結(jié)果Public Function NoReturn(ByVal cmdText As String, ByVal cmdType As CommandType)cmd = conn.CreateCommandcmd.CommandText = cmdTextcmd.CommandType = cmdTypeTryconn.Open()cmd.ExecuteNonQuery()Catch ex As ExceptionMsgBox(ex.Message, , "數(shù)據(jù)庫操作")FinallyCall CloseConn(conn)End TryReturn TrueEnd Function''' <summary> ''' 關(guān)閉連接 ''' </summary> '''<param name="conn ">需要關(guān)閉的連接</param> '''<remarks>2015-3-29 17:22:31</remarks> Public Sub CloseConn(ByVal conn As SqlConnection)If (conn.State <> ConnectionState.Closed) Then '如果沒有關(guān)閉 conn.Close() '關(guān)閉連接 conn = Nothing '不指向原對象 End IfEnd Sub''' <summary> ''' 關(guān)閉命令 ''' </summary> '''<param name="cmd ">需要關(guān)閉的命令 </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 = NothingEnd IfEnd Sub End Class?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的重构之SqlHelper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七层登录实现
- 下一篇: SqlServer数据类型