Проблема SQL-строки - PullRequest
       5

Проблема SQL-строки

0 голосов
/ 27 апреля 2018

У меня есть INSERT заявление,

"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " +
$"VALUES ('{name}','{email}','{address}')";

Итак, как вы можете видеть во 2-й строке, я добавил '$'. Эта версия кода работает, но она не поддерживается в VS2012.

Я пытаюсь преобразовать это в нечто подобное, но у меня много проблем, потому что это очень сложно.

"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " +
"VALUES (''" + name + "', ''" + email + "', ''" + address + "')";

Эта версия выше не работает. В основном я пытаюсь сделать запрос без использования '$' Любые идеи?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Не вообще этого не делают, это подвергает вас атакам SQL-инъекций и проблем с передачей. Как будет выглядеть дата, если вы попытаетесь передать ее с помощью конкатенации строк? Десятичный?

На самом деле проще использовать параметризованные запросы:

//Create a SqlCommand that can be reused
SqlCommand _cmdInsert;

var sql="INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " + 
        "VALUES (@name,@email,@address)";
var cmd=new SqlCommand(cmd);
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 30);
cmd.Parameters.Add("@email", SqlDbType.NVarChar, 20);
cmd.Parameters.Add("@address", SqlDbType.NVarChar, 50);
_cmdInsert=cmd;

Позже вы можете использовать команду напрямую, установив соединение и значения параметров:

using(var connection=new SqlConnection(theConnectionString)
{
    _cmdInsert.Connection=connection;
    _cmdInsert.Parameters["@name"].Value=someName;
    ...
    connection.Open();
    _cmdInsert.ExecuteNonQuery();
}

Параметризованные запросы передают строго типизированные значения вместе с запросом в вызове RPC. DateTime передается на сервер как DateTime (или двоичный эквивалент), а не как строка. Таким образом, нет ошибок конвертации. Независимо от того, что содержит значение, оно никогда не смешивается с самим запросом, поэтому оно не выполняется. Даже если address содержит '); drop table Users;--, он не будет выполнен.

Другой вариант - использовать микроОРМ, например Dapper . Dapper использует отражение для сопоставления имен параметров и свойств данных для создания и выполнения параметризованных запросов:

var insertStmt="INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " + 
        "VALUES (@name,@email,@address)";

connection.Execute(insertStmt, new { name=someName,email=someEmail, address=someAddress});

Как показывает страница проекта, вы можете выполнить один и тот же запрос несколько раз, если передадите массив параметров:

var myItems=new[] 
            {
                new {name=someName,email=someEmail, address=someAddress}
            };
connection.Execute(insertStmt, myItems);
0 голосов
/ 27 апреля 2018

Вы должны использовать параметризованные запросы, например, если вы используете ADO.NET, используйте это:

. . .
using(SqlConnection connection = new SqlConnection("yourConnectionString"))
{
    SqlCommand cmd = connection.CreateCommand();
    cmd.CommandText = @"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress)
                        VALUES (@Name, @Email, @Address)";
    cmd.Parameters.AddRange(new SqlParameter[]
    {
        new SqlParameter("@Name", name),
        new SqlParameter("@Email", email),
        new SqlParameter("@Address", address)
    });
    connection.Open();
    cmd.ExecuteNonQuery();
}
. . .

другие примеры типов провайдеров sql вы можете найти здесь .

...