Member 14613437 Ответов: 2

Проблема подключения, когда emailid существует в базе данных или нет?


Issue With Connection When Working With SSMS.

How to Check EmailId Exist in the database or not?

<pre><pre>
        protected void Button1_Click(object sender, EventArgs e)
        {
            string firstname = txtFirstName.Text;
            string lastname = txtLastName.Text;
            string emailid = txtEmailId.Text;
            string password = txtclientpassword.Text;
            Registration_Click(firstname, lastname, emailid, password);
        }

 void Registration_Click(string firstname,string lastname,string emailid,string Password)
        {
            string conn = ConfigurationManager.ConnectionStrings["connstr"].ToString();
            SqlConnection cn = new SqlConnection(conn);

            cn.Open();

            string Insertquery = "Insert into tbladminclient(FirstName,LastName,EmailId,Password) values(@FirstName,@LastName,@EmailId,@Password)";
            SqlCommand cmd = new SqlCommand(Insertquery, cn);
            cmd.CommandType = CommandType.Text;

            string query = "SELECT * FROM tbladminclient WHERE EmailId='" + txtEmailId.Text + "'";
            cmd.Parameters.AddWithValue(query, cn);
            int count = (int)cmd.ExecuteScalar();

            if (count > 0)
            {
                Label2.Text = "EmailId is Already In Use";
            }

            cmd.Parameters.AddWithValue("@FirstName", firstname);
            cmd.Parameters.AddWithValue("@LastName", lastname);
            cmd.Parameters.AddWithValue("@EmailId", emailid);
            cmd.Parameters.AddWithValue("@Password", Password);

            try
            {
                int validateOperation = cmd.ExecuteNonQuery();
                if (validateOperation > 0)
                {
                    Response.Write("successfully Registration");
                    Response.Redirect("ClientLogin.aspx");
                }
                else
                {
                    Response.Write("Not successfully Registration");
                }
            }
            catch (SqlException e)
            {
                Response.Write("error");
            }
            finally
            {
                cn.Close();
            }
        }
    }


Как определить, существует ли Emailid в базе данных или нет??



Изображение:
Error:
<a href="https://imgur.com/a/hzILnC1">Imgur: The magic of the Internet</a>[<a href="https://imgur.com/a/hzILnC1" target="_blank" title="New Window">^</a>]


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

I want the Emailid is already is inserted in the database then not inserted the second time?

2 Ответов

Рейтинг:
10

MadMyche

Итак, у нас тут есть несколько проблем...

Уязвимость SQL и плохая практика использования паролей, которые были рассмотрены в Оригинальный Гриффответ на этот вопрос[^], и я не собираюсь пересказывать эти моменты.

Код организации - у вас есть довольно хорошее здание ВСТАВЛЯТЬ утверждение, и тогда возникает ВЫБИРАТЬ заявление прямо посередине; почти похоже, что эти строки были втянуты или скопированы и вставлены.

Ваши переменные несовместимы между этими двумя SQL-операторами; кроме того, это предполагает случайное копирование/вставку кода.

У вас есть два объекта SQL, которые не были правильно расположены, и неиспользуемый объект исключения

Оператор Select вернет все строки, соответствующие этому адресу электронной почты, и вы вызываете его через ExecuteScalar (), который захватит значение из строки[0]-столбца[0], а затем попытаетесь сделать это INT. Если результат таков нулевой или что-нибудь другое, кроме числового, у вас будут проблемы.
Лучше всего здесь было бы отредактировать команду SELECT.

Теперь то, что я сделал бы, было бы похоже на это; я бы, вероятно, работал над обратной связью с пользователем (Label2.text vs Response.Пиши) но это на тебе

void Registration_Click(string firstname,string lastname,string emailid,string Password) {
	string conn =        // leave as is
	string InsertQuery = // leave as is
	string SelectQuery = "SELECT Count(*) FROM tblAdminClient WHERE EmailId = @EmailID"; // Get the count of matching records, will always return a number if query is valid

	using (SqlConnection cn = new SqlConnection(cn)) {
		using (SqlCommand cmd = new SqlCommand(SelectQuery, cn)) {
			cmd.CommandType  = CommandType.Text;
			cmd.Parameters.AddWithValue (emailid);

			conn.Open();

			int count = (int)cmd.ExecuteScalar();

			if (count > 0) { Label2.Text = "EmailId is Already In Use"; }
			else {								// only insert if record wasnt found
				cmd.CommandText = InsertQuery;
				
				cmd.Parameters.AddWithValue("@FirstName", firstname);
				cmd.Parameters.AddWithValue("@LastName", lastname);
			//	cmd.Parameters.AddWithValue("@EmailId", emailid); 	/* not needed, already in command parameter collection */
				cmd.Parameters.AddWithValue("@Password", Password);

				try {
					int validateOperation = cmd.ExecuteNonQuery();
					if (validateOperation > 0) {
						Response.Write("successfully Registration");
						Response.Redirect("ClientLogin.aspx");
					}
					else { Response.Write("Not successfully Registration"); }
				}

				catch (SqlException e) { Response.Write("ERROR: " + e.Message"); } // might as well say what the error was, or don't declare "e"

				// cn.Close not needed with USING block
				// AND would not 
				// finally { cn.Close(); }
			}
		}
	}
}


Member 14613437

@MadMyche спасибо за предложение еще раз спасибо.

MadMyche

Похоже, я забыл вставить это имя; строка должна быть
cmd.Parameters.AddWithValue("@EmailId", emailid);

Рейтинг:
1

OriginalGriff

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

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

А вы пробовали посмотреть на свой код?

cn.Open();
...
string query = "SELECT * FROM tbladminclient WHERE EmailId='" + txtEmailId.Text + "'";
cmd.Parameters.AddWithValue(query, cn);
Почему вы пытаетесь использовать SQL-запрос в качестве имени параметра, а экземпляр соединения-в качестве параметра?


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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Вы четко знаете, что такое параметризованный запрос, или считаете, что "разработка" - это то же самое, что "copy'n'paste'n'hopeitworks", поэтому используйте их. Всегда!
[/редактировать]