Ошибка При проверке имени пользователя и электронной почты уже существует в базе данных или нет в asp.net c # - PullRequest
0 голосов
/ 04 ноября 2019

Вот мой код. Когда я нажимаю кнопку регистрации, отображается сообщение об ошибке Email is already Registered и Username is taken, даже если их нет в базе данных.

protected void Page_Load(object sender, EventArgs e)
{
    if (con.State == ConnectionState.Open)
    {
        con.Close();
    }
    con.Open();
}       
protected void fname_TextChanged(object sender, EventArgs e)
{
    CultureInfo cI = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cI.TextInfo;
    fname.Text = textInfo.ToTitleCase(fname.Text);
}
protected void lname_TextChanged(object sender, EventArgs e)
{
    CultureInfo cI = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cI.TextInfo;
    lname.Text = textInfo.ToTitleCase(lname.Text);
}
protected void register_Click(object sender, EventArgs e)
{
    if (checkemail() == false && checkuname() == false)
    {
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into Users values('" + fname.Text + "','" + lname.Text + "','" + email.Text + "','" + uname.Text + "','" + password.Text + "')";
        cmd.ExecuteNonQuery();
    }
    if(checkemail() == true)
    {
        chkmail.Visible = true;
        mailerror.Text = "Email Address already Registered";
    }
    if(checkuname() == true)
    {
        chkuname.Visible = true;
        unameerror.Text = "Username is taken!";
    }

}
private Boolean checkemail()
{
    Boolean emailavailable = false;
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select * from Users where emailId='" + email.Text + "'";
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;
    DataSet ds = new DataSet();
    da.Fill(ds);
    if (ds.Tables[0].Rows.Count > 0)
    {
        emailavailable = true;
    }
    return emailavailable;
}
private Boolean checkuname()
{
    Boolean unameavailable = false;
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select * from Users where username='" + uname.Text + "'";
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;
    DataSet ds = new DataSet();
    da.Fill(ds);
    if (ds.Tables[0].Rows.Count > 0)
    {
        unameavailable = true;
    }
    return unameavailable;
}

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

Если задано существующее имя пользователя, то должно появиться сообщение об ошибке имени пользователя.

Если обе вещи существуют в базе данных, то должны отображаться обе ошибки.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы можете упростить свою логику примерно так:

    if(checkemail())
    {
        chkmail.Visible = true;
        mailerror.Text = "Email Address already Registered";
    }
    else if(checkuname())
    {
        chkuname.Visible = true;
        unameerror.Text = "Username is taken!";
    } 
    else
    {
        chkmail.Visible = false;
        chkuname.Visible = false;
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into Users values('" + fname.Text + "','" + lname.Text + "','" + email.Text + "','" + uname.Text + "','" + password.Text + "')";
        cmd.ExecuteNonQuery();
    }

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

Iя не разработчик C #, но держу пари, что вашим следующим шагом должно стать поиск способов использования параметров связывания в ваших запросах, чтобы вы не объединяли пользовательские входные данные непосредственно в строках запроса.

0 голосов
/ 04 ноября 2019

Я хотел бы рассмотреть возможность изменения кода на что-то вроде примера ниже:

public enum FieldType
{
    EmailAddress,
    UserName
}

protected void register_Click(object sender, EventArgs e)
{
    if(!checkfield(FieldType.EmailAddress) && !checkfield(FieldType.UserName))
    {
        // Both email address and username are avialable
        // do some stuff
        return;
    }
    if(checkfield(FieldType.EmailAddress)
    {
        // Email address is taken
        // do some stuff
        return;
    }
    if(checkfield(FieldType.UserName)
    {
        // Username is taken
        // do some stuff
        return;
    }
}

private bool checkfield(FieldType field)
{
    string sql = string.Empty;
    switch(field)
    {
        case FieldType.EmailAddress:
        sql = "SELECT COUNT(*) FROM Users WHERE emailId = @p;";
        break;

        case FieldType.UserName:
        sql = "SELECT COUNT(*) FROM Users WHERE username = @p;";
        break;
    }
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    switch(field)
    {
        case FieldType.EmailAddress:
        cmd.Parameters.AddWithValue("@p", email.Text);
        break;

        case FieldType.UserName:
        cmd.Parameters.AddWithValue("@p", uname.Text);
        break;
    }
    var rows = cmd.ExecuteScalar();
    if(int.Parse(rows.ToString()) > 0)
    {
        return false;
    }
    return true;
}

Добавление перечисления позволяет вам вызывать один метод и изменять оператор в зависимости от того, какой параметр вы хотите запросить. Кроме того, изменение оператора SQL для возврата количества совпадающих строк, а не таблицы данных, более эффективно, когда вы на самом деле не заинтересованы в результатах, а только в количестве совпадений. Добавление возврата после каждого из операторов в обработчике register_Click предотвращает перемещение кода при выполнении одного из условий, таким образом, пользователь увидит только одно сообщение, а не все. Надеюсь, это поможет!

...