参数化SQL小认识

    在做机房收费系统项目,编写数据连接并访问数据库时,见别人都用了带“@”字符的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


       以前,对学习新的知识总是带有一种恐惧感,总觉得自己不能把它们弄明白。看到别人在做项目的时候,用到了很多自己不会的知识,就觉得很有压力,其实换一种心态去想,这正是给你提供了一个提升自我的机会,谁不是从不会走过来的!

 

原文地址:https://www.cnblogs.com/dyllove98/p/3220223.html