在做機房收費系統項目,編寫資料連線並訪問資料庫時,見別人都用了帶“@”字元的SQL語句,就很好奇為什麼都用這個語句呢?直接拼字SQL語句不是更加方便嗎?帶著這個問題上網查資料,才知道原來他們用的是參數化SQL,那麼為什麼要用參數化SQL?什麼是參數化SQL呢?
在做第一次機房收費系統的時候,大部分的應該都是使用直接拼SQL語句的方法,那時候就聽前輩們有說到SQL注入,那時候也不要求瞭解,只需要知道就行。
1.直接拼SQL:
就像大家在做第一次機房收費系統的時候所瞭解到的一樣,直接拼字SQL很容易帶來SQL注入攻擊,但是因為直接拼字不用添加SqlParameter,所以會減少很少的代碼。因此,這種方法也會把你直接編寫的命令直接發到資料服務器上直接執行。
2.參數化SQL:
所謂的“參數化SQL”就是在應用程式設定SqlCommand.CommandText的時候使用參數(如:param1),然後通過SqlCommand.Parameters.Add來設定這些參數的值。這種做法會把你準備好的命令通過sp_executesql系統預存程序來執行,使用參數化,最直接的好處就是防止SQL注入。也就是說使用這種方法,主要是為了保證資料庫的安全。
參數化SQL原理:
在使用參數化查詢的情況下,資料服務器不會將參數的內容視為SQL指令的一部分來處理,而是在資料庫完成SQL指令之後,才套用參數執行,因此就算參數中含有有損的指令,也不會被資料庫執行。
下面只是自己在做機房收費系統項目的時候,用到參數化查詢的一個小例子:
Public Class SqlStuBasicInfo : Implements IStuBasicInfo Dim strConnstr As String = System.Configuration.ConfigurationSettings.AppSettings("connstr") '通過反射擷取資料連線 Dim conn As SqlConnection = New SqlConnection(strConnstr) '執行個體化Connection對象 ''' <summary> ''' 判斷卡號是否存在 ''' </summary> ''' <param name="Icard"></param> ''' <returns>返回實體層</returns> ''' <remarks></remarks> Public Function CheckcardNO(Icard As StuBasicInfo) As Enity.StuBasicInfo Implements IStuBasicInfo.CheckcardNO Dim sql As String = "select * from T_STUBASICINFO Where CardNo=@CardNo" Dim params As SqlParameter() params = {New SqlParameter("CardNo", Icard.CardNo)} Dim cmd As SqlCommand = New SqlCommand(sql, conn) cmd.Parameters.AddRange(params) Dim reader As SqlDataReader Try conn.Open() reader = cmd.ExecuteReader reader.Read() Icard.CardNo = Trim(reader.Item("CardNo")) Return Icard Catch ex As Exception Icard.CardNo = "" Return Icard End Try End Function
以前,對學習新的知識總是帶有一種恐懼感,總覺得自己不能把它們弄明白。看到別人在做項目的時候,用到了很多自己不會的知識,就覺得很有壓力,其實換一種心態去想,這正是給你提供了一個提升自我的機會,誰不是從不會走過來的!