C#SQL查询-If语句失败

时间:2018-11-29 17:49:22

标签: c#

我正在尝试学习C#,并且正在编写一个必须登录的系统,将数据存储在数据库中并使用代码加载。数据加载没有错误,我可以<form></form>进行加载,一切都很好,但是当我对其进行比较时,它总是失败。这是相关的代码。

编辑:我尝试在字符串比较中不使用$,但仍然无法使用

Console.WriteLine

2 个答案:

答案 0 :(得分:3)

  1. 在查询中始终使用参数而不是字符串连接。它可以防止sql注入(不适用于MS Access),并确保您永远不会出现包含转义字符的字符串的问题。
  2. 我注意到您可能以纯文本形式输入密码,永远不要以纯文本形式存储密码!
  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()相比,这将为您提供更多信息,并且可以解决比您想象的更多的问题。