我正在尝试学习C#,并且正在编写一个必须登录的系统,将数据存储在数据库中并使用代码加载。数据加载没有错误,我可以<form></form>
进行加载,一切都很好,但是当我对其进行比较时,它总是失败。这是相关的代码。
编辑:我尝试在字符串比较中不使用$,但仍然无法使用
Console.WriteLine
答案 0 :(得分:3)
ExecuteScalar
可以简化逻辑(IMO)。如果要返回数据并使用数据读取器读取数据,则不要使用*
来返回数据。请指定您的列名。这样可以防止代码发生架构更改(例如添加列或更改列顺序)。command.CommandText = "SELECT [Password] FROM [Users] WHERE [Username] = @userName";
// using DbCommand adds a lot more code than if you were to reference a non abstract implementation when adding parameters
var param = command.CreateParameter();
param.ParameterName = "@userName";
param.Value = username_input.Text;
param.DbType = DbType.String;
param.Size = 100;
command.Parameters.Add(param);
// compared with SqlDbCommand which would be 1 line
// command.Parameters.Add("@userName", SqlDbType.VarChar, 100).Value = username_input.Text;
var result = command.ExecuteScalar()?.ToString();
if(string.Equals(password_input.Text, result, StringComparison.Ordinal))
MessageBox.Show("Logged in");
else
MessageBox.Show("Invalid Credentials!");
答案 1 :(得分:0)
从右脚开始学习C#,其中包含一些我已经在注释中看到的建议以及以下一些其他建议:
最小化参数化查询 下面的方法是开放式SQL注入
command.CommandText = $"SELECT * FROM Users WHERE Username = '{username_input.Text}'";
这应该写为:(请记住,可以使用较短的方法来编写此代码,但是由于您正在学习中,所以我很明确)
var usernameParam = new SqlParameter("username", SqlDbType.VarChar);
usernameParam.Value = username_input.Text;
command.Parameters.Add(usernameParam);
command.CommandText = "SELECT * FROM Users WHERE Username = @username";
第二,调试是您的朋友。您需要在失败的行上添加一个断点,并利用内置的Visual Studio Watchers查看变量。与console.writeline()相比,这将为您提供更多信息,并且可以解决比您想象的更多的问题。