【问题标题】:C# Check if the username is not null or empty nor already takenC# 检查用户名是否不为空或为空或已被占用
【发布时间】:2018-03-13 21:35:30
【问题描述】:

正如我所说,我想在注册中检查用户名不为空或为空
也没有采取。

    static SqlConnection Con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=heres_the_path;Integrated Security=True");
    static string name,pass,email;
    static DataTable dt = new DataTable();

请帮我修复代码,问题出在此处:

static bool IsUsernameAlreadyTaken(string name)//Username Checker
    {
        SqlDataAdapter sda = new SqlDataAdapter("SELECT count(*) FROM Login WHERE Nev='" + name + "'", Con);
        sda.Fill(dt);
        if (dt.Rows[0][0].ToString() == "1") return true;
        else return false;
    }

或者在这个while循环中:

static void Register() {  
        Console.WriteLine("What will be your username?");
        while (string.IsNullOrEmpty(name) && IsUsernameAlreadyTaken(name)==false)
        {
            name = Console.ReadLine();
            if (IsUsernameAlreadyTaken(name))
            {
                Console.WriteLine("That's already taken");
            }
            if (string.IsNullOrEmpty(name))
            {
                Console.WriteLine("Why?");
            } 
        }
}

现在,如果我给程序一个已经存在于数据库中的名称,它不会告诉我它已经被占用,只是连续的。

【问题讨论】:

  • “问题出在此处或此处” - 那么,问题出在哪里?当您在调试器中逐步执行此操作时,它与您的预期有何不同/具体有什么不同?
  • 一旦你对逻辑/语法问题进行了排序,你就会遇到一个新问题:即使你检查它没有被占用,它也可能在你尝试添加它之前被占用。因此,与在磁盘等上创建文件相同的正常方法是尝试创建记录并查看它是否有效。如果它有效,那么它没有被采取。如果它不起作用,那么它被采取了。这需要数据库本身检查重复的用户名 - 即它是数据库中的一个键。
  • 我正在使用静态布尔 IsUsernameAlreadyTaken 在数据库中检查它,还是我错了? @AndersForsgren
  • 看到这么多对类全局的静态变量看起来像是代码异味。您应该尽量保持变量范围尽可能小。此外,您的 SQL 代码容易受到 SQL 注入的影响。如果有人输入John'; delete from Login; print 'Bye,您可能会丢失整个用户表。 Register() 中的逻辑也看起来不太好。为什么要检查两次IsNullOrEmpty?为什么显示“为什么?”?我建议您尝试一步一步地重新考虑您的代码应该如何表现。我认为您在 while 条件中添加了 string.IsNullOrEmpty 作为解决方法,以解决名称为空的问题...
  • ..但是如果用户输入了一些东西就会退出循环......另外,为什么在用户输入名称之前检查IsUsernameAlreadyTaken?那没有意义。同样,我建议您不要尝试修复此代码,而是从头开始考虑新的代码。

标签: c# sql while-loop


【解决方案1】:

问题出在这里:

while (string.IsNullOrEmpty(name) && IsUsernameAlreadyTaken(name)==false)

您要求代码执行的操作是:

  1. 检查以确保name 为空或为空
  2. 如果为 null 或为空,请检查是否已被占用。

显然这种逻辑存在严重缺陷。

你是这个意思吗?

while (string.IsNullOrEmpty(name) || IsUsernameAlreadyTaken(name)==false)

【讨论】:

  • 有了你的代码,最好的机器人还不完美。它说“那已经被占用了”,但代码连续并要求输入密码。不再开始循环并询问名称
  • 是的,你应该解决这个问题。
  • while (string.IsNullOrEmpty(name) || IsUsernameAlreadyTaken(name)) 问题解决了
  • 如果在您调用Registername 具有与现有用户匹配的任何值,则不会执行while 循环。我强烈建议您重新考虑您的逻辑,而不是应用一些很快就会给您带来另一个错误的补丁。
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2015-05-04
相关资源
最近更新 更多