HETVI SHUKLA Ответов: 3

Я получаю ошибку в строке 22


Ошибка сервера в приложении'/'.
Ссылка на объект не устанавливается на экземпляр объекта.
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.

Ошибка Источника:


Строка 20: строка checkuser = "SELECT * FROM register where [USERNAME]='"+TextBoxunm.Текст+"'";
Строка 21: SqlCommand com = new SqlCommand(checkuser,conn);
Строка 22: int temp = Convert.ToInt32(com.ExecuteScalar().Метод toString());
Строка 23: if (temp == 1)
Строка 24: {

Исходный Файл: C:\Users\Hetvi\source\repos\loginpage\loginpage\register.aspx.cs Строка: 22

трассировка стека:


[NullReferenceException: ссылка на объект не установлена на экземпляр объекта.]
loginpage.зарегистрироваться.Page_Load(отправитель объекта, EventArgs e) in C:\Users\Hetvi\source\repos\loginpage\loginpage\register.aspx.cs:22
System.Web.Util.CalliEventHandlerDelegateProxy.Обратный вызов(отправитель объекта, EventArgs e) +52
Системы.Веб.Пользовательского интерфейса.Контроль.OnLoad(EventArgs e) +97
System.Web.UI.Control.LoadRecursive() +61
Системы.Веб.Пользовательского интерфейса.Страницы.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +693




вот моя программа aspx-файл.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

namespace loginpage
{
    public partial class register : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           if(IsPostBack)
            {
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["KNOWLEDGEConnectionString"].ConnectionString);
                conn.Open();
                string checkuser = "SELECT * FROM register where [USERNAME]='"+TextBoxunm.Text+"'";
                SqlCommand com = new SqlCommand(checkuser,conn);
                int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
                if (temp == 1)
                {
                    Response.Write("user already exsist");
                }
                conn.Close();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["KNOWLEDGEConnectionString"].ConnectionString);
                conn.Open();
                string insertquery = "insert into register(username,email password,country) values(@un,@email,@pass,@coun)";
                SqlCommand com = new SqlCommand(insertquery, conn);
                com.Parameters.AddWithValue("@un",TextBoxunm.Text);
                com.Parameters.AddWithValue("@email",TextBoxemail.Text);
                com.Parameters.AddWithValue("@pass",TextBoxpass.Text);
                com.Parameters.AddWithValue("@coun",TextBoxcoun.Text);
                com.ExecuteNonQuery();
                Response.Redirect("Manager.aspx");
                Response.Write("registration sucessfull");
                conn.Close();
            }
            catch(Exception ex)
            {
                Response.Write("error :"+ex.ToString());
            }
        }
    }
}


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

я проверил свои подключения к базе данных

Richard Deeming

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

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

3 Ответов

Рейтинг:
1

MadMyche

Есть несколько проблем со строками 20-22

Первая проблема-это сама строка 20; это хрестоматийный случай SQL Injection Vulnerability.
НИКОГДА следует ли создавать SQL-запрос, объединяя вместе команды и переменные. Правильная вещь для использования-это Параметр SQL[^]. Вы заменяете переменную на заполнитель и добавляете ее в коллекцию параметров команд, чтобы присвоить этому заполнителю значение.

string checkuser = "SELECT * FROM register where [USERNAME] = @User";
SqlCommand com = new SqlCommand(checkuser,conn);
com.Parameters.AddWithValue("@User", TextBoxunm.Text);
Вторая проблема заключается в том, что запрос, похоже, не подходит для того, что вы хотите сделать. Похоже, вы просто хотите проверить, является ли имя пользователя действительным.
Запрос, который вы написали, вернет все о пользователе, но только если этот пользователь найден.
1. Если пользователь найден возврате всей соответствующей записи. Первый столбец, вероятно, является числовым первичным ключом или идентификатором. Так что ваш код, кажется, работает нормально.
2. Если пользователь не найден, то SQL выдаст НУЛЕВОЙ. Таким образом ошибка

Решение простое: измените либо запрос, либо используемый метод.

Изменение SQL - запроса является наиболее эффективным способом как для базы данных, так и для приложения.
string checkuser = "SELECT Count(*) FROM register where [USERNAME] = @User";
Другой способ менее эффективен, так как БД все равно будет возвращать полную запись и передавать ее приложению. Но это жизнеспособная альтернатива
int temp = com.ExecuteNonQuery();


Рейтинг:
1

OriginalGriff

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

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

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

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

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


Рейтинг:
1

Garth J Lancaster

Я почти уверен в этой линии

int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
тебе это не нужно .Вызов ToString (), и это может быть источником вашей проблемы.

пробовать
int temp = Convert.ToInt32(com.ExecuteScalar());
или даже просто
Int32 temp = 0;
temp = (Int32)com.ExecuteScalar();