重构之SqlHelper
重構之SqlHelper
?
? ? ? ? ? 在重構中,D層中有很多的類,其中很多都需要跟數據庫打交道,就是所謂的增刪改查,這些命令的執行就都是重復性的,僅僅是查詢內容和數據表不同,就是所謂的查詢參數和查詢數據庫的語句不同。
? ? ? ? ??但是,執行查詢的語句都是相同的,所以,就沒有必要在D層的每個類中都寫數據庫的執行語句,而是把它們拿出來寫成一個一個的自定義函數,并把這些函數封裝到一個類當中,這個類就是SqlHelper,SqlHelper就是封裝了一些對數據庫操作的方法。
? ? ? ? ??在VB版本的機房中,也是把對數據庫的操作封裝成了一個函數,把這個函數放在公共模塊中,供所有的窗體調用,代碼如下可以看出具體的操作分為了兩類,一個是增刪改操作,一個查詢操作。
?
?
<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版的機房重構中,具體的操作也是分為了兩類,一類是查詢,一類是增刪改操作,根據是否帶參數,分為四個自定義函數。
? ? ? ? ??查詢就是要去查東西,肯定都必須要有返回值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 = cmdTextcmd.CommandType = cmdTypecmd.Parameters.AddRange(sqlparams)'定義數據適配器變量,并實例化,將cmd綁定在adapter上面'定義數據緩存變量'定義變量返回數據表Dim sqlAdapter As New SqlDataAdapter(cmd)Dim ds As New DataSetDim dt As New DataTableTry'打開連接'用adapter將dataset填充'返回查詢的結果,數據表conn.Open()sqlAdapter.Fill(ds)dt = ds.Tables(0)'捕獲,并且拋出該異常'Exception——系統拋出的異常'ex——通過ex,顯示該異常內容Catch ex As ExceptionMsgBox(ex.Message, , "數據庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn dtEnd Function'查詢操作,不帶參數,返回結果是表Public Function GetDataTable(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTablecmd = conn.CreateCommand()cmd.CommandText = cmdTextcmd.CommandType = cmdType'定義數據適配器變量,并實例化,將cmd綁定在adapter上面'定義數據緩存變量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, , "數據庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn dtEnd Function'增刪改操作,帶參數,沒有返回結果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, , "數據庫操作")FinallyCall CloseConn(conn)Call CloseCmd(cmd)End TryReturn TrueEnd Function'增刪改操作,不帶參數,沒有返回結果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, , "數據庫操作")FinallyCall CloseConn(conn)End TryReturn TrueEnd 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 IfEnd 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 = NothingEnd IfEnd Sub End Class?
?
?
?
?
總結
以上是生活随笔為你收集整理的重构之SqlHelper的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七层登录实现
- 下一篇: SqlServer数据类型