2009-12-19 1 views
4

Я пытаюсь обновить таблицу MSSQL с помощью SqlCommand, я думаю, что это ошибка синтаксиса с моей T-SQL, но вот то, что я до сих пор:C# Обновление таблицы с использованием SqlCommand.Parameters

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) 
+0

Возможно, это был глупый вопрос, но вы указали свою команду sql на свое соединение sql? sqlCommand.Connection = sqlConn; Обычно я делаю это в конструкции sqlCommand = new SqlCommand (sqlConn); Я бы подумал, что это вызовет ошибку, если вы этого не сделали. – GrayWizardx

+0

Да, конструктор, который я использовал, имеет его в конце. – skylerl

+0

Вы фактически используете поля NVArchar в своем db? или просто варчар? – GrayWizardx

ответ

4

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

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

Да, я поставил это как тест, забыл отредактировать его. – skylerl

+0

О, но это все еще не работает? Можем ли мы увидеть больше кода? – womp

+0

Может потребоваться уточнение - вы можете иметь предложение FROM в инструкции UPDATE, например. UPDATE t SET t.Field = 'Blah' FROM MyTable t WHERE t.Id = 1 – AdaTheDev

1

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

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

1.) Нет 2.) Да, @ticketIDParam звучит, я использовал его другими способами 3.) Я обновляю строки, которые могут иметь свои значения, уже одинаковые, да. 4.) Я добавил их выше. 5.) Нет триггеров 6.) Параметры обычно копируются/вставляются из методов, которые я делал, выполнял/делал/работал, однако некоторые из них нуждались в некоторых изменениях, поэтому их может быть ошибкой или двумя. – skylerl

+0

Если вы можете получить трассировку профилировщика, вы можете точно увидеть, что отправляется. и попробуйте выполнить ту же самую команду на сервере (при условии, что у вас есть доступ). – GrayWizardx

+0

Хотел бы я, GoDaddy очень ограничительный с таким доступом = / – skylerl

0

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

;SELECT @@ROWCOUNT 

то вместо ExecuteNonQuery, делать ExecuteScalar, и посмотреть, если SQL даже думает, что обновленный ничего.

Смежные вопросы