C# 如何检查SQL数据库是否已输入用户名?

C# 如何检查SQL数据库是否已输入用户名?,c#,sql,asp.net,C#,Sql,Asp.net,我已经编写了此注册表,它将数据添加到我的SQL Server数据库中。我想要的是当用户输入数据库中已有的用户名时出现异常 protected void Button1_Click(object sender, EventArgs e) { try { SqlConnection conn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConn

我已经编写了此注册表,它将数据添加到我的SQL Server数据库中。我想要的是当用户输入数据库中已有的用户名时出现异常

protected void Button1_Click(object sender, EventArgs e)
{
        try
        {
            SqlConnection conn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
            conn2.Open();    

            string CheckUser = "select Username from UserData where Username like @Username";

            SqlCommand com2 = new SqlCommand(CheckUser, conn2);        
            com2.Parameters.AddWithValue("@Username", "'%"+ UsernameTextBox.Text +"%'");

            com2.ExecuteNonQuery();

            int IsMatch = Convert.ToInt32(com2.ExecuteScalar().ToString());
            conn2.Close();

            if (IsMatch == 0)
            {
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
                conn.Open();

                string InsertQuery = "insert into UserData (Username, Email, Password, Country) values (@Username, @Email, @Password, @Country)";

                SqlCommand com = new SqlCommand(InsertQuery, conn);
                com.Parameters.AddWithValue("@Username", UsernameTextBox.Text);
                com.Parameters.AddWithValue("@Email", EmailTextBox.Text);
                com.Parameters.AddWithValue("@Password", PasswordTextBox.Text);
                com.Parameters.AddWithValue("@Country", CountryDropDownList.SelectedItem.ToString());

                com.ExecuteNonQuery();

                Response.Redirect("Manager.aspx");

                conn.Close();
            }
            else
            {
                Response.Write("User Already Exists!");
            }               
        }
        catch (Exception ex)
        {
            Response.Write(Convert.ToString(ex));
        }
}
当我运行它时,我在下面的一行中得到一个异常:

int IsMatch = Convert.ToInt32(com2.ExecuteScalar().ToString());

它不会返回整数

string CheckUser = "select count(*) from UserData where Username like @Username";
SqlCommand com2 = new SqlCommand(CheckUser, conn2);        
com2.Parameters.AddWithValue("@Username", "'%"+ UsernameTextBox.Text +"%'");
int IsMatch = Convert.ToInt32(com2.ExecuteScalar().ToString());
您不需要使用两个不同的连接。 只需使用一个并在最后关闭它

string CheckUser = "select count(*) from UserData where Username = @Username";
SqlCommand com2 = new SqlCommand(CheckUser, conn2);        
com2.Parameters.AddWithValue("@Username", UsernameTextBox.Text );
int IsMatch = Convert.ToInt32(com2.ExecuteScalar().ToString());

这将返回0或1。这将解决您的问题。看起来您需要返回一个int类型。如果你愿意,也可以把它改成bool。无论如何,此sql语句都会有所帮助!:

select
isnull(convert(bit,(select top 1 case 
                    when username != '' then 1
                    else 0 end 
from UserData
where username like @Username)),0)

布拉姆的第二个解决方案是可行的,但是可以通过强制转换为int而不是字符串和解析来简化IsMatch

这也应该在数据库级别处理。在用户名列上设置主键:

ALTER TABLE UserData ADD CONSTRAINT
PK_UserData PRIMARY KEY CLUSTERED (Username) 
如果您这样做,那么您甚至不必显式地检查重复项,您可以尝试创建用户并在异常失败时处理异常:

        try
        {
            using (var conn = new SqlConnection((ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString)))
            {
                conn.Open();

#if DOUBLE_CHECK
                string CheckUser = "select count(*) from UserData where Username = @Username";
                SqlCommand com2 = new SqlCommand(CheckUser, conn);
                com2.Parameters.AddWithValue("@Username", UsernameTextBox.Text);
                if ((int)com2.ExecuteScalar() > 0)
                {
                    Response.Write("User already exists");
                    return;
                }
#endif                  
                string InsertQuerry = "insert into UserData (Username,Email,Password,Country) values (@Username,@Email,@Password,@Country)";
                SqlCommand com = new SqlCommand(InsertQuerry, conn);
                com.Parameters.AddWithValue("@Username", UsernameTextBox.Text);
                com.Parameters.AddWithValue("@Email", EmailTextBox.Text);
                com.Parameters.AddWithValue("@Password", PasswordTextBox.Text);
                com.Parameters.AddWithValue("@Country", CountryDropDownList.SelectedItem.ToString());
                com.ExecuteNonQuery();
                Response.Redirect("Manager.aspx");
            }
        }
        catch (SqlException se)
        {
            if (se.Errors.OfType<SqlError>().Any(e => e.Number == 2627))
            {
                Response.Write("User already exists");
            }
            else
            {
                Response.Write(se.ToString());                  
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
如果以这种方式处理异常,则If DOUBLE_CHECK部分是多余的,可以删除。尝试添加重复名称将导致SQL错误和异常,这将检测并处理重复密钥错误

关于代码的两个无关注释:

Response.Redirect将中止当前线程,并且不会调用conn.Close。使用using确保调用它。 将密码以纯文本形式存储在数据库中是一场即将发生的灾难。请看一些关于如何正确执行此操作的想法
异常说明了什么?为什么要执行第一个命令两次-首先是使用com2.ExecuteNonQuery;两行之后是com2.ExecuteScalar??执行一次-这已经足够好了!但是,即使我输入了数据库中已有的用户名,IsMatch仍然返回0。如果您没有正确的语法,请注意,如果您查询Deal,并且用户列表中已经有BillTheDealBreaker,那么查询参数中有“%”,您将得到一个结果。此外,使用“%”作为第一个字符会强制进行完整的表扫描,如果您有大量数据,这可能是一个问题。我建议做一个简单的平等测试。@LL1138我知道Like是如何工作的。这是OP中的语法。这是一个公认的答案。