Я поддерживаю службу Windows, недавно обновленную/скомпилированную в .Net 4.5, размещенную на сервере 2012 года, и используя ту же базу данных SQL Server 2008, перед обновлением. Мы столкнулись с проблемой, когда он обновляет базу данных, используя простой оператор SQL, который, по-видимому, всегда работал до обновления. Теперь обновление почти всегда работает, но один раз (возможно?) Тысяча обновлений «нас обманывает», а ExecuteNonQuery возвращает 1, указывая на то, что она обновила строку, но на самом деле ее нет.Simple SqlCommand.ExecuteNonQuery всегда возвращает 1, даже когда он не обновлял базу данных
Если вы хотите сообщить мне, что не так с кодом, пожалуйста, продолжайте. То, на что я на самом деле надеюсь, является предложением о более «безумном» доказательстве способа обработки обновления. Может быть, было бы лучше установить соединение для использования транзакций? Может быть, гораздо лучше использовать хранимую процедуру, а также выполнять транзакции в хранимой процедуре? Насколько лучше/Почему?
код довольно просто (слишком просто?):
try
{
string sql = "UPDATE table SET barcode = '" + newBarcode + "' WHERE pk = '" + reportId + "'"; // no semicolon in the SQL
SqlCommand command = new SqlCommand(sql, connection); // connection recently opened
rowsUpdated = command.ExecuteNonQuery();
if (rowsUpdated != 1)
{
connection.Close()
throw new Exception("...");
}
else
...
connection.Close();
}
catch (Exception ex)
... // general exceptions handled
finally
... // make sure connection is closed
Я знаю, что это возможно (хотя очень маловероятно), что внешние воздействия могут быть аннулировав поле после обновления. Если это возможно, ТОЛЬКО возможность, прокомментируйте.
Я хотел бы начать использовать параметризованный запрос. ASAP – Steve
сделано. Теперь он более безопасен. Как вы думаете, это повлияет на результат возвращаемого значения? –
Нет, только один пользователь. –