Я не понимаю, почему этот код не обновляет таблицу данных:
SqlCommand cmd = new SqlCommand("Select Count(*) From Utilizatori where NumeUtilizator='"+ usermailtxt +"' and Parola='"+ passtxt +"'", conn);
SqlDataReader sdr = cmd.ExecuteReader();
if (sdr.Read())
{
DateTime dateTime = DateTime.Now;
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = '"+ dateTime + "' where IdUtilizatori='"+sdr[0]+"' ", conn);
cmmd.ExecuteNonQuery();
}
Здесь я попытался сделать что-то вроде «последний раз видели дд/ММ/гггг в чч:мм», обновив таблицу данных после успешного входа в систему (электронная почта бесполезна):
По сути, я хочу выполнить поиск по UserId, но он ничего не обновил. Даже когда я изменил его на имя пользователя (NumeUtilizator), результат был тот же.
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = '"+ dateTime + "' where NumeUtilizator=@usertxt ", conn);
Даже когда я пытался использовать параметры:
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = '"+ dateTime + "' where NumeUtilizator=@usertxt ", conn);
cmmd.Parameters.AddWithValue("@usertxt", usermailtxt.Text);
cmmd.ExecuteNonQuery();
Итак, как мне обновить по ID?
@usertxt используется в запросе для фильтрации NumeUtilizator, но вы помещаете в него usermailtxt.Text.
Как конкретно это не получается? Выбрасывается ли исключение? Если ExecuteNonQuery() запускается без ошибок, что он возвращает? Каково наблюдаемое значение времени выполнения фактического выполняемого запроса и используемого значения параметра? (А почему бы не использовать параметры для обоих значений?) Какие конкретные записи предполагается обновить?
Попробуйте использовать профилировщик, чтобы точно узнать, какие операторы SQL ваше приложение отправляет в базу данных.
Ваше обновление (даже если оно работает) выглядит странно. Что вы пытаетесь сделать? И почему вы используете COUNT(*) для получения идентификатора Утилизатора. В качестве бонуса ваш запрос подвержен SQL-инъекции, что может быть плохо.
Да, это безумно уязвимо для SQL-инъекций. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ КОНКАТЕНАЦИЮ СТРОК ДЛЯ ТАКИХ ЗАПРОСОВ! НИКОГДА! Даже для целочисленных переменных и переменных даты.
Кроме того: этот текстовый пароль так же плох.
это личный проект, чувак, мне не нужно остерегаться SQL-инъекций. я не буду разыгрывать себя или что-то в этом роде
Да, но это знак того, что ты собираешься использовать тот же стиль позже. Поступайте правильно, вместо того, чтобы приобретать вредные привычки, гораздо проще использовать параметр SQL, чем объединять строки. И еще, я не твой чувак, братан
извини, я не уточнил, с кем разговариваю - комментарий предназначался Джоэлу, извини за двусмысленность, чувак
Я думаю, что точка зрения @siggemannen заключается в том, что вы не должны предполагать, что знаете, какая у кого-то предпочтительная форма обращения, и придерживаться его имени и не использовать чувак, чувак, братан, сэр и т. д.
@xpl0d: «Мне не нужно остерегаться SQL-инъекций» — SQL-инъекции являются очень распространенным источником ошибок. Хотя на этот раз проблема, возможно, и не возникла, довольно контрпродуктивно намеренно писать код, подверженный ошибкам, пытаясь исправить ошибки в коде. Сейчас самое время начать изучать параметры запроса.





Думаю, нельзя использовать одно и то же соединение для обновления, пока открыта читалка. Вы можете попробовать использовать второе соединение для обновления или закрыть программу чтения перед выполнением обновления.
Это может быть дубликат C# При чтении данных с помощью DataReader невозможно обновить одну и ту же запись
Если строка подключения содержит MultipleActiveResultSets=true; тогда соединение может выполнить другую команду.
Обратите внимание, что если считыватель остается открытым, все необходимые для него блокировки в БД по-прежнему сохраняются. Если соединение для обновления попытается обновить те же данные, оно может быть заблокировано, что приведет к взаимоблокировке. Убедитесь, что вы не читаете ту же таблицу, которую обновляете, или дождитесь завершения чтения.
да, это была проблема читателя. Спасибо чувак
Или загрузите DataReader в DataTable и выполните итерацию. Learn.microsoft.com/en-us/dotnet/api/…
По крайней мере в одном из этих операторов вы используете неправильное значение параметра @usertxt.
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = '"+ dateTime + "' where NumeUtilizator=@usertxt ", conn);
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = '"+ dateTime + "' where NumeUtilizator=@usertxt ", conn);
cmmd.Parameters.AddWithValue("@usertxt", **usermailtxt.Text**);
cmmd.ExecuteNonQuery();
Я предлагаю эту линию
SqlCommand cmmd = new SqlCommand("Update Utilizatori Set UltimaUtilizare = @Date where NumeUtilizator=@usertxt ", conn);
cmmd.Parameters.AddWithValue("@Date", dateTime);
cmmd.Parameters.AddWithValue("@usertxt", usertxt.Text);
cmmd.ExecuteNonQuery();
Ответы, в которых все еще используется уязвимая конкатенация строк, всегда будут получать отрицательный голос.
@ Джоэл Коегоорн Я согласен. С этими строками кода из xpl0d связано множество проблем. Вместо того, чтобы просто указывать на ошибки, я должен предложить более идеальное решение. После этого, возможно, вы благословите меня своим голосом.
чувак, что не так с моим кодом :((
@xpl0d Обработка параметров. datetime должен быть параметром, чтобы избежать внедрения SQL. Также параметр usertxt должен быть заполнен usertxt.Text вместо usermailtxt.Text.
Есть ли у вас блок try/catch вокруг этого кода? Если да, уверены ли вы, что распечатаете/покажете/зарегистрируете любые ошибки, возникающие из-за этого очень небезопасного и ненадежного кода?