'Неверный синтаксис рядом с ключевым словом' AS '.'и моя строка действительно не имеет слова "как" - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь вставить данные в свою базу данных через SqlCommand.

Это очень просто, но я не могу понять сообщение об исключении:

System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с ключевым словом' AS '

Мой код:

SqlConnection cn = new SqlConnection("**CONNECTION STRING IS WORKING FINE, CHECKED**");

string tsql = "INSERT INTO CAMADA VALUES (" + id + ", " + team + "," + shift + "," + starttime + "," + jobdate + "," + PM;

SqlCommand cmd = new SqlCommand(tsql,cn);
cmd.CommandType = CommandType.Text;

cn.Open();
cmd.ExecuteNonQuery();

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 05 октября 2018

Ваш код имеет три основные проблемы -

  1. Он уязвим для SQL-инъекций атак.
    Никогда не объединяйте строки с пользовательским вводом в ваш sql.Вместо этого используйте параметры.
    Узнайте, как параметры защищают вас от SQL-инъекций.

  2. Он не удаляет экземпляр SqlConnection, как следует, поэтому он можетбыть добавленным или возвращенным в пул соединений .

  3. Вы не указали список столбцов в своем операторе вставки.
    Это означает, что если вы когда-либо добавитестолбец в вашей таблице или просто переупорядочить столбцы, ваш оператор вставки завершится ошибкой.

Приведенный ниже код содержит пример правильного способа выполнения операторов 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();    
    }
}
...