SQL 命令中的字符串插值

String Interpolation inside an SQL Command

有没有更简单的方法来使用下面的 insert SQL 命令中的 namephone 变量?

String Interpolation 是一种方法,但我不知道如何实现它。

String name = textBox1.Text;
String phone = textBox2.Text;  
     
var query = "insert into Customer_info(Customer_Name,Customer_Phone) " +
            "values('" + name + "','" + phone + "');";
SqlCommand com = new SqlCommand(query,con);

try {
    con.Open();
    com.ExecuteNonQuery();
    con.Close();
}

catch (Exception Ex) {
    con.Close();
}

要使用字符串插值,您需要编写:

var query = $"insert into Customer_info(Customer_Name,Customer_Phone) values('{name}','{phone}');";

但是,您当然容易 SQL 注射,您应该避免!

使用 SqlCommand.Parameters 集合添加参数并远离该线程。

别这样!说真的,只是不要。字符串插值不适合构建SQL。只需使用参数:

var query = @"
insert into Customer_info(Customer_Name,Customer_Phone)
values(@name,@phone);";
//...
cmd.Parameters.AddWithValue("name", name);
cmd.Parameters.AddWithValue("phone", phone);
cmd.ExecuteNonQuery();

或者使用像 dapper 这样的库(它会为您删除所有杂乱的 ADO.NET 代码,例如命令、参数和读取器):

conn.Execute(query, new { name, phone });

您真正应该做的是使用参数化查询,因此您的查询将如下所示:

var query = "insert into Customer_info(Customer_Name,Customer_Phone)" +
"values(@name, @phone);";

然后您将使用 SQLCommand 对象将参数传递给查询:

using (var command = new SqlCommand(query, connection))
{
    command.Parameters.AddWithValue("@name", name);
    command.Parameters.AddWithValue("@phone", phone);

    command.ExecuteNonQuery();
}

这样做的原因是它避免了SQL注入(这是OWASP Top 10之一)的风险。考虑一下您当前的查询,如果传入的 name 包含一些 SQL,例如,如果它包含:

'; DROP TABLE [Customer_info]; --

这意味着您构建的 SQL(如果 phone 为空)将如下所示:

insert into Customer_info(Customer_Name,Customer_Phone) values ('';
DROP TABLE [Customer_Info];
-- ','');

这很可能导致您的 Customer_Info table 被删除,如果代码连接到 SQL 的用户有足够的权限这样做。