Member 14690040 Ответов: 3

Вопрос Exectue число c#


Привет, ребята!

Мне нужна помощь с кодом, всякий раз, когда логин или пароль действительны на моем сайте, возникает ошибка "
System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Data.Common.DbCommand.ExecuteScalar(...) returned null.
"

Это мой кусочек кода
type.Parameters.AddWithValue("@Username", txtUsernameLogin.Text.Trim());
type.Parameters.AddWithValue("@Password",txtPasswordLogin.Text.Trim());

               int count = Convert.ToInt32(cmd.ExecuteScalar());
               query = "SELECT Type FROM TennisMember WHERE Username=@Username AND Password=@Password";
               cmd = new SqlCommand(query, sqlCon);
               cmd.Parameters.AddWithValue("@Username", txtUsernameLogin.Text.Trim());
               cmd.Parameters.AddWithValue("@Password",txtPasswordLogin.Text.Trim());
               int str_users= Convert.ToInt32(cmd.ExecuteScalar());

               query = "SELECT MemberID FROM TennisMember WHERE Username=@Username AND Password=@Password";
               SqlCommand memberID = new SqlCommand(query, sqlCon);
               memberID.Parameters.AddWithValue("@Username",txtUsernameLogin.Text.Trim());
               memberID.Parameters.AddWithValue("@Password",txtPasswordLogin.Text.Trim());
               string id = memberID.ExecuteScalar().ToString();

               //admin = 1
               if (count == 1)
               {
                   Session["MemberID"] = id;
                   Session["Username"] = txtUsernameLogin.Text.Trim();
                   if (str_users == 1)
                   {
                       Session["Type"] = "1";
                       Response.Redirect("Admin.aspx");
                   }
                   else if (str_users == 0)
                   {
                       Session["Type"] = "0";
                       Response.Redirect("Profile.aspx");
                   }
               }
               if (count != 1)
               {
                   lblLoginError.Visible = true;
               }


Что я уже пробовал:

Я не знаю, как с этим справиться[^]

Вот ссылка на скриншот

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я не знаю, как с этим справиться

Если по каким-то причинам имя пользователя или пароль неверны, то ваш запрос не соответствует действительности.
Вам нужно изменить свой код, чтобы убедиться, что есть ответ на запрос, прежде чем пытаться использовать/преобразовать ответ.


Рейтинг:
1

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!

Но... Никогда не храните пароли в открытом виде - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

И помните: если это веб-сайт и у вас есть какие-либо пользователи из Европейского союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.


Member 14690040

Да, я знаю о безопасности, это просто курсовая работа для университета.
Вот скриншот с моим кодом id == null, однако я не знаю, как это исправить.
https://ibb.co/g3sLXd0

OriginalGriff

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

OriginalGriff

И "id" не является null - он не может быть как его тип значения, и они никогда не могут содержать null.
Возможно, вы присваиваете значение id, и преобразование завершается неудачно, потому что запрос не возвращает строк, но у вас нет назначенного null для "id".

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

И исправьте свои проблемы с безопасностью!

Рейтинг:
0

Richard MacCutchan

string id = memberID.ExecuteScalar().ToString();

Если вызов к ExecuteScalar не возвращает результат после вызова ToString это приведет к исключению, которое вы видите. Первое, что нужно сделать, это захватить то, что было возвращено, и проверить, чтобы увидеть, что это не так null.
object obj = memberID.ExecuteScalar();
if (obj == null)
{
    // no record found - take appropriate action
}
else
{
    // record found in database
}