我是C#的新手,我想知道。
在C#中构建SQL字符串时,为什么我们需要使用SqlParameter对象来表示用户的输入而不是直接传入字符串?
答案 0 :(得分:2)
我假设你的意思是为什么写作更好:
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = @FirstName";
// Or whichever form...
command.Parameters.AddParameter("@FirstName").Value = input;
而不是
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input + "'";
后一种形式有三个问题:
它允许SQL Injection Attacks,除非你非常小心转义 - 上面的代码不是。想象一下,如果用户输入以下内容,SQL会是什么样子:
' OR 'x' = 'x
它混合了代码和数据。您无法看到您正在尝试执行的操作的清晰表示,而第一个表单显示哪些位是固定的以及哪些是可变输入
虽然字符串不是问题,但参数可以避免不必要的数据转换。例如,当使用日期或日期/时间值时,使用第二种方法,您最终需要担心数据库将接受哪些文本格式,即使您已已启动 {{1值(例如),数据库将结束,其值为某个适当的日期/时间类型。通过字符串表示只会导致麻烦。
此外,在某些情况下,第一种方法可能会提高性能,允许数据库缓存查询执行计划。尽管如此,它还有很多细微差别,并且它非常适合数据库。
答案 1 :(得分:0)
简单来说,为了避免SQL注入攻击,在某种程度上它还可以提高性能,因为我们为该参数指定了数据类型,大小等。
如果你只是想避免SQL注入,我想你可能只是使用
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input.Replace("'","''") + "'";