Ваш код имеет три основные проблемы -
Он уязвим для SQL-инъекций атак.
Никогда не объединяйте строки с пользовательским вводом в ваш sql.Вместо этого используйте параметры.
Узнайте, как параметры защищают вас от SQL-инъекций.
Он не удаляет экземпляр SqlConnection
, как следует, поэтому он можетбыть добавленным или возвращенным в пул соединений .
Вы не указали список столбцов в своем операторе вставки.
Это означает, что если вы когда-либо добавитестолбец в вашей таблице или просто переупорядочить столбцы, ваш оператор вставки завершится ошибкой.
Приведенный ниже код содержит пример правильного способа выполнения операторов SQL.
Обязательно прочитайте и поймите комментарии, они здесь, чтобы помочь вам.
Обратите внимание, однако, что мне пришлось угадывать типы данных параметров - возможно, вам придется их изменить.
Кроме того, убедитесь, чтоустановить размер параметра при отправке в базу данных строк (char
/ nchar
/ varchar
/ nvarchar
) или двоичных данных (binary
/ varbinary
).
// proper spacing and indentations makes the code easier to read thus more maintainable.
// Also, Always specify the columns list in an insert statement.
var tsql = @"INSERT INTO CAMADA (id, team, shift, starttime, jobdate, pm)
VALUES (@id, @team, @shift, @starttime, @jobdate, @pm)";
// use the using statement to ensure the SqlConnection is closed and disposed when done.
// This is important not only because it's an IDispsable, but also because that
// if you don't dispose it, the connection will not return to the connection pool
using(var cn = new SqlConnection("**CONNECTION STRING IS WORKING FINE, CHECKED**"))
{
// SqlCommand is also an IDisposable
using(var cmd = new SqlCommand(tsql,cn))
{
// CommandType.Text is the default, no need to set it explicitly
// Use parameters to avoid all kinds of nasty stuff like SQL injection,
// but also having to handle DateTime string literals formats
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@team", SqlDbType.Int).Value = team;
cmd.Parameters.Add("@shift", SqlDbType.Int).Value = shift;
cmd.Parameters.Add("@starttime", SqlDbType.DateTime).Value = starttime;
cmd.Parameters.Add("@jobdate", SqlDbType.DateTime).Value = jobdate;
// Of course, the size is also a guess...
cmd.Parameters.Add("@pm", SqlDbType.VarChar, 2).Value = pm;
cn.Open();
cmd.ExecuteNonQuery();
}
}