SQL命令中的字符串插值

时间:2019-01-08 09:11:47

标签: c# string string-interpolation

是否有更简单的方法在下面的插入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();
}

3 个答案:

答案 0 :(得分:3)

不要这样做!说真的,就是不要。字符串插值不适用于构建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 });

答案 1 :(得分:3)

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

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];
-- ','');

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

答案 2 :(得分:1)

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

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

但是,您当然很容易进行SQL注入,应该避免!

使用SqlCommand.Parameters集合添加参数,并确保该线程安全。