注册 登录
编程论坛 ASP.NET技术论坛

关于给存储过程传递参数的问题

fyz520 发布于 2010-07-28 00:27, 924 次点击
新人问题总是很多,麻烦高手们,先谢谢了!

下面是一段调用存储过程的代码,红色部分的代码我已经遇到过好几遍了,知道Parameter对象可以防止SQL注入,实现参数化查询。但我就是不理解Parameter的用法和它到底是运作的,Parameter到底是一个什么样的对象?

困惑:

SqlParameter sex = new SqlParameter("@sex", SqlDbType.VarChar, 5);//定义了一个SqlParameter对象sex,那么@sex是sex的参数?sex.value获取的值是不是就是@sex的值?如果是的话,有三个@sex这样的变量(@sex1,@sex2,@sex3)那sex.value表示的是谁的值?

mycmd.Parameters.Add(sex);//这句话的意思到底是什么哦?
将SqlParameter对象sex添加到command的Parameters集合中?Parameters集合又是啥?添加到Parameters集合中和传递参数有什么关系,其实这个参数到底是怎么传过去的我就是搞不清楚,不理解!执行到这句话的时候存储过程被调用了没有?怎么没有用到mycmd.ExecuteNonQuery();


        SqlConnection mycon = getconnection();
        mycon.Open();
        SqlCommand mycmd = new SqlCommand();
         = CommandType.StoredProcedure;
        mycmd.Connection = getconnection();
         = "get_student";

        
        SqlParameter sex = new SqlParameter("@sex", SqlDbType.VarChar, 5);
        sex.Value = DropDownList1.Text;
        mycmd.Parameters.Add(sex);


        SqlDataAdapter da = new SqlDataAdapter(mycmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        GridView1.DataSource = dt;
        GridView1.DataBind();
3 回复
#2
冰镇柠檬汁儿2010-07-28 09:36
SqlParameter sex = new SqlParameter("@sex", SqlDbType.VarChar, 5)
定义了一个SqlParameter对象sex,而这个对象所对应的是SQL语句或存储过程中的“@sex”变量,至于要个这个变量赋值成什么,是由
sex.Value = DropDownList1.Text;
控制的,这两句也就是在说,我要创建一个SqlParameter对象叫sex,他的值是DropDownList1.Text,而应该去对应SQL语句或存储过程里的"@sex"变量,给这个变量赋值
mycmd.Parameters.Add(sex);
而这句的意思你应该能猜的出来的,SqlCommand对象里有Parameters这个列表,在这个列表里有的SqlParameter对象,才会被传到SQL语句或存储过程里,所以要将你刚才创建的SqlParameter对象用Add方法添加到Parameters列表中。

至于你说的为什么没有mycmd.ExecuteNonQuery();这句
实际上关键点在下面这三句中
SqlDataAdapter da = new SqlDataAdapter(mycmd);
DataTable dt = new DataTable();
da.Fill(dt);
SqlDataAdapter对象da在创建的时候,已经得到了SqlCommand对象了,然后又创建了一个DataTable对象dt
da.Fill(dt);的意思是将da查询出来的记录赋值到dt中,其实在这句中已经执行了数据库访问操作,所以你看不到mycmd.ExecuteNonQuery();

以上的解释尽量用的是大白话,避免用到专业的术语,我想楼主应该能看明白了
#3
fyz5202010-07-28 11:53
谢谢,谢谢你的耐心,
#4
冰镇柠檬汁儿2010-07-28 11:55
不客气,
1