Обновление таблицы C# с использованием SqlCommand.Parameters

Я пытаюсь обновить таблицу MSSQL с помощью SqlCommand, я думаю, что это синтаксическая ошибка в моем T-SQL, но вот что у меня есть:

SqlCommand sqlCmd = new SqlCommand("UPDATE yak_tickets SET email = @emailParam, subject = @subjectParam, text = @textParam, statusid = @statusIDParam, ticketClass = @ticketClassParam WHERE id = @ticketIDParam", sqlConn);

Параметры работают как надо, однако таблица никогда не обновляется при запуске кода. Любая помощь будет оценена =)

Вот остальная часть кода:

    #region Parameters
    /* Parameters */
    sqlCmd.Parameters.Add("@ticketIDParam", SqlDbType.BigInt);
    sqlCmd.Parameters["@ticketIDParam"].Value = ticketID;

    sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail();

    sqlCmd.Parameters.Add("@subjectParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@subjectParam"].Value = ticketToBeSubmitted.getSubject();

    sqlCmd.Parameters.Add("@textParam", SqlDbType.Text);
    sqlCmd.Parameters["@textParam"].Value = ticketToBeSubmitted.getTicketContent();

    sqlCmd.Parameters.Add("@statusIDParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@statusIDParam"].Value = ticketToBeSubmitted.getStatus();

    sqlCmd.Parameters.Add("@ticketClassParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@ticketClassParam"].Value = ticketToBeSubmitted.getTicketClass();
    #endregion

    #region Try/Catch/Finally
    /* Try/Catch/Finally */

    try
    {
        sqlConn.Open();
        sqlCmd.ExecuteNonQuery();
    }
    catch (SqlException sqlEx)
    {
        sqlErrorLabel.Text = sqlEx.ToString();
        sqlErrorLabel.ForeColor = System.Drawing.Color.Red;
    }
    finally
    {
        sqlConn.Close();
    }

И подпись метода:

  public static void updateTicketInDatabase(Ticket ticketToBeSubmitted, Label sqlErrorLabel, int ticketID)

5 ответов

UPDATE FROM - неверный синтаксис (правка: OP исправил это). Проблема также может бытьtextстолбец text это ключевое слово в SQL Server, так как это тип данных. Попробуйте поставить вокруг него скобки.

UPDATE yak_tickets 
SET email = @emailParam, 
    subject = @subjectParam, 
    [text] = @textParam, 
    statusid = @statusIDParam, 
    ticketClass = @ticketClassParam 
WHERE id = @ticketIDParam

Пришлось использовать if(!Page.IsPostBack)

Пара вопросов:

  1. Это внутри транзакции, которая получает откат?
  2. Вы убедились, что @ticketIDParam соответствует набору строк в таблице? Особенно, если это не просто целочисленный ключ
  3. Обновляете ли вы строки, которые не имеют побочных эффектов (т.е. обновляете ли вы те же значения)?
  4. Можете ли вы предоставить paramaters.Add операторов для этого запроса
  5. Есть ли на столе триггер или другой параметр (я полагаю, нет, поскольку вы ничего не упомянули).
  6. Вы сказали, что знаете, что параметры работают правильно, можете ли вы сказать, как вы это проверили? (профилировщик, визуальный осмотр и т. д.).

Похоже, ваш хостинг-провайдер ограничивает ваши параметры отладки, заставляя вас делать это по старинке. Что делать, если сразу после обновления вы ставите что-то вроде:

;SELECT @@ROWCOUNT

затем вместо ExecuteNonQuery выполните ExecuteScalar и посмотрите, считает ли SQL что-либо обновленным.

Я не знаю, изменилось ли что-то с тех пор, как вы впервые спросили. но это работает для меня, например:

      var SchoolName = cmd.Parameters.AddWithValue("@SchoolName", school.SchoolName);
SchoolName.SqlDbType = SqlDbType.NVarChar;

В вашем коде это:

      sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar);
sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail();
Другие вопросы по тегам