C# 用户名重复验证

C# 用户名重复验证,c#,sql,C#,Sql,我正在为我们的论文做一个简单的登录页面,我已经完成了字符长度和密码不匹配验证。。我的问题是,如果给定的用户名已经存在于我的数据库中,我如何测试。。。。我正在用C#编写代码,并将SQL management studio R2用于我的数据库 private void add_Click(object sender, EventArgs e) { string UserName = textBox1.Text; string Password = maskedTextBox1.Text;

我正在为我们的论文做一个简单的登录页面,我已经完成了字符长度和密码不匹配验证。。我的问题是,如果给定的用户名已经存在于我的数据库中,我如何测试。。。。我正在用C#编写代码,并将SQL management studio R2用于我的数据库

private void add_Click(object sender, EventArgs e)
{
  string UserName = textBox1.Text;
  string Password = maskedTextBox1.Text;

  if (Password.Length <= MiN_LENGHT && UserName.Length <= MiN_LENGHT)
  {
    errorProvider1.SetError(textBox1, "User name must be at least 8 character");
    errorProvider2.SetError(maskedTextBox1, @"Password must be at least 8 character");

    maskedTextBox1.Clear();
    maskedTextBox2.Clear();
  }
  else if (maskedTextBox1.Text != maskedTextBox2.Text)
  {
    errorProvider1.SetError(maskedTextBox2, "Passwords don't match");

    maskedTextBox1.Clear();
    maskedTextBox2.Clear();
  }
  else if (textBox1.Text == "" || maskedTextBox1.Text == "" || 
           maskedTextBox2.Text == "")
  {
    MessageBox.Show("Please fill up the required records", "Information", 
                     MessageBoxButtons.OK, MessageBoxIcon.Warning);
  }
  else
  {
    x.da.InsertCommand = new SqlCommand(@"Insert into PlayerList 
                                         VALUES(@uname,@pw,@repw)", x.cs);
    x.da.InsertCommand.Parameters.Add("@uname", SqlDbType.NVarChar).Value =
                                         textBox1.Text;
    x.da.InsertCommand.Parameters.Add("@pw", SqlDbType.NVarChar).Value =  
                                         maskedTextBox1.Text;
    x.da.InsertCommand.Parameters.Add("@repw", SqlDbType.NVarChar).Value = 
                                         maskedTextBox2.Text;
    x.cs.Open();
    x.da.InsertCommand.ExecuteNonQuery();
    MessageBox.Show("Record Added", "Information", MessageBoxButtons.OK, 
                                         MessageBoxIcon.Information);
    button3.Enabled = true;
    x.da.SelectCommand = new SqlCommand( @"Select PlayerCode, uname from 
                                         PlayerList", x.cs);
    x.ds.Clear();
    x.da.Fill(x.ds);
    dataGridView1.DataSource = x.ds.Tables[0];
    x.cs.Close();
  }
}
private void add\u单击(对象发送者,事件参数e)
{
字符串UserName=textBox1.Text;
字符串密码=maskedTextBox1.Text;

如果(Password.Length您可以在数据库的username字段上添加一个唯一的约束或索引,并捕获异常,或者您可以事先搜索异常。我建议使用第一种替代方法,因为它可以避免竞争条件,但这不应妨碍您进行搜索。

在存储新用户之前,您首先检查I如果该用户名已存在于数据库中,如果该用户不存在,则保存该记录


如果该用户名确实存在,您将跳过保存,并向用户显示一条友好消息,说明其用户名已在使用中

 select username from user_mst where username='"+textusernm.text+"';
如果有,则jst显示错误消息并禁用保存按钮
&如果不是jst,请启用保存按钮并保存它

您确定要在登录页面中执行验证吗?我认为完成的验证是注册页面

您可以通过两种方式进行验证

1-->在用户输入用户名后执行ajax调用,如果用户名已经存在,则显示重复消息。(这意味着用户将提供密码,从而节省用户时间)


2-->在第二种方法中,您可以完全在服务器端进行验证。获取用户名并将其与现有用户名进行比较,然后相应地显示消息。

您真的需要自己编写此消息吗?因为成员资格提供程序具有所有这些内置功能。另外,您似乎将密码存储为纯文本,这不是好主意。如果您对用户表没有任何重新定义,我认为SqlMembershipProvider&FormsAuthentication是最好的解决方案。对
uname
列是否有唯一性约束?但由于并发性,您仍然需要约束并处理错误。我不推荐第一个选项,因为您不应该这样做依靠异常来检查某些操作是否有效。@SimonHalsey因此,为创建带有事务处理的存储过程(这似乎超出了本问题的范围),如何避免争用条件?数据库必须确保数据的完整性。您接受争用条件有时可能发生,但它将是异常。使用如您所建议的唯一约束,但只需先进行检查并处理重复项。您将避免抛出大多数昂贵的异常。如果发生竞争,请捕获并处理它。@SimonHalsey这就是“排除”的原因意思是这一点不清楚。我读到它的时候,你建议使用异常进行流控制。这是一种可怕的方式。它完全容易受到SQL注入攻击。这就是我展示的方式,即使我知道我们可以使用参数传递文本框值,甚至我们可以加密它,然后传递它。我想我需要向你解释一下,不是吗为什么jst是这样写的,传递值的方式有很多,这取决于ypu如何传递来防止sql注入你不必向我解释,不。向OP解释,是的。在展示原理时给出一个坏的例子从来都不是好的。=)我知道这一点,但它如何检查它是否存在?为此,我为现有用户提供了“选择”,当您在textbox中键入用户名时,查询将在textchanged事件中pic该值并在数据库中检查该用户名,如果它将在db中找到该名称,则它将启用“保存”按钮,然后您可以保存它,否则不会