цикл при выборе состояния

#asp.net #sql

#asp.net #sql

Вопрос:

 protected void Button1_Click(object sender, EventArgs e)
{
    if (firstname_tb.Text == "" || lastname_tb.Text == "" || email_tb.Text == "" || reemail_tb.Text == "" || pass_tb.Text == "" || gender_ddl.SelectedItem.Text == "" || day_ddl.SelectedItem.Text == "" || year_ddl.SelectedItem.Text == "")
    {
        Label9.Text = "please fill all data";
        Label9.Visible = true;
    }
    else

    {
        str = email_tb.Text;
        SqlConnection con = new SqlConnection(@"Data Source=SAMA-PCSQLEXPRESS;Initial Catalog=meral10;Integrated Security=True");
        SqlCommand comsel = new SqlCommand("SELECT email from reg ",con);
        con.Open();
        comsel.ExecuteNonQuery();
        con.Close();
        foreach (var v in comsel.Parameters.ToString())
        {
            if (v.ToString() == str)
            {

                Label9.Text = "this email already exist choose another one";
                Label9.Visible = true;
                b = false;
                break;                    
            }
            else
            {
                b = true;   
            }
        }
        if (b==true)
        {
            birthday = day_ddl.Text   "/"   month_ddl.Text   "/"   year_ddl.Text;

            SqlCommand com = new SqlCommand("INSERT INTO reg(first_name,last_name,email,email_ver,pass,gender,birthday) values(@fn,@ln,@email,@reemail,@pass,@gen,@birth)", con);
            con.Open();
            com.Parameters.AddWithValue("@fn", firstname_tb.Text);
            com.Parameters.AddWithValue("@ln", lastname_tb.Text);
            com.Parameters.AddWithValue("@email", email_tb.Text);
            com.Parameters.AddWithValue("@reemail", reemail_tb.Text);
            com.Parameters.AddWithValue("@pass", pass_tb.Text);
            com.Parameters.AddWithValue("@gen", gender_ddl.SelectedItem.Text);
            com.Parameters.AddWithValue("@birth", birthday);
            com.ExecuteNonQuery();
            con.Close();
            Label9.Text = "thank you for registration";
            Label9.Visible = true;

        }
        else
        {

            Label9.Text = "this email already exist choose another one";
            Label9.Visible = true;
        }
    }
  

Проблема заключается в том, что когда я пытаюсь ввести электронную почту, все уже существующие в базе данных, которые он вводит, в то время как он должен показать пользователю, что это электронное письмо уже существует в базе данных. Кто-нибудь может мне помочь?

Комментарии:

1. содрогнись!……возможно, немного больше «разделения проблем»…

2. con.Open(); comsel.ExecuteNonQuery(); con.Close(); — Мне нравится этот шаблон!

Ответ №1:

Хорошо, насколько я могу понять, вы хотите, чтобы ВСТАВКА выполнялась только в том случае, если электронное письмо уникально в [reg].[email] поле. Это произойдет, если b == true . Логика, которую вы используете для этого, в основном правильная, но вы неправильно извлекаете результаты из базы данных. Попробуйте что-то вроде:

 con.Open();
System.Data.SqlClient.SqlDataReader objReader = comsel.ExecuteReader();
while (objReader.Read())
{
        if ((String)objReader("email") == str)
        {

            Label9.Text = "this email already exist choose another one";
            Label9.Visible = true;
            b = false;
            break;                    
        }
        else
        {
            b = true;   
        }
}
con.Close();
  

Надеюсь, это сработает так, как задумано.

Кстати, я бы упустил возможность не упомянуть, что этот подход довольно неэффективен. Лучшей идеей было бы использовать запрос, подобный этому:

SELECT [email] FROM [reg] WHERE [email] = @email;

В котором вы указываете свою переменную «str» в качестве параметра аналогично операции ВСТАВКИ ниже. Затем вместо перебора результатов просто проверьте, есть ли в SqlDataReader какие-либо строки:

     SqlConnection con = new SqlConnection(@"Data Source=SAMA-PCSQLEXPRESS;Initial Catalog=meral10;Integrated Security=True");
    SqlCommand comsel = new SqlCommand("SELECT [email] FROM [reg] WHERE [email] = @email;",con);
    comsel.Parameters.AddWithValue("@email", str);
    System.Data.SqlClient.SqlDataReader objReader = comsel.ExecuteReader();
    if (objReader.HasRows())
    {
        b = false;
    }
    else
    {
        b = true;   
    }
    con.Close();
  

Ответ №2:

Удалите инструкцию if, проверяющую записи в полях, и добавьте RequiredValidators в вашу форму:

https://web.archive.org/web/20211020145950/https://www.4guysfromrolla.com/webtech/090200-1.shtml

Что касается второй части .. если электронная почта уже существует … создайте для этого пользовательский валидатор и используйте его для отображения сообщения вашему пользователю, если электронная почта уже существует. Обратите внимание, что вы используете ExecuteNonQuery() здесь для того, что по сути является запросом…

Вам также нужно некоторое «разделение проблем». Например, поместите строку подключения в Web.Config. Выполняйте доступ к вашим данным из класса DAL и т. Д

Комментарии:

1. С этим кодом много проблем, но это был не его вопрос.

2. @pseudocoder, я останусь при своем ответе, потому что я не хочу поощрять semsema кодировать его таким образом…

3. Согласен, мне просто горько, потому что кто-то сегодня сделал мне замечание за то, что я предложил правильные методы кодирования вместо того, чтобы просто ответить на вопрос!

4. Я тебя слышу 🙂 Я честно попытаюсь указать кому-то правильное направление и помочь им приблизиться к ответу, когда это возможно. Я тоже опускаюсь — проголосовал за это, но я буду придерживаться своего оружия 😉

Ответ №3:

Для первого запроса вы можете просто использовать ExecuteScalar, поскольку это вернет единственное значение из вашего запроса. Я переписал ваш запрос так, чтобы он выполнял подсчет электронных писем, которые соответствуют электронной почте, которую пытается использовать пользователь. Если возвращаемое значение равно 0, то вы знаете, что электронное письмо в данный момент не используется.

 string strEmail = email_tb.Text.Trim();

try
{
    using(SqlConnection conn = new SqlConnection(@"Data Source=SAMA-PCSQLEXPRESS;Initial Catalog=meral10;Integrated Security=True"))
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT COUNT(1) FROM reg WHERE email = @email", conn);
        cmd.Parameters.AddWithValue("@email", strEmail);

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

        if(count==0)
        {
            birthday = day_ddl.Text   "/"   month_ddl.Text   "/"   year_ddl.Text;

            SqlCommand cmdInsert = new SqlCommand("INSERT INTO reg(first_name,last_name,email,email_ver,pass,gender,birthday) values(@fn,@ln,@email,@reemail,@pass,@gen,@birth)", conn);
            cmdInsert.Parameters.AddWithValue("@fn", firstname_tb.Text);
            cmdInsert.Parameters.AddWithValue("@ln", lastname_tb.Text);
            cmdInsert.Parameters.AddWithValue("@email", email_tb.Text);
            cmdInsert.Parameters.AddWithValue("@reemail", reemail_tb.Text);
            cmdInsert.Parameters.AddWithValue("@pass", pass_tb.Text);
            cmdInsert.Parameters.AddWithValue("@gen", gender_ddl.SelectedItem.Text);
            cmdInsert.Parameters.AddWithValue("@birth", birthday);
            cmdInsert.ExecuteNonQuery();
            Label9.Text = "thank you for registration";
            Label9.Visible = true;
        }
        else
        {
            Label9.Text = "this email already exist choose another one";
            Label9.Visible = true;
        }
    }
}
catch(SqlException ex)
{
    // log your exception then display a friendly message to user
    Label9.Text = "An error occurred while trying to save your registration";
}