Строковая интерполяция внутри команды SQL - PullRequest
0 голосов
/ 08 января 2019

Есть ли более простой способ использовать переменные name и phone внутри приведенной ниже команды SQL вставки?

Строковая интерполяция - это способ, но я не знаю, как это реализовать.

    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 голосов
/ 08 января 2019

Не делай этого! Серьезно, просто не надо. Строковая интерполяция не подходит для построения 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 });
0 голосов
/ 08 января 2019

Что вы действительно должны сделать, так это использовать параметризованный запрос, поэтому ваш запрос будет выглядеть следующим образом:

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, если у пользователя, который подключается к SQL-коду, есть достаточные права для этого.

0 голосов
/ 08 января 2019

Для использования интерполяции строк необходимо написать:

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

Но, конечно, вы склонны к SQL-инъекциям, которых вам следует избегать!

Используйте SqlCommand.Parameters collection, чтобы добавить параметр и быть в безопасности от этого потока.

...