第六课 向命令中添加参数(翻译)

本文档由李欣蔚(nirvana_li)翻译自http://www.csharp-station.com/,转载请注名出处!
更新日期2006-2-14

Lesson 06: Adding Parameters to Commands

6:向命令中添加参数

这节课介绍了如何在命令中使用参数,下面是本节课的目标:

  • 了解parameter参数是什么
  • 理解使用parameter的好处
  • 学习如何创建parameter
  • 学习如何将parameter赋值给命令

介绍

当操作数据的时候,你通常需要基于某些标准来过滤结果.通常,这些都由从用户处得到的输入和使用输入构成的SQL查询语句实现的.比如,一个商人需要查看在特定的日期之间的所有订单.另外的查询可能通过城市来过滤用户.

正如你所知道的,SQL查询语句赋值给一个SqlCommand对象只是一个简单的字符串.所以你可能想要过滤一个查询,可以动态的绑定字符串,但是你本来不想这样做,下面是一个过滤查询的坏的示例:

      

  //  don't ever do this!

        SqlCommand cmd 
=   new  SqlCommand(

               
" select * from Customers where city = ' "   +  inputCity  +   " ' " ;

千万不要以这种方式创建查询!输入变量inputCity通常都是从一个Windows Form上或者Web页面上的TextBox控件得到输入.任何在TextBox控件中的东西将直接存入inputCity并添加到你的SQL字符串中.黑客可以使用恶意的代码来替换这串字符串,更糟糕的是,他能够进而控制你的计算机.

作为对上面糟糕的例子使用动态创建字符串的替代,使用parameters。任何放置在parameter中的东西都将被作为字段数据对待,而不是SQL语句的一部分,这样就让你的应用程序更加安全。

使用参数化查询是下面三步过程:

1.           使用parameters构建SqlCommand命令字符串

2.           声明SqlParameter对象,将适当的值赋给它

3.           SqlParameter对象赋值给SqlCommand对象的Parameters属性

下面的章节将一步一步介绍这个过程

Parameters准备SqlCommand对象

SQL查询中使用Parameters的第一步是创建包含参数占位符的对象字符串。这些占位符在SqlCommand执行的时候填充实际的参数值。Parameter的正确的语法是使用一个’@’符号作为参数名的前缀,如下所示:

        // 1. declare command object with parameter

        SqlCommand cmd = new SqlCommand(

               "select * from Customers where city = @City", conn);

在上面的SqlCommand构造函数中,第一个参数包含一个参数声明,@City。这个例子使用一个参数,但是你能够根据需要为查询定制需要的参数。每一个参数匹配一个SqlParameter对象,它必须被分配给此SqlCommand对象

Declaring a SqlParameter Object

声明一个SqlParameter对象

SQL语句中的每一个参数必须被定义。这是SqlParameter类型的需要。你的代码必须为每一个在SqlCommand对象的SQL命令中的参数定义一个SqlParameter实体。下面的代码为前面一节中的@City参数定义了参数。

        // 2. define parameters used in command object

        SqlParameter param  = new SqlParameter();

        param.ParameterName = "@City";

        param.Value         = inputCity;

注意SqlParameter实体的ParameterName属性必须和SqlCommand SQL命令字符串中的使用的参数一致。你必须同样为此值赋值。当SqlCommand对象执行的时候,此参数将被被它的值替换

SqlParameter对象和SqlCommand对象关联

对于每一个定义在SqlCommand对象中的SQL命令字符串参数,你必须定义一个SqlParameter。你必须同样将SqlParameter实体赋值给SqlComamd对象的Parameters属性的方式让SqlCommand对象知道SqlParameter。下面的代码展示了如何做:

        // 3. add new parameter to command object

        cmd.Parameters.Add(param);

SqlParameter实体是作为SqlCommand对象的Parameters属性的Add方法中的参数的。你必须为每一个定义在SqlCommand对象的SQL命令字符串中的参数添加一个单独的SqlParameter

组合

 

你已经知道了如何使用SqlCommandSqlDataReader对象。下面的代码说明了一个使用SqlParameter对象的可运行程序。这样,现在对每一件事情都很熟悉了,除了这篇文章中新的部分:

Listing 1: Adding Parameters to Queries

using  System;

using  System.Data;

using  System.Data.SqlClient;

 

class  ParamDemo

{

        
static void Main()

        
{

               
// conn and reader declared outside try

               
// block for visibility in finally block

               SqlConnection conn   
= null;

               SqlDataReader reader 
= null;

 

               
string inputCity = "London";

               
try

               
{

                       
// instantiate and open connection

                       conn 
=  new

                               SqlConnection(
"Server=(local);DataBase=Northwind;Integrated Security=SSPI");

                       conn.Open();

 

                       
// don't ever do this!

//                     SqlCommand cmd = new SqlCommand(

//                             "select * from Customers where city = '" + inputCity + "'";

 

                       
// 1. declare command object with parameter

                       SqlCommand cmd 
= new SqlCommand(

                               
"select * from Customers where city = @City", conn);

 

                       
// 2. define parameters used in command object

                       SqlParameter param  
= new SqlParameter();

                       param.ParameterName 
= "@City";

                       param.Value         
= inputCity;

 

                       
// 3. add new parameter to command object

                       cmd.Parameters.Add(param);

 

                       
// get data stream

                       reader 
= cmd.ExecuteReader();

 

                       
// write each record

                       
while(reader.Read())

                       
{

                               Console.WriteLine(
"{0}, {1}",

                                      reader[
"CompanyName"],

                                      reader[
"ContactName"]);

                       }


               }


               
finally

               
{

                       
// close reader

                       
if (reader != null)

                       
{

                               reader.Close();

                       }


 

                       
// close connection

                       
if (conn != null)

                       
{

                               conn.Close();

                       }


               }


        }


}


Listing1中的代码简单的取出每一个在伦敦生活的顾客的名字。使用parameters让它更加安全。除了使用parameters,其它所有代码包含的技术都是我们在前面课中学习过的。

总结

你应该使用parameters以一种安全的方式过滤查询。使用parameter的过程包含下面三个步骤:在SqlCommand命令字符串中定义parameter,使用适当的属性声明SqlParameter对象,并将SqlParameter对象赋值给SqlCommand对象。当SqlCommand执行的时候,parameters将被SqlParameter对象中的值替换

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值