为什么我们使用参数传递值?

时间:2011-10-19 08:58:39

标签: c# sql-server

选项1:使用参数

插入此值
string insertstr = "INSERT INTO table_name(eid, eName, Dept) " + 
                    "VALUES(@eid, @eName, @dept)";

SqlCommand cmd = new SqlCommand(insertstr, con);

cmd.Parameters.Add("@eid", SqlDbType.Int).Value = Convert.ToInt32(textBox1.Text);
cmd.Parameters.Add("@ename", SqlDbType.VarChar, 50).Value = textBox2.Text.ToString();
cmd.Parameters.Add("@dept", SqlDbType.VarChar, 100).Value = textBox3.Text.ToString();

选项2:

SqlCommand cmd = new SqlCommand("INSERT INTO table_name(eid,eName,Dept) values('"+ textBox1.Text +"','"+ textBox2.Text +"','"+ Textbox3.Text +"'", con);
cmd.ExecuteNonQuery();

我见过第一个选项的大部分项目......使用参数传递值的用途是什么?使用参数传递值的任何优点??你的建议PLZ ..

3 个答案:

答案 0 :(得分:8)

您不必关心引用特殊字符。如果您忘记引用SQL注入攻击是可能的。

如果您使用选项2,则会在Textbox3

中输入以下内容
'); DELETE * FROM table_name; --

以下SQL语句已被删除:

INSERT INTO table_name(eid,eName,Dept) values ('value1','value2','');
DELETE * FROM table_name; -- ')

第二个语句删除table_name中的每一行。可以在那里插入任何可能的语句而不是删除语句。

答案 1 :(得分:1)

有几个原因:

  • 您不必担心转义特殊字符(如')以避免SQL错误或SQL注入(如 H-Man2 所述)。
  • 您不必担心将C#类型转换为SQL类型。例如:
    • 如果您的NumberDecimalSeparator等于逗号,并且您想在数据库中插入Double值,则通常需要用点替换逗号。无需担心参数。
    • 无需担心DateTime格式。
    • ...
  • 当SQL查询开始有很长的篇幅时,我发现代码更易读,更易于使用参数进行维护。

答案 2 :(得分:0)

你应该从不使用选项2。

这是非常糟糕的做法,对SQL注入非常开放。

始终坚持选项1.这是迄今为止最好的选择。

在此处阅读有关SQL注入的更多信息: http://en.wikipedia.org/wiki/SQL_injection