[英]How to check if SQL database already has the entered Username?
我已经写了这张注册表格,将数据添加到我的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)
Blam的第二个解决方案有效,但是可以通过将其强制转换为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错误和异常,这将检测并处理“重复键”错误。
关于代码的两个不相关的注释:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.