关于SqlParameter的一个小问题?

HSxuguangxing 2009-12-01 01:01:43
传统的查询语句的sql可能为
string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";
很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);
_userid.Value = Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。



对于以上这段话其他我都理解,就是在定义SqlParameter对象时都没指定列名,怎么知道这个条件是对user_id字段进行判断?
...全文
864 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCPTBDTPTP 2012-03-01
  • 打赏
  • 举报
回复
如果我的数据库连接已经封装一个类(SqlHelper) 那SqlParameter该若何使用?例如:
string sql = "select * from station where a=@a";
SqlParameter sq = new SqlParameter();
SqlDataReader dr = SqlHelper.ExecuteReader(CONNECTION_OpenConter, CommandType.Text, sql);这段代码该如何修改?
Moqin89 2011-11-05
  • 打赏
  • 举报
回复
很好!
特别 2009-12-01
  • 打赏
  • 举报
回复
也不能这样讲,
一般习惯是参数名与字段名一致,
好知道谁对应谁

[Quote=引用 17 楼 jaylongli 的回复:]
引用 14 楼 hsxuguangxing 的回复:
难道我理解错了SqlParameter 的意思了?
我的理解是对于select * from users where user_id=@user_id 这个sql语句
我只要向SqlCommand传入 select * from users语句,对于后面的where user_id=@user_id 条件就可以使用SqlParameter 来实现,实现的方式就是
SqlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
但是对于上面的红色部分,如果指定第四个参数“user_id”(就是对应数据库中的列)我就能理解,那他的意思就user_id= @user_id. 但是如果不指定第四个参数  ?? = @user_id,我就想知道??是表示哪个呢!



怪只能怪 书上 把参数名与字段名写成一样了

楼主迷糊了。。。

建议楼主用程序多跑跑。。

这种是最基本的问题。。
[/Quote]
加油馒头 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hsxuguangxing 的回复:]
难道我理解错了SqlParameter 的意思了?
我的理解是对于select * from users where user_id=@user_id 这个sql语句
我只要向SqlCommand传入 select * from users语句,对于后面的where user_id=@user_id 条件就可以使用SqlParameter 来实现,实现的方式就是
SqlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
但是对于上面的红色部分,如果指定第四个参数“user_id”(就是对应数据库中的列)我就能理解,那他的意思就user_id= @user_id. 但是如果不指定第四个参数  ?? = @user_id,我就想知道??是表示哪个呢!
[/Quote]


怪只能怪 书上 把参数名与字段名写成一样了

楼主迷糊了。。。

建议楼主用程序多跑跑。。

这种是最基本的问题。。
HSxuguangxing 2009-12-01
  • 打赏
  • 举报
回复
哦,我明白了~~呵呵~~不好意思,我新手,麻烦各位了~~~
特别 2009-12-01
  • 打赏
  • 举报
回复
老大,已经说的很清楚了,与字段名没关系
你也可以写成这样的
select * from users where user_id=@ABC
SqlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@ABC", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];

就是说,SQL执行是,遇到@ABC,就找你提供的参数中有没有一个叫@ABC的参数,如果有,就用它的值来替换
如果没有,就报错


[Quote=引用 14 楼 hsxuguangxing 的回复:]
难道我理解错了SqlParameter 的意思了?
我的理解是对于select * from users where user_id=@user_id 这个sql语句
我只要向SqlCommand传入 select * from users语句,对于后面的where user_id=@user_id 条件就可以使用SqlParameter 来实现,实现的方式就是
SqlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
但是对于上面的红色部分,如果指定第四个参数“user_id”(就是对应数据库中的列)我就能理解,那他的意思就user_id= @user_id. 但是如果不指定第四个参数  ?? = @user_id,我就想知道??是表示哪个呢!
[/Quote]
HSxuguangxing 2009-12-01
  • 打赏
  • 举报
回复
难道我理解错了SqlParameter 的意思了?
我的理解是对于select * from users where user_id=@user_id 这个sql语句
我只要向SqlCommand传入 select * from users语句,对于后面的where user_id=@user_id 条件就可以使用SqlParameter 来实现,实现的方式就是
SqlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
但是对于上面的红色部分,如果指定第四个参数“user_id”(就是对应数据库中的列)我就能理解,那他的意思就user_id= @user_id. 但是如果不指定第四个参数 ?? = @user_id,我就想知道??是表示哪个呢!
bwangel 2009-12-01
  • 打赏
  • 举报
