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语句为例)、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
说到底还是封装的思想,我们将可能输入有误的地方以参数的形式固定下来,通过传参很好的解决了这个问题。
SqlParameter参数化查询的更多相关文章
- SQL参数化查询自动生成SqlParameter列表
string sql = @"INSERT INTO stu VALUES (@id,@name) "; 参数化查询是经常用到的,它可以有效防止SQL注入.但是需要手动去匹配参数@ ...
- Sql Server参数化查询之where in和like实现详解
where in 的参数化查询实现 首先说一下我们常用的办法,直接拼SQL实现,一般情况下都能满足需要 string userIds = "1,2,3,4"; using (Sql ...
- 【转】浅析Sql Server参数化查询
转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/21/2460978.html 错误认识1.不需要防止sql注入的地方无需参数化 参数化查询就 ...
- 【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参
转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和li ...
- 【转】Sql Server参数化查询之where in和like实现详解
转载至:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARINDE ...
- SQL 参数化查询 应用于 Like
在sql 进行参数化查询的时候,使用like 语句和参数的时候,错误的写法: Participant like '%@Participant%' ,这样在数据库为解析为 '%'participant ...
- 023. Asp.net参数化查询预防Sql注入攻击
/// <summary> /// 参数化查询预防SQL注入式攻击 /// </summary> public int checkLogin(string loginName, ...
- 关于ADO.NET参数化查询的提问
最近我们的正式环境一直在报错一个异常,首先我贴出来异常信息 BLL层 捕获到了请求的url Net.BLL.MobileFun MobileFun.GetBusinessBidPolicy 异常 传入 ...
- ADO.net参数化查询陷阱
避免SQL漏洞注入攻击,往往采用的是参数化查询!然而在使用参数化查询中,往往为了方便就直接通过构造方法来进行数据的初始化了,然而这样就引发一个这样的问题,当参数值为0时,就出现参数为空的情况了. 一. ...
随机推荐
- 直播服务器Nginx
Mac直播服务器Nginx配置对HLS的支持 在上一篇中Mac上搭建直播服务器Nginx+rtmp,我们已经搭建了nginx+rtmp直播服务器.下面需要对Nginx服务器增加对HLS的支持.在Ngi ...
- POJ-1003&1004
这两题比较简单,就不做分析了,描述下题目,就上代码吧. [题目描述] 1003,其实就是求这个方程的最小n:1/2 + 1/3 + 1/4 + ... + 1/(n + 1) >= c: 100 ...
- Linux编程---I/O部分
非常多函数都能够在网上找到,也比較基础,所以原型仅仅给出了函数名.详细用到再man吧. 输入输出是个非常重要的一块内容.差点儿网络相关的东西基本都是靠底层IO调用来实现的. 好吧.还是先踏踏实实的介绍 ...
- 十:Java之泛型
[定义] 一.泛型的定义主要有下面两种: 在程序编码中一些包括类型參数的类型,也就是说泛型的參数仅仅能够代表类.不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包括參数的类.其參数能够代表 ...
- HTTP 教程 转自 http://www.w3cschool.cc/http/http-tutorial.html
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/IP通信 ...
- 二维码类库--phpqrcode使用简介
#载入类文件 include 'phpqrcode.php'; $value = '二维码内容'; $errorCorrectionLevel = 'L';//容错级别 L.M.Q.H $matrix ...
- PyQt中如何结合Qt设计师进行开发
t设计师是Qt的所见即所得的界面设计工具,通过拖拉方式设计界面,但它并不能产生任何代码. Qt设计师使用.ui后缀的XML文件来存储界面内容.通过pyuic4命令可以编译成.py文件,.py文件的内容 ...
- mul8_unsigned multipliter
李亚民老师更注重硬件设计思想的训练.他给出的硬件设计方法更贴近底层硬件,下面看看他的设计思想: ...
- poj2676解题报告
题意:有一个9*9的格子 分成了9个3*3的小子格,一些位置上的已有一些数字..现在要求你把没有数字的位置填上数,要求这个数没有出现在这个位置所在的行.列以及所在的子格 分析: 那么我们对于所有的未填 ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...