您可以通过以下方式简化逻辑:
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();
}
这样,将仅显示一条消息,当一切正常时,将执行插入查询。
我不是C#开发人员,但是我敢打赌,您的下一步应该是寻找在查询上使用绑定参数的方法,这样您就不必在查询字符串上直接串联用户输入。
,
我会考虑将代码更改为以下示例:
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事件处理程序中的每个语句之后添加返回值可以防止代码在满足条件之一时继续前进,这样用户将仅看到一条消息,而不是全部。希望这会有所帮助!
本文链接:https://www.f2er.com/3164161.html