1. 程式人生 > >SqlParameter引數化查詢

SqlParameter引數化查詢

     上篇部落格寫了關於重構程式碼用到的SQLHelper類,這個類包括四種函式,根據是否含參和是否有返回值各分兩種。在這裡寫寫傳參過程用到的SqlParameter

     如果我們使用如下拼接sql字串的方式進行資料庫操作存在指令碼注入的危險:

        Dim sql As String = "insert into T_Loginlog(userID,loginDate,loginTime,computer)values('" + Enloginlog.user_userID + "','" & Enloginlog.user_loginDate & "','" & Enloginlog.user_loginTime & "','" & Enloginlog.user_computer & "')"

為了防止SQL注入,我們採用引數化查詢的方式。執行帶引數的sql增刪改語句或儲存過程的函式如下:

 ''' <summary>
    ''' 執行帶引數的sql增刪改語句或儲存過程
    ''' </summary>
    ''' <param name="cmdtext">增刪改語句或儲存過程</param>
    ''' <param name="cmdtype">命令型別文字或儲存過程</param>
    ''' <param name="paras">引數陣列</param>
    ''' <returns>受影響的行數</returns>
    ''' <remarks></remarks>
    Public Function ExecuteNonQueryCan(ByVal cmdtext As String, ByVal cmdtype As CommandType, ByVal paras As SqlParameter()) As Integer
        Dim conn = GetConn()
        Dim cmd As SqlCommand = New SqlCommand(cmdtext, conn)
        Dim res As Integer
        cmd.CommandType = cmdtype
        cmd.Parameters.AddRange(paras)
        Try
            res = cmd.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.Message, , "資料庫操作")
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try
        Return res

    End Function

    在這裡定義了cmdtext(以sql語句為例)、cmdtypeparas,在DAL層呼叫sqlhelper時,只需傳入相應的引數即可。其中,paras引數部分構成如下:

 ''' <summary>
    ''' 定義一個函式在使用者輸入使用者名稱密碼正確並登入時將登入資訊記錄到T_Login正在值班教師表中
    ''' </summary>
    ''' <param name="Enlogin">T_Login表所對應的實體</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function InsertIntoTLogin(ByVal Enlogin As Entity.EnLogin) As Boolean

        Enlogin.user_computer = System.Environment.MachineName
        Enlogin.user_loginDate = DateString
        Enlogin.user_loginTime = TimeOfDay

        Dim sql As String = "insert into T_Login(userID,loginDate,loginTime,computer)values(@userID,@loginDate,@loginTime,@computer)"
        Dim paras As SqlParameter() = {New SqlParameter("@userID", Enlogin.user_userID),
                                       New SqlParameter("@loginDate", Enlogin.user_loginDate),
                                       New SqlParameter("@loginTime", Enlogin.user_loginTime),
                                       New SqlParameter("@computer", Enlogin.user_computer)}

        Dim sh As SQLHelper = New SQLHelper
        If sh.ExecuteNonQueryCan(sql, CommandType.Text, paras) > 0 Then
            Return True
        Else
            Return False
        End If

    End Function

   說到底還是封裝的思想,我們將可能輸入有誤的地方以引數的形式固定下來,通過傳參很好的解決了這個問題。