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