【发布时间】: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