zoukankan      html  css  js  c++  java
  • ADO.NET 参数化查询

       

     参数化查询  

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

      有两种方法可供使用。第一,可以讲用户输入嵌入到查询字符串中,例如可能使用.NET Framework中的String.Format函数。  

      第二种方法是构造一种参数化查询。 

           在开始时执行如下所示的基本查询: 

      

    1        select count(*) from UserInfo
    2   
    3 
    4      where UserName=‘{0}’ and PassWord=‘{1}’

       

           然后利用用户的输入构造如下查询:

    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)对于所有行均成立。因此,该查询将成功执行。

    •      使用参数化查询。 

        代码示例:

     1        SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
     2 
     3             connstr.DataSource = "ZHANG-PC";
     4 
     5             connstr.InitialCatalog = "sq";
     6 
     7             connstr.IntegratedSecurity = true;
     8 
     9             using (SqlConnection conn = new SqlConnection(connstr.ConnectionString))
    10             {
    11 
    12                 conn.Open();
    13 
    14                 SqlCommand cmd = new SqlCommand();
    15 
    16                 cmd.CommandText = "select count(*) from UserInfo where UserName=@username and PassWord=@password";
    17 
    18                 cmd.Parameters.AddWithValue("@username","zyb12345");
    19 
    20                 cmd.Parameters.AddWithValue("@password","654321");
    21 
    22                 cmd.Connection = conn;
    23 
    24                 SqlDataReader read = cmd.ExecuteReader();
    25 
    26                 while (read.Read())
    27                 {
    28 
    29                     Console.WriteLine("userName:{0}", read.GetString(0));
    30 
    31                 }
    32 
    33                 conn.Close();
    34 
    35             }

       

           在ADO.NET中执行一个参数化查询,需要向Command对象的Parameters集合中添加Parameters对象。生成Parameters最简单的方法是:

      

             调用SqlCommand对象的Parameters集合的AddWithValue函数。

    1      SqlCommand的Parameters集合中的AddWithValue方法。
    2 
    3       cmd.Parameters.AddWithValue("@username","zyb12345");
    4 
    5       cmd.Parameters.AddWithValue("@password","654321");

      

      或者

       

     1                 SqlParameter[] p = new SqlParameter[2];
     2                  
     3                 p[0].ParameterName = "@username";
     4 
     5                 p[0].Value = "zyb12345";
     6 
     7                 p[1].ParameterName = "@password";
     8 
     9                 p[1].Value = "654321";
    10 
    11                 cmd.Parameters.AddRange(p);
    12 
    13                 SqlDataReader read = cmd.ExecuteReader();        
    •        参数数据类型

       可以设置SqlParameters对象的SqlDbType属性,以控制在向SQL Server数据库中传递参数信息时所使用的数据类型,即SqlDbType枚举中的值。

           SqlDbType的枚举值有:Int,DateTime,Bit,Money,Image,NVarChar等,在下面的示例中,NVarChar对应的是.NET中的string类型。size(即15)代表字符串的长度,可根据需要设置size的值。       

    1                 SqlParameter p;
    2 p = new qlParameter("@username",SqlDbType.NVarChar,15);
    3 p.Value = "zyb12345";
    •        参数方向

            在本例中Sqlparameters是输入参数,有时需要输出参数,这时就要设置SqlParameter的参数方向了。此时不需要设置Value属性。代码如下:

    1                 SqlParameter w;
    2 
    3                 w = cmd.Parameters.Add("@username", SqlDbType.NVarChar);
    4 
    5                 w.Direction = ParameterDirection.Output;                         //设置参数方向
    6 
    7                 cmd.ExecuteNonQuery();                                           //执行语句
    8 
    9                 Console.Write(w.Value);                             //获取输出值(执行完数据查询后才能获取Value值)

        

        

        

        

  • 相关阅读:
    面试总结进程、线程与多线程
    精妙算法收集一道有趣的腾讯笔试加分题
    反汇编分析寄存器状态
    远程桌面快捷键
    Js中 关于top、clientTop、scrollTop、offsetTop的用法
    JavaScript获取CSS属性
    oracle开启日志归档 (成功)
    eclipse插件开发帮助文档地址
    alter system修改oracle参数
    oracle分析统计表
  • 原文地址:https://www.cnblogs.com/zhangyuanbo12358/p/3959924.html
Copyright © 2011-2022 走看看