Обновить запись при чтении DataReader

Я не понимаю, почему этот код не обновляет таблицу данных:

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();
}

Здесь я попытался сделать что-то вроде «последний раз видели дд/ММ/гггг в чч:мм», обновив таблицу данных после успешного входа в систему (электронная почта бесполезна):

это таблица данных

Идутилизаторы NumeUtilicator Парола EmailUtilizator UltimaUtilizare 1 братан администратор [email protected] 11.04.2024 12:40 2 администратор администратор Асд 11.04.2024 1:12 3 НУЛЕВОЙ НУЛЕВОЙ НУЛЕВОЙ 11.04.2024 1:11

По сути, я хочу выполнить поиск по 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?

Есть ли у вас блок try/catch вокруг этого кода? Если да, уверены ли вы, что распечатаете/покажете/зарегистрируете любые ошибки, возникающие из-за этого очень небезопасного и ненадежного кода?

Steve 11.04.2024 20:37

@usertxt используется в запросе для фильтрации NumeUtilizator, но вы помещаете в него usermailtxt.Text.

Bart McEndree 11.04.2024 20:40

Как конкретно это не получается? Выбрасывается ли исключение? Если ExecuteNonQuery() запускается без ошибок, что он возвращает? Каково наблюдаемое значение времени выполнения фактического выполняемого запроса и используемого значения параметра? (А почему бы не использовать параметры для обоих значений?) Какие конкретные записи предполагается обновить?

David 11.04.2024 20:41

Попробуйте использовать профилировщик, чтобы точно узнать, какие операторы SQL ваше приложение отправляет в базу данных.

Bart McEndree 11.04.2024 20:42

Ваше обновление (даже если оно работает) выглядит странно. Что вы пытаетесь сделать? И почему вы используете COUNT(*) для получения идентификатора Утилизатора. В качестве бонуса ваш запрос подвержен SQL-инъекции, что может быть плохо.

siggemannen 11.04.2024 21:23

Да, это безумно уязвимо для SQL-инъекций. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ КОНКАТЕНАЦИЮ СТРОК ДЛЯ ТАКИХ ЗАПРОСОВ! НИКОГДА! Даже для целочисленных переменных и переменных даты.

Joel Coehoorn 11.04.2024 21:47

Кроме того: этот текстовый пароль так же плох.

Joel Coehoorn 11.04.2024 21:49

это личный проект, чувак, мне не нужно остерегаться SQL-инъекций. я не буду разыгрывать себя или что-то в этом роде

xpl0d 11.04.2024 22:35

Да, но это знак того, что ты собираешься использовать тот же стиль позже. Поступайте правильно, вместо того, чтобы приобретать вредные привычки, гораздо проще использовать параметр SQL, чем объединять строки. И еще, я не твой чувак, братан

siggemannen 11.04.2024 22:39

извини, я не уточнил, с кем разговариваю - комментарий предназначался Джоэлу, извини за двусмысленность, чувак

xpl0d 11.04.2024 23:09

Я думаю, что точка зрения @siggemannen заключается в том, что вы не должны предполагать, что знаете, какая у кого-то предпочтительная форма обращения, и придерживаться его имени и не использовать чувак, чувак, братан, сэр и т. д.

Dale K 12.04.2024 00:50

@xpl0d: «Мне не нужно остерегаться SQL-инъекций» — SQL-инъекции являются очень распространенным источником ошибок. Хотя на этот раз проблема, возможно, и не возникла, довольно контрпродуктивно намеренно писать код, подверженный ошибкам, пытаясь исправить ошибки в коде. Сейчас самое время начать изучать параметры запроса.

David 12.04.2024 15:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
12
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Думаю, нельзя использовать одно и то же соединение для обновления, пока открыта читалка. Вы можете попробовать использовать второе соединение для обновления или закрыть программу чтения перед выполнением обновления.

Ссылка

Это может быть дубликат C# При чтении данных с помощью DataReader невозможно обновить одну и ту же запись

Если строка подключения содержит MultipleActiveResultSets=true; тогда соединение может выполнить другую команду.

Bart McEndree 11.04.2024 20:51

Обратите внимание, что если считыватель остается открытым, все необходимые для него блокировки в БД по-прежнему сохраняются. Если соединение для обновления попытается обновить те же данные, оно может быть заблокировано, что приведет к взаимоблокировке. Убедитесь, что вы не читаете ту же таблицу, которую обновляете, или дождитесь завершения чтения.

Alejandro 11.04.2024 20:54

да, это была проблема читателя. Спасибо чувак

xpl0d 11.04.2024 21:00

Или загрузите DataReader в DataTable и выполните итерацию. Learn.microsoft.com/en-us/dotnet/api/…

David Browne - Microsoft 11.04.2024 22:51

По крайней мере в одном из этих операторов вы используете неправильное значение параметра @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();

Ответы, в которых все еще используется уязвимая конкатенация строк, всегда будут получать отрицательный голос.

Joel Coehoorn 11.04.2024 21:48

@ Джоэл Коегоорн Я согласен. С этими строками кода из xpl0d связано множество проблем. Вместо того, чтобы просто указывать на ошибки, я должен предложить более идеальное решение. После этого, возможно, вы благословите меня своим голосом.

Bart McEndree 11.04.2024 21:54

чувак, что не так с моим кодом :((

xpl0d 11.04.2024 23:32

@xpl0d Обработка параметров. datetime должен быть параметром, чтобы избежать внедрения SQL. Также параметр usertxt должен быть заполнен usertxt.Text вместо usermailtxt.Text.

Bart McEndree 12.04.2024 14:12

Другие вопросы по теме