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-PC\SQLEXPRESS;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;
}
}
当我尝试输入已输入的数据库中的电子邮件时,存在一个问题,它必须向用户显示此电子邮件已存在于数据库中。任何人都可以帮助我吗?
答案 0 :(得分:1)
好的,据我所知,如果电子邮件在[reg].[email]
字段中是唯一的,您只希望INSERT发生。如果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;
其中您以与下面的INSERT操作类似的方式将变量“str”指定为参数。然后,只需检查SqlDataReader是否有任何行,而不是遍历结果:
SqlConnection con = new SqlConnection(@"Data Source=SAMA-PC\SQLEXPRESS;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();
答案 1 :(得分:0)
删除if语句检查字段条目并将RequiredValidators添加到表单中:
http://www.4guysfromrolla.com/webtech/090200-1.shtml
至于第二部分..如果电子邮件已经存在...为此创建一个自定义验证器,如果电子邮件已存在,则使用此验证码向用户显示该邮件。请注意,您在这里使用的是ExecuteNonQuery(),本质上是一个查询...
你还需要一些“关注点分离”。例如,将连接字符串放在Web.Config中。您是否可以从DAL类等访问数据
答案 2 :(得分:0)
对于第一个查询,您可以使用ExecuteScalar,因为它将从您的查询返回单个值。我重写了您的查询,以便它会计算与用户尝试使用的电子邮件相匹配的电子邮件。如果返回的计数为0,那么您就知道该电子邮件当前未被使用。
string strEmail = email_tb.Text.Trim();
try
{
using(SqlConnection conn = new SqlConnection(@"Data Source=SAMA-PC\SQLEXPRESS;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";
}