回复
现在的书啊,真是的
flyerwing 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sdfkfkd 的回复:]
上面的语句楼主显然是通过不了的,不知道楼主测试了没有
对于SQL,你可能需要这样进行
C# codestring sql="select * from users where user_id=@user_id";
qlCommand SqlCmd=new SqlCommand(sql, SqlConn);
SqlParameter _userid=new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value= Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
根据你SQL语句中的参数名称@user_id和SqlParameter的名称来配对
SQL中参数名称必须以@开头
[/Quote]
对!
_autotest 2009-12-01
  • 打赏
  • 举报
回复
select * from users where user_id=@user_id
SqlParameter _userid = new SqlParameter("@user_id", SqlDbType.Int);
这个已经注定了userid 的value值通过=@user_id传进sql里了。

vrhero 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
引用 7 楼 sdfkfkd 的回复:
你这里也没错
不过你这个是适用于OLEDB的
一般用于ACCESS数据库,与SQL的参数不一样

这可不适用于Oracle,仅用于Access,Oracle参数前缀是“:”...
[/Quote]
不好意思...眼花看错了...
vrhero 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sdfkfkd 的回复:]
你这里也没错
不过你这个是适用于OLEDB的
一般用于ACCESS数据库,与SQL的参数不一样
[/Quote]
这可不适用于Oracle,仅用于Access,Oracle参数前缀是“:”...
vrhero 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hsxuguangxing 的回复:]
user_id=@user_id~~~~可是怎么知道是user_id这个字段呢?我还是没有理解!难道不能是其他 SqlDbType.Int类型的字段吗?
[/Quote]
前面的user_id...你不知道是这个字段还写什么程序,改行吧...

后面的user_id...只是个占位符,随便起什么名都行,只要符合SQL标识命名规则...
特别 2009-12-01
  • 打赏
  • 举报
回复
你这里也没错
不过你这个是适用于OLEDB的
一般用于ACCESS数据库,与SQL的参数不一样

[Quote=引用 2 楼 goto_code 的回复:]
打个比方,我的代码
try
                    {
                        string strSQl = @"insert into t_inv(c_name,c_pid) values(?p1,?p2) ";
                        myCmd.CommandText = strSQl;
                        myCmd.Parameters.Clear();
                        myCmd.Parameters.AddWithValue("?p1", pro.strPro);
                        myCmd.Parameters.AddWithValue("?p2", tv_Inv.SelectedNode.Tag);
                        myCmd.CommandType = CommandType.Text;
                        int i = myCmd.ExecuteNonQuery();
                        if (i > 0)
                        {
p1,p2是输入,那么这个顺序对应着c_name,c_pid字段
[/Quote]
特别 2009-12-01
  • 打赏
  • 举报
回复
SQL中,参数与字段无关,只看你这个参数用在哪里,是根据参数名称来配对的
与字段名称无关
当然,你的参数肯定参照具体字段来定义的

[Quote=引用 5 楼 hsxuguangxing 的回复:]
user_id=@user_id~~~~可是怎么知道是user_id这个字段呢?我还是没有理解!难道不能是其他 SqlDbType.Int类型的字段吗?
[/Quote]
HSxuguangxing 2009-12-01
  • 打赏
  • 举报
回复
user_id=@user_id~~~~可是怎么知道是user_id这个字段呢?我还是没有理解!难道不能是其他 SqlDbType.Int类型的字段吗?
vrhero 2009-12-01
  • 打赏
  • 举报
回复
很显然...lz看了一本错误的书...
wangzhkai 2009-12-01
  • 打赏
  • 举报
回复
楼上说的很对啊
goto_code 2009-12-01
  • 打赏
  • 举报
回复
打个比方,我的代码
try
{
string strSQl = @"insert into t_inv(c_name,c_pid) values(?p1,?p2) ";
myCmd.CommandText = strSQl;
myCmd.Parameters.Clear();
myCmd.Parameters.AddWithValue("?p1", pro.strPro);
myCmd.Parameters.AddWithValue("?p2", tv_Inv.SelectedNode.Tag);
myCmd.CommandType = CommandType.Text;
int i = myCmd.ExecuteNonQuery();
if (i > 0)
{
p1,p2是输入,那么这个顺序对应着c_name,c_pid字段
特别 2009-12-01
  • 打赏
  • 举报
回复
上面的语句楼主显然是通过不了的,不知道楼主测试了没有
对于SQL,你可能需要这样进行

string sql="select * from users where user_id=@user_id";
qlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter("@user_id", SqlDbType.Int);
_userid.Value = Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);

根据你SQL语句中的参数名称@user_id和SqlParameter的名称来配对
SQL中参数名称必须以@开头

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