閱讀1006 返回首頁    go 阿裏雲 go 技術社區[雲棲]


機房收費係統個人重構關於SQLHelper

              最近在敲機房,對於SQLHelper也是心裏有些怵,因為原來沒用過,但是看了一些博客和資料後發現,如果不用這個類,會大大增加代碼量,而且,其實它並不新,它是一個有多個關於數據庫增刪改查操作的語句函數的類,使用這個類可以方便D層調用,對數據庫的操作,我們無非就是增刪改查,而函數就是有無參數,有無返回值,SQLHelper是個新詞,不過我們卻一直在用,隻是我們不這麼叫,之所以叫SQLHelper,理所當然它是D層操作數據的助手,

         在SQLHelper類中實現的方法包括:

                     ExecuteNonQuery。此方法用於執行不返回任何行或值的命令。這些命令通常用於執行數據庫更新,但也可用於返回存儲的輸出參數。
           ExecuteReader。此方法用於返回對象,該對象包含由某一命令返回的結果集。
           ExecuteDataset。此方法返回DataSet對象,該對象包含由某一命令返回的結果集。
           ExecuteScalar。此方法返回一個值。該值始終是該命令返回的第一行的第一列。
        ExecuteXmlReader。此方法返回 FOR XML 查詢的 XML 片段。
   在機房收費係統中,用到了一下方法:

         下麵用代碼來展示一下這個類:

         在用SQLHelper之前,我們要先用配置文件配置連接字符串,這樣有利於在客戶端更改數據庫:

 <appSettings >
       <add key ="Connstr" value ="datasource=.;database=ChargeSys;uid=sa;password=123456" />
    </appSettings>
         這樣就可以在SQLHelper中方便的使用連接字符串了,不管數據庫怎麼換,對源碼都沒有影響: 

Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient
Public Class SqlHelper
    '獲得數據庫連接字符串
    Private ReadOnly strConn As String = ConfigurationManager.AppSettings("Connstr")
    '新建連接
    Dim connSQL As SqlConnection = New SqlConnection(strConn)
    '定義命令
    Dim cmdSQL As New SqlCommand
    ''' <summary>
    ''' 執行增刪改,有參,確認是否執行成功
    ''' </summary>
    ''' <param name="cmdSQLText">需要執行的數據庫語句</param>
    ''' <param name="cmdSQLType">數據語句的類型,可能是sql類型,也可能是存儲過程等</param>
    ''' <param name="sqlParams">參數數組,無法確定有多少參數</param>
    ''' <returns>返回受影響行數</returns>
    ''' <remarks></remarks>
    Public Function ExecuteAddDelUpdate(ByVal cmdSQLText As String, ByVal cmdSQLType As CommandType, ByVal sqlParams As SqlParameter()) As Integer
        cmdSQL.Parameters.AddRange(sqlParams) '將參數傳入
        cmdSQL.CommandType = cmdSQLType '確定語句類型,是sql還有oracle還是其他類型
        cmdSQL.CommandText = cmdSQLText '將sql語句傳給cmdSQL
        cmdSQL.Connection = connSQL '設置連接,全局變量

        '開始執行查詢
        Try
            connSQL.Open() '打開連接
            Return cmdSQL.ExecuteNonQuery() '執行查詢
            cmdSQL.Parameters.Clear() '清除參數
        Catch ex As Exception
            Return 0
        Finally
            Call CloseConnection(connSQL)
            Call CloseSQLCommand(cmdSQL)
        End Try

    End Function
    ''' <summary>
    ''' 執行增刪改,有參,確認是否執行成功
    ''' </summary>
    ''' <param name="cmdText">需要執行的數據庫語句</param>
    ''' <param name="cmdType">數據語句的類型,一般為Sql語句,不是存儲過程</param>
    ''' <returns>返回受影響的行數</returns>
    ''' <remarks></remarks>
    Public Function ExecuteAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
        cmdSQL.CommandType = cmdType '確定語句類型,是sql還有oracle還是其他類型
        cmdSQL.CommandText = cmdText '將sql語句傳給cmdSQL
        cmdSQL.Connection = connSQL '設置連接,全局變量

        '開始執行查詢
        Try
            connSQL.Open() '打開連接
            Return cmdSQL.ExecuteNonQuery() '執行查詢
            cmdSQL.Parameters.Clear() '清除參數
        Catch ex As Exception
            Return 0
        Finally
            Call CloseConnection(connSQL)
            Call CloseSQLCommand(cmdSQL)
        End Try

    End Function
    ''' <summary>
    ''' 執行查詢操作,有參,返回datatable類型
    ''' </summary>
    ''' <param name="cmdText">需要執行的數據庫語句,一般SQL語句,也有存儲過程</param>
    ''' <param name="cmdType">數據語句的類型,一般為Sql語句,不是存儲過程</param>
    ''' <param name="sqlParams">參數數組,不確定有多少參數數組</param>
    ''' <returns>返回datatable類型</returns>
    ''' <remarks></remarks>
    Public Function ExecuteSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dtSQL As New DataTable
        Dim dsSQL As New DataSet

        cmdSQL.CommandText = cmdText
        cmdSQL.CommandType = cmdType
        cmdSQL.Connection = connSQL
        cmdSQL.Parameters.AddRange(sqlParams)
        sqlAdapter = New SqlDataAdapter(cmdSQL)

        Try
            sqlAdapter.Fill(dsSQL)
            dtSQL = dsSQL.Tables(0) 'datatable為dataSet的第一個表
            cmdSQL.Parameters.Clear()
        Catch ex As Exception
            MsgBox("查詢失敗", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseSQLCommand(cmdSQL)
        End Try

        Return dtSQL

    End Function
    ''' <summary>
    ''' 執行查詢操作,無參,返回datatable類型
    ''' </summary>
    ''' <param name="cmdText">需要執行的數據庫語句,一般SQL語句,也有存儲過程</param>
    ''' <param name="cmdType">數據語句的類型,一般為Sql語句,不是存儲過程</param>
    ''' <returns>返回datatable類型</returns>
    ''' <remarks></remarks>
    Public Function ExecuteSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dtSQL As New DataTable
        Dim dsSQL As New DataSet

        cmdSQL.CommandText = cmdText
        cmdSQL.CommandType = cmdType
        cmdSQL.Connection = connSQL
        sqlAdapter = New SqlDataAdapter(cmdSQL) '實例化adapter

        Try
            sqlAdapter.Fill(dsSQL) '用dsSQL填充sqlAdapter
            dtSQL = dsSQL.Tables(0)
        Catch ex As Exception
            Call CloseSQLCommand(cmdSQL)
        End Try

        Return dtSQL

    End Function
    ''' <summary>
    ''' 關閉連接
    ''' </summary>
    ''' <param name="connSQL">需要關閉連接</param>
    ''' <remarks></remarks>
    Public Sub CloseConnection(ByVal connSQL As SqlConnection)
        If (connSQL.State <> ConnectionState.Closed) Then '如果沒有關閉
            connSQL.Close() '關閉連接
            connSQL = Nothing '不指向原對象
        End If
    End Sub
    ''' <summary>
    ''' 關閉命令
    ''' </summary>
    ''' <param name="cmdSQL">需要關閉命令</param>
    ''' <remarks></remarks>
    Public Sub CloseSQLCommand(ByVal cmdSQL As SqlCommand)
        If Not IsNothing(cmdSQL) Then '如果存在命令
            cmdSQL.Dispose() '將命令銷毀
            cmdSQL = Nothing

        End If
    End Sub
