【问题标题】:Can't make check if user already exists in my database无法检查用户是否已存在于我的数据库中
【发布时间】:2023-03-27 22:21:01
【问题描述】:

我开始学习 ASP.NET。我创建了一个注册系统,当我尝试检查数据库中是否已经存在用户名或电子邮件时,它不会被检查并创建用户,即使你已经拥有它。

try
{
    conn.Open();
    bool exists = false;
    string checkuser = "SELECT count(*) FROM accounts WHERE username='" + username.Text + "'";

    SqlCommand cmd2 = new SqlCommand(checkuser, conn);
    cmd2.Parameters.AddWithValue("username", username.Text);

    exists = (int)cmd2.ExecuteScalar() > 0;

    if (exists)
    {
        Response.Write("User already exists");
    }

    string command = "INSERT INTO accounts (username, email, password) VALUES (@username, @email, @password)";

    SqlCommand cmd = new SqlCommand(command, conn);

    cmd.Parameters.AddWithValue("@username", username.Text);
    cmd.Parameters.AddWithValue("@email", email.Text);
    cmd.Parameters.AddWithValue("@password", password.Text);

    cmd.ExecuteNonQuery();
}
catch(Exception)
{
    label_msg.Visible = true;
    label_msg.Text = "Something went wrong....";
    throw;
}
finally
{
    Response.Redirect("/layout.aspx");
    conn.Close();
}

谢谢!

【问题讨论】:

  • 为什么使用 cmd2.Parameters.AddWithValue("username", username.Text);因为你在 cmd2 中没有 @username 参数

标签: c# html css asp.net visual-studio


【解决方案1】:
string checkuser = "if exists (select 1 from accounts where username=@username) select 1 else select 0 end";
SqlCommand cmd2 = new SqlCommand(checkuser, conn);
cmd2.Parameters.AddWithValue("@username", username.Text);

bool exists = (int)cmd2.ExecuteScalar() > 0;

让 SQL Server 检查是否存在匹配项将在第一个匹配项处停止,而不是可能返回一组匹配项,然后它只是相应地返回一个值。这将最大限度地减少服务器和您的软件之间传输的数据,并避免在我们真正关心是否有任何匹配时执行计数。

【讨论】:

  • 在大型数据集上比计数行来确定是否至少存在一个更有效.....
【解决方案2】:

当您想要查找 TRUE/FALSE 值或计算无记录时,请始终使用 COUNT(1)。

【讨论】:

  • 你是什么意思? SELECT count(1) FROM accounts ?
  • 使用 SELECT COUNT(1)SELECT COUNT(*) 是等效的 - 使用 COUNT(1) 没有任何好处
【解决方案3】:
bool exists = false;
string checkuser = "SELECT count(*) FROM accounts WHERE username=@username;";

SqlCommand cmd2 = new SqlCommand(checkuser, conn);
cmd2.Parameters.AddWithValue("@username", username.Text);

object result = cmd2.ExecuteScalar();

if (result != null)
    exists = (Convert.ToInt32(result) == 1) ? true : exists;

if (exists)
{
    Response.Write("User already exists");
}

【讨论】:

  • 使用 parameters 的好答案 - 但在大桌子上使用 COUNT(*) 只是为了检查是否存在不太理想 - 毕竟,您只对知道感兴趣如果(至少)存在一个条目——您不需要知道是否有 717、18904 或 3 个 gazillion 条目——这只会浪费大量时间。使用@RyanGrange 在他的回答中显示的IF EXISTS()
【解决方案4】:

检查用户是否已经存在

int exists = 0;
string checkuser = "SELECT count(*) FROM accounts WHERE username='" +username.Text + "'";

SqlCommand cmd2 = new SqlCommand(checkuser, conn);
cmd2.Parameters.AddWithValue("username", username.Text);

exists = (int)cmd2.ExecuteScalar();

if (exists>0)
{
    Response.Write("User already exists");
}

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2013-03-31
    • 2019-01-17
    • 2021-12-27
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多