参数化查询  

  •  使用参数化查询的情景有很多,但最常用的情景是需要用户在查询中进行输入的情况。 

  有两种方法可供使用。第一,可以讲用户输入嵌入到查询字符串中,例如可能使用.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 参数化查询的更多相关文章

  1. SQL Server 2008 R2——VC++ ADO 操作 参数化查询

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  2. 关于ADO.NET参数化查询的提问

    最近我们的正式环境一直在报错一个异常,首先我贴出来异常信息 BLL层 捕获到了请求的url Net.BLL.MobileFun MobileFun.GetBusinessBidPolicy 异常 传入 ...

  3. ADO.net参数化查询陷阱

    避免SQL漏洞注入攻击,往往采用的是参数化查询!然而在使用参数化查询中,往往为了方便就直接通过构造方法来进行数据的初始化了,然而这样就引发一个这样的问题,当参数值为0时,就出现参数为空的情况了. 一. ...

  4. C# SqlServer Ado.net参数化查询插入null数据

    DateTime? dt=null; if (dt.HasValue) { cmd.Parameters.AddWithValue("@CreateDateTime", dt); ...

  5. 第19课-数据库开发及ado.net ADO.NET--SQLDataReader使用.SqlProFiler演示.ADoNET连接池,参数化查询.SQLHelper .通过App.Config文件获得连接字符串

    第19课-数据库开发及ado.net ADO.NET--SQLDataReader使用.SqlProFiler演示.ADoNET连接池,参数化查询.SQLHelper .通过App.Config文件获 ...

  6. ADO学习笔记之注入漏洞与参数化查询

    ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...

  7. (ADO.NET)SqlCommand参数化查询

    string strcon = "Persist Security Info=False;User id=sa;pwd=lovemary;database=student;server=(l ...

  8. SQL参数化查询

    参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) ...

  9. SQL参数化查询自动生成SqlParameter列表

    string sql = @"INSERT INTO stu VALUES (@id,@name) "; 参数化查询是经常用到的,它可以有效防止SQL注入.但是需要手动去匹配参数@ ...

随机推荐

  1. Struts2学习笔记⑦

    今天我宛若一个智障- Struts2学的差不多了,今天开始做数据库CURD操作的案例,发现模型驱动一直报NullPointerException异常-.我的妈,我查了半天觉得没啥问题,把关注点放在了g ...

  2. Android:百度地图 + 百度导航

    地图SDK 开发指南:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction 导航SDK开发指南:http://lb ...

  3. 微信企业号接收消息(使用SpringMVC)

    微信企业号接收消息(使用SpringMVC) 微信企业号接收消息(使用SpringMVC) 将应用设置在回调模式时,企业可以通过回调URL接收员工回复的消息,以及员工关注.点击菜单.上报地理位置等事件 ...

  4. linux codeblocks汉化

    参考window汉化codeblocks,linux下有点麻烦,就是要找到codeblocks的文件安装在哪里.一般来说,linux下安装的软件大都在/usr/share/文件夹下,所以进入/usr/ ...

  5. POJ 2182 解题报告

    Lost Cows Time Limit: 1000 MS Memory Limit: 65536 KB Description N (2 <= N <= 8,000) cows have ...

  6. iOS网络编程笔记——社交网络编程

    社交网络编程主要使用iOS提供的social框架,目前social框架主要分为两个类: (1)SLComposeViewController提供撰写社交信息(如微博信息)的视图控制器,由iOS系统提供 ...

  7. SignalR指定用户推送消息

    一.首先,在MVC项目中安装SingalR包(SingalR2.0需要.net4.5以上,VS2010可以安装1.1.3版本,本例为VS2010+SignalR1.1.3). 打开工具-NuGet程序 ...

  8. 联想A7600-m刷机心得

    先来说说刷机 联想A7600-m的刷机

  9. CSS3 transition 浏览器兼容性

    1.兼容性 根据canius(http://caniuse.com/#search=transition),transition 兼容性如下图所示: <!DOCTYPE html> < ...

  10. Sublime 常用快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...