End Class
          SQLHelper將數據庫操作語句分為了兩類,一類是增刪改、一類是查,這兩類又分別有有參和無參兩種,這些在D層有多個類需要操作數據庫時,我們隻需要調用這裏的類,如果有參,隻需要把參數穿進去就行了,下麵看一看在D層我們是怎麼用它的:

Imports System.Data
Imports System.Data.SqlClient
Imports DALHelper
Imports IDAL
Imports Entity
Public Class LoginDAL : Implements IDAL.ILogin
    Public Function SelectUser(user As UserInfoEntity) As DataTable Implements ILogin.SelectUser
        Dim cmdText As String
        Dim sqlhelper As New SqlHelper
        Dim dtSQL As DataTable
        Dim sqlParams As SqlParameter()

        cmdText = "select * from T_UserInfo where UserName=@UserName and Password=@Password"
        sqlParams = {New SqlParameter("@UserName", user.UserName), New SqlParameter("@Password", user.Password)}
        dtSQL = sqlhelper.ExecuteSelect(cmdText, CommandType.Text, sqlParams)

        Return dtSQL

    End Function
End Class
         這裏執行的有參查詢函數ExcuteSelect,對於SQLHelper的理解還有待提高,希望大家多多指正!

最後更新:2017-04-03 12:56:25

  上一篇:go Windws OS 一些概念
  下一篇:go SVN切換分支從舊版本到新版本