Обновление таблицы 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
Пара вопросов:
- Это внутри транзакции, которая получает откат?
- Вы убедились, что @ticketIDParam соответствует набору строк в таблице? Особенно, если это не просто целочисленный ключ
- Обновляете ли вы строки, которые не имеют побочных эффектов (т.е. обновляете ли вы те же значения)?
- Можете ли вы предоставить paramaters.Add операторов для этого запроса
- Есть ли на столе триггер или другой параметр (я полагаю, нет, поскольку вы ничего не упомянули).
- Вы сказали, что знаете, что параметры работают правильно, можете ли вы сказать, как вы это проверили? (профилировщик, визуальный осмотр и т. д.).
Похоже, ваш хостинг-провайдер ограничивает ваши параметры отладки, заставляя вас делать это по старинке. Что делать, если сразу после обновления вы ставите что-то вроде:
;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();