VB.NET輔助類備忘錄之數據庫查詢-SQLHelper

Imports System.Data.SqlClient

Public Class SQLHelper
    Dim ConnString As String '連接字符串
    Dim Conn As SqlClient.SqlConnection '數據庫連接
    Dim Trans As SqlClient.SqlTransaction '事務---自動開啓、出錯自動回滾,但必須手動提交
    Dim IfTrans As Boolean = False '是否啓用事務,默認不啓用

    ''' <summary>
    ''' 獲取或設置用於打開SQL Server數據庫的連接字符串。
    ''' </summary>
    ''' <returns></returns>
    Public Property ConnectionString As String '連接字符串  屬性
        Get
            Return ConnString
        End Get
        Set(value As String)
            ConnString = value
        End Set
    End Property

    ''' <summary>
    ''' 獲取或設置SQLHelper的此實例使用的SqlConnection。
    ''' </summary>
    ''' <returns></returns>
    Public Property Connection As SqlClient.SqlConnection '數據庫連接 屬性
        Get
            Return Conn
        End Get
        Set(value As SqlClient.SqlConnection)
            Conn = value
        End Set
    End Property

    ''' <summary>
    ''' 獲取SQLHelper的此實例使用的SqlTransaction,需配合UseTransaction屬性使用。
    ''' </summary>
    ''' <returns></returns>

    Public ReadOnly Property Transaction As SqlClient.SqlTransaction '事務 只讀屬性
        Get
            Return Trans
        End Get
    End Property

    ''' <summary>
    ''' 設置SQLHelper的此實例是否使用事務,若爲True,則事務自動開啓、出錯自動回滾,但必須手動提交事務。
    ''' </summary>

    Public WriteOnly Property UseTransaciton As Boolean '是否啓用事務 屬性
        Set(value As Boolean)
            IfTrans = value
            If value Then '如果使用事務,則添加連接狀態改變事件
                AddHandler Conn.StateChange, AddressOf Conn_StateChange
            End If
        End Set
    End Property

    Public Sub New()

    End Sub
    ''' <summary>
    ''' 如果給定包含連接字符串的字符串,則初始化SQLHelper的新實例。使用完後請調用Dispose銷燬此實例釋放資源。
    ''' </summary>
    ''' <param name="sqlconnstring">連接字符串</param>
    Public Sub New(sqlconnstring As String) '用連接字符串 構造函數 +1重載
        ConnString = sqlconnstring
        Conn = New SqlClient.SqlConnection(ConnString)
    End Sub

    ''' <summary>
    ''' 初始化包含連接字符串和是否使用事務的SQLHelper的新實例。使用完後請調用Dispose銷燬此實例釋放資源。
    ''' </summary>
    ''' <param name="sqlconnstring">連接字符串。</param>
    ''' <param name="usetransaction">指示是否使用事務。</param>
    Public Sub New(sqlconnstring As String, usetransaction As Boolean) '用連接字符串,是否使用事務 構造函數 +2重載
        ConnString = sqlconnstring
        Conn = New SqlClient.SqlConnection(ConnString)
        IfTrans = usetransaction
        If usetransaction Then '如果使用事務,則添加連接狀態改變事件
            AddHandler Conn.StateChange, AddressOf Conn_StateChange
        End If
    End Sub

    ''' <summary>
    ''' 使用一個SqlConnection初始化SQLHelper的新實例。使用完後請調用Dispose銷燬此實例釋放資源。
    ''' </summary>
    ''' <param name="sqlconn">一個SqlConnection,它表示到SQL Server實例的連接。</param>

    Public Sub New(sqlconn As SqlClient.SqlConnection) '用數據庫連接 構造函數 +3重載
        ConnString = sqlconn.ConnectionString
        Conn = sqlconn
    End Sub

    ''' <summary>
    ''' 初始化具有一個SqlConnection和是否使用事務的SQLHelper的新實例。使用完後請調用Dispose銷燬此實例釋放資源。
    ''' </summary>
    ''' <param name="sqlconn">一個SqlConnection,它表示到SQL Server實例的連接。</param>
    ''' <param name="usetransaction">指示是否使用事務。</param>
    Public Sub New(sqlconn As SqlClient.SqlConnection, usetransaction As Boolean) '用數據庫連接,是否使用事務 構造函數 +4重載
        ConnString = sqlconn.ConnectionString
        Conn = sqlconn
        IfTrans = usetransaction
        If usetransaction Then '如果使用事務,則添加連接狀態改變事件
            AddHandler Conn.StateChange, AddressOf Conn_StateChange
        End If
    End Sub

    ''' <summary>
    ''' Insert、Delete、Update數據庫。
    ''' </summary>
    ''' <param name="cmdtext">要對數據源執行的Transact-SQL語句、表名或存儲過程,cmdtext中不包含參數。</param>
    ''' <param name="cmdtype">指示如何解釋cmdtext。</param>
    ''' <returns>返回受影響的數據行數。</returns>

    Public Function ExecAddDelUpdate(cmdtext As String, cmdtype As CommandType) As Integer '添加刪除更新數據庫 無參,有/無事務 +1重載
        Dim CMD As New SqlClient.SqlCommand(cmdtext, Connection) With {
            .CommandType = cmdtype  '設置cmdtext類型:存儲過程名、SQL命令、表名
            } '新建查詢命令 
        Try
            If Conn.State <> ConnectionState.Open Then
                Conn.Open()
            End If
            If IfTrans Then
                CMD.Transaction = Transaction
            End If
            Return CMD.ExecuteNonQuery
        Catch ex As Exception
            If IfTrans Then
                'Trans.Rollback()
                'Trans.Dispose()
                'If Conn.State <> ConnectionState.Closed Then
                'Conn.Close()
                'End If
                Return 0
            End If
            Throw New Exception(ex.Message)
        Finally
            If Conn.State <> ConnectionState.Closed And Not IfTrans Then
                Conn.Close()
            End If
        End Try
    End Function

    ''' <summary>
    ''' Insert、Delete、Update數據庫。
    ''' </summary>
    ''' <param name="cmdtext">要對數據源執行的Transact-SQL語句、表名或存儲過程,cmdtext中包含參數。</param>
    ''' <param name="cmdtype">指示如何解釋cmdtext。</param>
    ''' <param name="paras">用於cmdtext的參數。</param>
    ''' <returns>返回受影響的數據行數。</returns>
    Public Function ExecAddDelUpdate(cmdtext As String, cmdtype As CommandType, paras As SqlClient.SqlParameter()) As Integer '添加刪除更新數據庫 有參,有/無事務 +2重載
        Dim CMD As New SqlClient.SqlCommand(cmdtext, Connection, Trans) With {
            .CommandType = cmdtype  '設置cmdtext類型:存儲過程名、SQL命令、表名
            } '新建查詢命令 
        CMD.Parameters.AddRange(paras) '添加參數
        Try
            If Conn.State <> ConnectionState.Open Then '若連接未打開,則打開
                Conn.Open()
            End If
            If IfTrans Then
                CMD.Transaction = Transaction
            End If
            Return CMD.ExecuteNonQuery '執行
        Catch ex As Exception
            If Not IfTrans Then '如果使用了事務,則回滾,銷燬,關閉連接
                'Trans.Rollback()
                'Trans.Dispose()
                'If Conn.State <> ConnectionState.Closed Then
                '    Conn.Close()
                'End If
                Return 0
            End If
            Throw New Exception(ex.Message)
        Finally
            If Conn.State <> ConnectionState.Closed And Not IfTrans Then '如果未使用事務,則關閉連接
                Conn.Close()
            End If
        End Try
    End Function

    ''' <summary>
    ''' Select數據庫。
    ''' </summary>
    ''' <param name="cmdtext">要對數據源執行的Transact-SQL語句、表名或存儲過程,cmdtext中不包含參數。</param>
    ''' <param name="cmdtype">指示如何解釋cmdtext。</param>
    ''' <returns>返回檢索到的DataTable數據表。</returns>
    Public Function ExecSelect(cmdtext As String, cmdtype As CommandType) As DataTable '檢索數據庫 無參 +1重載
        Dim dt As New DataTable
        Dim ds As New DataSet
        '定義cmd 
        Dim CMD As New SqlClient.SqlCommand(cmdtext, Connection) With {
            .CommandType = cmdtype  '設置cmdtext類型:存儲過程名、SQL命令、表名
            }
        '定義adapter 
        Dim sqlAdapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(CMD)
        Try
            sqlAdapter.Fill(ds)           '用adapter將dataSet填充   
            If ds.Tables.Count > 0 Then
                dt = ds.Tables(0)             'datatable爲dataSet的第一個表 
            End If
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
        Return dt
    End Function

    ''' <summary>
    ''' Select數據庫。
    ''' </summary>
    ''' <param name="cmdtext">要對數據源執行的Transact-SQL語句、表名或存儲過程,cmdtext中包含參數。</param>
    ''' <param name="cmdtype">指示如何解釋cmdtext。</param>
    ''' <param name="paras">用於cmdtext的參數。</param>
    ''' <returns>返回檢索到的DataTable數據表。</returns>
    Public Function ExecSelect(cmdtext As String, cmdtype As CommandType, paras As SqlClient.SqlParameter()) As DataTable '檢索數據庫 有參 +1重載
        Dim dt As New DataTable
        Dim ds As New DataSet
        '定義cmd 
        Dim CMD As New SqlClient.SqlCommand(cmdtext, Connection) With {
            .CommandType = cmdtype  '設置cmdtext類型:存儲過程名、SQL命令、表名
            }
        CMD.Parameters.AddRange(paras) '添加參數
        '定義adapter 
        Dim sqlAdapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(CMD)
        Try
            sqlAdapter.Fill(ds)           '用adapter將dataSet填充   
            If ds.Tables.Count > 0 Then
                dt = ds.Tables(0)             'datatable爲dataSet的第一個表 
            End If
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
        Return dt
    End Function

    ''' <summary>
    ''' 當此實例的Connection打開,且UseTransaction爲True時發生:自動開啓事務(Transaction)。
    ''' </summary>
    Private Sub Conn_StateChange() '打開連接自動開啓事務
        If Conn.State = ConnectionState.Open And IfTrans Then
            Try
                Trans = Conn.BeginTransaction
            Catch ex As Exception
                MsgBox(ex.Message, CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "開啓事務失敗")
                If Conn.State <> ConnectionState.Closed Then
                    Conn.Close()
                End If
            End Try
        End If
    End Sub

    ''' <summary>
    ''' 提交此實例的Transaction,並關閉連接,若提交失敗則自動回滾。
    ''' </summary>
    Public Sub CommitTransaction() '提交事務
        Try
            Trans.Commit()
        Catch ex As Exception
            Trans.Rollback()
            Throw New Exception(ex.Message)
        Finally
            If Conn.State <> ConnectionState.Closed Then
                Conn.Close()
            End If
        End Try

    End Sub

    ''' <summary>
    ''' 銷燬SQLHelper的此實例
    ''' </summary>
    Public Sub Dispose()
        '釋放數據庫連接
        If Conn.State <> ConnectionState.Closed Then
            Conn.Close()
        End If
        Conn.Dispose()
        Conn = Nothing
        ConnString = Nothing
        '釋放事務
        If Trans IsNot Nothing Then
            Trans.Dispose()
        End If
        Trans = Nothing
        IfTrans = Nothing
    End Sub
End Class

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章