SqlParameter参数化查询

52 篇文章 1 订阅

SqlParameter参数化查询

  2999人阅读  评论(27)  收藏  举报
  分类:

     上篇博客写了关于重构代码用到的SQLHelper类,这个类包括四种函数,根据是否含参和是否有返回值各分两种。在这里写写传参过程用到的SqlParameter

     如果我们使用如下拼接sql字符串的方式进行数据库操作存在脚本注入的危险:

 

[vb]  view plain  copy
 print ?
  1. 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增删改语句或存储过程的函数如下:

[vb]  view plain  copy
 print ?
  1. ''' <summary>  
  2.    ''' 执行带参数的sql增删改语句或存储过程  
  3.    ''' </summary>  
  4.    ''' <param name="cmdtext">增删改语句或存储过程</param>  
  5.    ''' <param name="cmdtype">命令类型文本或存储过程</param>  
  6.    ''' <param name="paras">参数数组</param>  
  7.    ''' <returns>受影响的行数</returns>  
  8.    ''' <remarks></remarks>  
  9.    Public Function ExecuteNonQueryCan(ByVal cmdtext As StringByVal cmdtype As CommandType, ByVal paras As SqlParameter()) As Integer  
  10.        Dim conn = GetConn()  
  11.        Dim cmd As SqlCommand = New SqlCommand(cmdtext, conn)  
  12.        Dim res As Integer  
  13.        cmd.CommandType = cmdtype  
  14.        cmd.Parameters.AddRange(paras)  
  15.        Try  
  16.            res = cmd.ExecuteNonQuery()  
  17.        Catch ex As Exception  
  18.            MsgBox(ex.Message, , "数据库操作")  
  19.        Finally  
  20.            If conn.State = ConnectionState.Open Then  
  21.                conn.Close()  
  22.            End If  
  23.        End Try  
  24.        Return res  
  25.   
  26.    End Function  

    在这里定义了cmdtext(以sql语句为例)、cmdtypeparas,在DAL层调用sqlhelper时,只需传入相应的参数即可。其中,paras参数部分构成如下:

[vb]  view plain  copy
 print ?
  1. ''' <summary>  
  2.    ''' 定义一个函数在用户输入用户名密码正确并登录时将登录信息记录到T_Login正在值班教师表中  
  3.    ''' </summary>  
  4.    ''' <param name="Enlogin">T_Login表所对应的实体</param>  
  5.    ''' <returns></returns>  
  6.    ''' <remarks></remarks>  
  7.    Public Function InsertIntoTLogin(ByVal Enlogin As Entity.EnLogin) As Boolean  
  8.   
  9.        Enlogin.user_computer = System.Environment.MachineName  
  10.        Enlogin.user_loginDate = DateString  
  11.        Enlogin.user_loginTime = TimeOfDay  
  12.   
  13.        Dim sql As String = "insert into T_Login(userID,loginDate,loginTime,computer)values(@userID,@loginDate,@loginTime,@computer)"  
  14.        Dim paras As SqlParameter() = {New SqlParameter("@userID", Enlogin.user_userID),  
  15.                                       New SqlParameter("@loginDate", Enlogin.user_loginDate),  
  16.                                       New SqlParameter("@loginTime", Enlogin.user_loginTime),  
  17.                                       New SqlParameter("@computer", Enlogin.user_computer)}  
  18.   
  19.        Dim sh As SQLHelper = New SQLHelper  
  20.        If sh.ExecuteNonQueryCan(sql, CommandType.Text, paras) > 0 Then  
  21.            Return True  
  22.        Else  
  23.            Return False  
  24.        End If  
  25.   
  26.    End Function  

   说到底还是封装的思想,我们将可能输入有误的地方以参数的形式固定下来,通过传参很好的解决了这个问题。

3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值