SqlParameter引數化查詢
阿新 • • 發佈:2019-02-02
上篇部落格寫了關於重構程式碼用到的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語句為例)、cmdtype和paras,在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
說到底還是封裝的思想,我們將可能輸入有誤的地方以引數的形式固定下來,通過傳參很好的解決了這個問題。