Не вообще этого не делают, это подвергает вас атакам 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);