C# 如何检查SQL数据库是否已输入用户名?
我已经编写了此注册表,它将数据添加到我的SQL Server数据库中。我想要的是当用户输入数据库中已有的用户名时出现异常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
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中的语法。这是一个公认的答案。