INSERT
没有参数的值是完全可以理解的,为什么不允许这样做,例如想防止sql注入。但是我不明白为什么它仍然是一个很大的没有做以下事情:
cmd.CommandText = "SELECT * FROM [Students]
WHERE StudentID = " + studentID + ";";
int getID = (int)cmd.ExecuteScalar();
仅仅SELECT
时,它的危害是什么?我不太了解以下参数的要点。我没有质疑它,我只是想知道为什么参数是必要的,以及我可以从上面的代码得到什么后果而不是使用下面的选项。
var pStudentID = new SqlParameter("@studentID", SqlDbType.Int);
pStudentID.Value = studentID;
cmd.Parameters.Add(pStudentID);
答案 0 :(得分:3)
使用参数有两个原因。
Sql Injection - 你的第一个例子很容易受到sql注入攻击。这意味着如果从web表单输入studentID,有人可以使用' - 注释掉select字符串并对数据库发出其他命令。
准备 - 如果使用参数,则可以准备sql语句,这是语法的预编译。在高容量情况下,这可能会稍微提高一些性能。
编辑:我前几天在reddit上看过这个视频,这是sql注入如何工作的一个很好的例子。sql injection
答案 1 :(得分:1)
假设此输入:
var studentID = "''; drop table users;--"
cmd.CommandText = "SELECT * FROM [Students]
WHERE StudentID = " + studentID + ";";
如果调用此select会完全删除表用户。
通过批准仅将合法输入添加到查询中,参数将有所帮助。