“就不能不換DB嗎?——抽象工廠模式”,沒錯,這是大話設計中的一章,在這一章中,大鳥教會了小菜,用配置檔案改變‘DB’的值,進而改變了應用程式要通路的資料庫類型。詳情請見大話設計模式P157
- 我們在SQLHelper中也用到了配置檔案來改變SQLHelper中資料庫連接配接的字元串
VB.net之旅-SQLHelper的應用程式配置檔案和使用(機房收費系統重構個人版)
因為我們使用的是應用程式配置檔案,是以我們将配置檔案添加在UI層,右擊UI層->建立項->正常->應用程式配置檔案,在app.config中對connstr進行指派。
- SQLHelper将我們日常生活中常用的四個存儲過程(insert,delete,modify, select)進行了封裝
- 無參,傳回值為所影響行數的增删改方法
- 有參,傳回值為所影響行數的增删改方法
- 無參,傳回值為SqlDataReader的查方法
- 有參,傳回值為SqlDataReader的查方法
<span style="font-family:Tahoma;font-size:18px;">Imports System Imports System.Data '需要在解決方案管理器中對SQLHelper所在的項目中添加對System.Configuration的引用 Imports System.Configuration Imports System.Data.SqlClient Public Class SQLHelper Dim conn As SqlConnection Dim cmd As SqlCommand Dim connstr As String = ConfigurationManager.AppSettings("connstr").ToString Public SQLHelper() #Region "建立資料庫連接配接對象" ''' <summary> ''' 建立資料庫的連接配接 ''' </summary> ''' <returns>傳回一個資料庫的連接配接SqlConnection對象</returns> ''' <remarks></remarks> Public Function getSqlConnection() As SqlConnection Try conn = New SqlConnection(connstr) '利用配置檔案,連接配接到connstr所指定的資料庫 If (conn.State.Equals(ConnectionState.Open)) = False Then conn.Open() End If Catch ex As Exception Throw New Exception(ex.Message.ToString()) End Try Return conn End Function #End Region #Region "設定SqlCommand對象" ''' <summary> ''' 設定SqlCommand對象 ''' </summary> ''' <param name="cmd">SqlCommand對象</param> ''' <param name="cmdText">指令文本</param> ''' <param name="cmdType">指令類型</param> ''' <param name="cmdParms">參數集合</param> ''' <remarks></remarks> Public Sub SetCommand(ByVal cmd As SqlCommand, ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdParms As SqlParameter()) cmd.Connection = conn cmd.CommandText = cmdText cmd.CommandType = cmdType If (cmdParms Is Nothing) = False Then cmd.Parameters.AddRange(cmdParms) End If End Sub #End Region #Region "無參,傳回所影響的行數的增删改方法" ''' <summary> ''' 執行不帶參數sql語句或存儲過程,傳回所影響的行數 ''' </summary> ''' <param name="cmdText">增,删,改sql語句</param> ''' <returns>傳回所影響的行數</returns> ''' <remarks></remarks> Public Function ExecuteNonQuery(ByVal cmdText As String) As Int16 Dim count As Int16 Try getSqlConnection() cmd = New SqlCommand(cmdText, conn) count = cmd.ExecuteNonQuery() conn.Close() Catch ex As Exception Throw New Exception(ex.Message.ToString()) End Try Return count End Function #End Region #Region "有參,傳回所影響的行數的增删改方法" ''' <summary> ''' 執行帶參數sql語句或存儲過程,傳回所影響的行數 ''' </summary> ''' <param name="cmdText">帶參數的sql語句和存儲過程名</param> ''' <param name="cmdType">指令類型</param> ''' <param name="cmdparms">參數集合</param> ''' <returns>傳回所影響的行數</returns> ''' <remarks></remarks> Public Function ExecuteNonQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdparms As SqlParameter()) Dim count As Int16 Try getSqlConnection() Dim cmd As New SqlCommand SetCommand(cmd, cmdText, cmdType, cmdparms) count = cmd.ExecuteNonQuery() cmd.Parameters.Clear() conn.Close() Catch ex As Exception Throw New Exception(ex.Message.ToString) End Try Return count End Function #End Region #Region "無參,具有傳回值的查詢方法" ''' <summary> ''' 執行不帶參數sql語句,傳回一個從資料源讀取資料的SqlDataReader對象 ''' </summary> ''' <param name="cmdText">相應的sql語句</param> ''' <returns>一個從資料源讀取資料的SqlDataReader對象</returns> ''' <remarks></remarks> Public Function ExecuteReader(ByVal cmdText As String) As SqlDataReader Dim reader As SqlDataReader Try getSqlConnection() cmd = New SqlCommand(cmdText, conn) reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) Catch ex As Exception Throw New Exception(ex.Message.ToString) End Try Return reader End Function #End Region #Region "無參,具有傳回值的查詢方法" ''' <summary> ''' 執行帶參數的sql語句或存儲過程,傳回一個從資料源讀取資料的SqlDataReader對象 ''' </summary> ''' <param name="cmdText">sql語句或存儲過程名</param> ''' <param name="cmdType">指令類型</param> ''' <param name="cmdParms">參數集合</param> ''' <returns>傳回一個從資料源讀取資料的SqlDataReader對象</returns> ''' <remarks></remarks> Public Function ExecuteReader(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdParms As SqlParameter()) As SqlDataReader Dim reader As SqlDataReader Try getSqlConnection() cmd = New SqlCommand() SetCommand(cmd, cmdText, cmdType, cmdParms) reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) Catch ex As Exception Throw New Exception(ex.Message.ToString()) End Try Return reader End Function #End Region End Class</span>
光有代碼,不會使用也發揮不了SQLHelper的強大之處
有參,傳回值為所影響行數的增删改使用
有參,傳回值為SqlDataReader的查方法的使用
從開始知道有個SQLHelper到真正實作,花了我一周的時間,可真是耗時耗力,不過我也體會到了SQLHelper的好處,SqlHelper簡化了我們需要重複寫的資料庫連接配接,如SqlConnection,SqlCommand,SqlDataReader等等;還有,SqlHelper封裝過後通常是隻需要給方法傳入一些參數如資料庫連接配接字元串,SQL參數等,就可以通路資料庫了,很友善。