ADO.NET 参数化查询
参数化查询
使用参数化查询的情景有很多,但最常用的情景是需要用户在查询中进行输入的情况。
有两种方法可供使用。第一,可以讲用户输入嵌入到查询字符串中,例如可能使用.NET Framework中的String.Format函数。
第二种方法是构造一种参数化查询。
在开始时执行如下所示的基本查询:
select count(*) from UserInfo
where UserName=‘{}’ and PassWord=‘{}’
然后利用用户的输入构造如下查询:
1 select count(*) from UserInfo
2
3
4 where UserName=‘myUserName’ and PassWord=‘myPassWord’’
如果对正在执行的查询有一些了解,输入如下内容:NonUser' or 1=1 --,那么代码就会执行如下查询。
1 select count(*) from UserInfo
2
3
4 where UserName=‘NonUser' or 1=1 --" and PassWord=‘myPassWord’’
双连字符在SQL Server的查询语法中特别重要。它表示:该行后面的内容是注释。换句话说,and PassWord=‘myPassWord’被忽略了。
现在,UserName=‘NonUser'并不成立,但where子句的另一半(1=1)对于所有行均成立。因此,该查询将成功执行。
使用参数化查询。
代码示例:
SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
connstr.DataSource = "ZHANG-PC";
connstr.InitialCatalog = "sq";
connstr.IntegratedSecurity = true;
using (SqlConnection conn = new SqlConnection(connstr.ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select count(*) from UserInfo where UserName=@username and PassWord=@password";
cmd.Parameters.AddWithValue("@username","zyb12345");
cmd.Parameters.AddWithValue("@password","");
cmd.Connection = conn;
SqlDataReader read = cmd.ExecuteReader();
while (read.Read())
{
Console.WriteLine("userName:{0}", read.GetString());
}
conn.Close();
}
在ADO.NET中执行一个参数化查询,需要向Command对象的Parameters集合中添加Parameters对象。生成Parameters最简单的方法是:
调用SqlCommand对象的Parameters集合的AddWithValue函数。
SqlCommand的Parameters集合中的AddWithValue方法。
cmd.Parameters.AddWithValue("@username","zyb12345");
cmd.Parameters.AddWithValue("@password","");
或者
SqlParameter[] p = new SqlParameter[];
p[].ParameterName = "@username";
p[].Value = "zyb12345";
p[].ParameterName = "@password";
p[].Value = "";
cmd.Parameters.AddRange(p);
SqlDataReader read = cmd.ExecuteReader();
参数数据类型
可以设置SqlParameters对象的SqlDbType属性,以控制在向SQL Server数据库中传递参数信息时所使用的数据类型,即SqlDbType枚举中的值。
SqlDbType的枚举值有:Int,DateTime,Bit,Money,Image,NVarChar等,在下面的示例中,NVarChar对应的是.NET中的string类型。size(即15)代表字符串的长度,可根据需要设置size的值。
SqlParameter p;
p = new qlParameter("@username",SqlDbType.NVarChar,1);
p.Value = "zyb12345";
参数方向
在本例中Sqlparameters是输入参数,有时需要输出参数,这时就要设置SqlParameter的参数方向了。此时不需要设置Value属性。代码如下:
SqlParameter w;
w = cmd.Parameters.Add("@username", SqlDbType.NVarChar);
w.Direction = ParameterDirection.Output; //设置参数方向
cmd.ExecuteNonQuery(); //执行语句
Console.Write(w.Value); //获取输出值(执行完数据查询后才能获取Value值)
ADO.NET 参数化查询的更多相关文章
- SQL Server 2008 R2——VC++ ADO 操作 参数化查询
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 关于ADO.NET参数化查询的提问
最近我们的正式环境一直在报错一个异常,首先我贴出来异常信息 BLL层 捕获到了请求的url Net.BLL.MobileFun MobileFun.GetBusinessBidPolicy 异常 传入 ...
- ADO.net参数化查询陷阱
避免SQL漏洞注入攻击,往往采用的是参数化查询!然而在使用参数化查询中,往往为了方便就直接通过构造方法来进行数据的初始化了,然而这样就引发一个这样的问题,当参数值为0时,就出现参数为空的情况了. 一. ...
- C# SqlServer Ado.net参数化查询插入null数据
DateTime? dt=null; if (dt.HasValue) { cmd.Parameters.AddWithValue("@CreateDateTime", dt); ...
- 第19课-数据库开发及ado.net ADO.NET--SQLDataReader使用.SqlProFiler演示.ADoNET连接池,参数化查询.SQLHelper .通过App.Config文件获得连接字符串
第19课-数据库开发及ado.net ADO.NET--SQLDataReader使用.SqlProFiler演示.ADoNET连接池,参数化查询.SQLHelper .通过App.Config文件获 ...
- ADO学习笔记之注入漏洞与参数化查询
ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...
- (ADO.NET)SqlCommand参数化查询
string strcon = "Persist Security Info=False;User id=sa;pwd=lovemary;database=student;server=(l ...
- SQL参数化查询
参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) ...
- SQL参数化查询自动生成SqlParameter列表
string sql = @"INSERT INTO stu VALUES (@id,@name) "; 参数化查询是经常用到的,它可以有效防止SQL注入.但是需要手动去匹配参数@ ...
随机推荐
- Java面试10|数据库相关
1.ID分配单点问题 系统使用一张表的自增来得到订单号,所有的订单生成必须先在这里insert一条数据,得到订单号.分库后,库的数量变多,相应的故障次数变多,但由于单点的存在,故障影响范围并未相应的减 ...
- Remove Element leetcode
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- java配置文件的读写
最近在做一个爬虫项目时,用到了读写配置文件的方法,记录下来以后可能用的到. Properties pro = new Properties(); boolean IsFirst = true; //从 ...
- iOS项目之同时点击多个按钮解决方案
自己的项目完成后,在测试中出现了一个情况,同时点击界面中的多个按钮,会跳转多个界面.然后又看了看别的app,发现也有这样的情况, 如图 上面是我手机上美团app的截图,上面的分类同时选择多个时,只能跳 ...
- hdoj 1175 (bfs)
题意: 判断两点之间是否可以通过至多有两次转变方向以达到相连,就是平时玩的连连看游戏,但是不能从外面绕过去. 思路:bfs,给每个加入的队列的点添加转变方向次数turn和点当前要走的方向dir属性,起 ...
- Hibernate写配置文件无提示信息解决
把Hibernate的相关jar包引入工程后,在配置hibernate.cfg.xml时没有提示信息,对于开发人员来说,那么多标签,标签有那么多属性,全部都记住显然是不可能的,遇到这种情况是很头疼的事 ...
- [原创]HBase学习笔记(4)- 数据导入
需要分别从Oracle和文本文件往HBase中导入数据,这里介绍几种数据导入方案. 1.使用importTSV导入HBase importTSV支持增量导入.新数据插入,已存在数据则修改. 1.1.首 ...
- [.net 面向对象程序设计深入](8)认识.NET Core
[.net 面向对象程序设计深入](8)认识.NET Core 1,概述 .NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨平台.开源”却是其痛点,从16年开 ...
- 区分 点操作符+属性名 和 getAttribute()
在用DOM操作控制HTML时,很多初学者会把 点操作符+属性名 与getAttribute("属性名") 混淆,误以为这两种方法是等价的. 实际上, 通过getAttribute( ...
- Meta http-equiv属性详解
http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...