c# – 为什么我们总是喜欢在SQL语句中使用参数?

我非常新的工作数据库。现在我可以编写SELECT,UPDATE,DELETE和INSERT命令。但我见过很多论坛,我们更喜欢写:

SELECT empSalary from employee where salary = @salary

…代替:

SELECT empSalary from employee where salary = txtSalary.Text

为什么我们总是喜欢使用参数,我如何使用它们?

我想知道第一种方法的用法和好处。我甚至听说过SQL注入,但我不完全理解它。我甚至不知道SQL注入是否与我的问题有关。

最佳答案
当数据库与程序界面(如桌面程序或网站)结合使用时,使用参数有助于防止SQL注入攻击。

在您的示例中,用户可以通过在txtSalary中编写语句在数据库上直接运行SQL代码。

例如,如果他们写0或1 = 1,执行的SQL将是

 SELECT empSalary from employee where salary = 0 or 1=1

从而所有empsalaries将返回。

此外,用户可以对您的数据库执行更糟糕的命令,包括删除它如果他们写0; Drop Table员工:

SELECT empSalary from employee where salary = 0; Drop Table employee

然后将删除表employee。

在你的情况下,它看起来像你使用.NET。使用参数就像:

C#

string sql = "SELECT empSalary from employee where salary = @salary";

using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
    var salaryParam = new SqlParameter("salary", SqlDbType.Money);
    salaryParam.Value = txtMoney.Text;

    command.Parameters.Add(salaryParam);
    var results = command.ExecuteReader();
}

VB.NET

Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
    Using command As New SqlCommand(sql, connection)
        Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
        salaryParam.Value = txtMoney.Text

        command.Parameters.Add(salaryParam)

        Dim results = command.ExecuteReader()
    End Using
End Using

编辑2016-4-25:

根据George Stocker的评论,我将示例代码更改为不使用AddWithValue。此外,通常建议您在使用语句中封装IDisposables。

转载注明原文:c# – 为什么我们总是喜欢在SQL语句中使用参数? - 代码日志