SqlException: неправильный синтаксис около '1' - PullRequest
0 голосов
/ 17 ноября 2018

В настоящее время я пытаюсь внедрить SQL в проект с Unity3D.До сих пор я был в состоянии сделать «обычные» ОБНОВЛЕНИЕ, ДОБАВИТЬ, УДАЛИТЬ, УДАЛИТЬ, ИЗМЕНИТЬ, ВСТАВИТЬ.

Пытаясь пойти дальше, я пытаюсь вставить подготовленные утверждения, используя эту ссылку в качестве guide

Вот мой код:

SqlConnection sqlConnection = new SqlConnection(Connection.connectionString)
sqlConnection.Open();

SqlCommand cmd = new SqlCommand(null, sqlConnection);
cmd.CommandText = "INSERT INTO IngredientTypes (Name) VALUES (@name)";

SqlParameter nameParam = new SqlParameter("@name", SqlDbType.Text, 155);
nameParam.Value = Name;
cmd.Parameters.Add(nameParam);

cmd.Prepare();
cmd.ExecuteNonQuery();

Моя таблица выглядит так:

CREATE TABLE IngredientTypes
(
    IngredientTypeID INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(155)
);

Я получаю эту ошибку:

SQLException: Неверный системный налог рядом с '1'.

System.Data.SqlClient.SqlConnection.ErrorHandler (Отправитель System.Object, Mono.Data.Tds. Protocol.TdsInternalErrorMessageEventArgs e)

Помогите, пожалуйста? Заранее спасибо .. Не могу найти, где я ошибся.

Ответы [ 4 ]

0 голосов
/ 17 ноября 2018

Я попробовал ваш код в точности так, как он есть, и не нашел проблем. Хотя ошибок компиляции немного (отсутствуют; в строке 1 переменная Name должна указываться как параметр), но я уверен, что вы это знаете. Если вы опубликовали структуру и код таблицы точно так же, как в своем проекте, то в этом коде проблем нет.

0 голосов
/ 17 ноября 2018

Не могли бы вы попробовать ниже? Между прочим, использование структуры using более безопасно для соединений SQL, соединение автоматически закрывается, когда ваш процесс завершен.

using (SqlConnection sqlConnection = new SqlConnection(Connection.connectionString))
    {
        SqlCommand command = new SqlCommand("INSERT INTO IngredientTypes (Name) VALUES (@name)", connection);
        command.Parameters.Add("@name", SqlDbType.Varchar, 155);
        command.Parameters["@name"].Value = Name; //make sure Name is string.

        try
        {
            sqlConnection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
0 голосов
/ 17 ноября 2018

Вы можете немного уменьшить этот код без потери функции и даже некоторых важных улучшений (например, это закроет соединение, даже если выдается исключение):

using (var sqlConnection = new SqlConnection(Connection.connectionString))
using (var cmd = new SqlCommand("INSERT INTO IngredientTypes (Name) VALUES (@name)",  sqlConnection))
{
    cmd.Parameters.Add("@name", SqlDbType.VarChar, 155).Value = Name;
    sqlConnection.Open();
    cmd.ExecuteNonQuery();
}

Я не уверен, что является причиной этого исключения в вашем существующем коде, потому что 1 не используется нигде в этом запросе. Я подозреваю проблема связана с SqlDbType.Text, так как это не правильный тип для использования со столбцом VarChar, но похоже, что где-то есть код мы еще не видели, что это меняет текст вашей команды SQL.

Определенно, метод Prepare() в вашей ссылке не нужен для Sql Server. Он унаследован здесь от DbCommand, где он включен, поскольку является важной частью API для некоторых других баз данных, но Sql Server обрабатывает это автоматически уже более 10 лет.

0 голосов
/ 17 ноября 2018

SqlDbType.Text Не то же самое, что varchar.Я не верю, что текстовые типы имеют указанную вами длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...