C# 将sqldatareader中的数据与登录详细信息C(新手)进行比较时出现问题

C# 将sqldatareader中的数据与登录详细信息C(新手)进行比较时出现问题,c#,sql,visual-studio,webforms,sqldatareader,C#,Sql,Visual Studio,Webforms,Sqldatareader,我的代码中的if语句有一个问题,就我的一生而言,我无法理解为什么这个条件不能恢复为真 private bool ValidationFunction(string UserName, string Password) { bool returnBool = false; var strConnection = ConfigurationManager.ConnectionStrings["BankConnectionString"].ConnectionString;

我的代码中的if语句有一个问题,就我的一生而言,我无法理解为什么这个条件不能恢复为真

private bool ValidationFunction(string UserName, string Password)
{
    bool returnBool = false;

    var strConnection = ConfigurationManager.ConnectionStrings["BankConnectionString"].ConnectionString;
    SqlConnection sqlConnection = new SqlConnection(strConnection);

    string query = "SELECT " + COLUMN_ID + ", " + COLUMN_MACHINEPIN + " FROM " + PERSON_TABLE + " WHERE " + COLUMN_ID + " = \'" + UserName + "\' AND " + COLUMN_MACHINEPIN + " = \'" + Password + "\'";
    SqlCommand command = new SqlCommand(query, sqlConnection);
    SqlDataReader rdr;

    sqlConnection.Open();
    rdr = command.ExecuteReader();

    while(rdr.Read())
    {
        if (UserName == rdr["Id"].ToString() & Password == rdr["MachinePin"].ToString())
        {
            returnBool = true;
        }

        return returnBool;
    }
    rdr.Close();
    return returnBool;
}
我已经尝试使用了列的名称和查询中使用的常量,但两者都不起作用,我无法完全让它起作用。任何帮助都将不胜感激

编辑:原来我从数据库检索的数据有额外的空白,因为我使用了nchar,所以我必须使用修剪功能。

尝试以下方法:

   var username = rdr["Id"].ToString() 
   var password = rdr["MachinePin"].ToString())
   Debugger.Break(); 
在debugger语句中,打开即时窗口并手动键入比较,直到确定根本原因

UserName==username;
Password = password;
调试提示 你知道如何打开即时窗口吗?转到Debug/Windows/Immediate。它允许您在调试点键入C语句

无法读取任何数据 如果无法读取rdr[Id],例如无效操作等,则存在以下问题之一:

连接字符串从未打开连接 错误的数据库/表 字段名不正确 安全故障。 你应该检查每个步骤的状态码,如果你没有看到任何东西,那么这很可能是一个安全问题,因为银行没有公布出错的地方,这是有意义的,不要告诉黑客任何事情

安全问题 如果是安全问题,你必须降低到有线级别。跟踪并查看返回代码。另一方将首先结束会议。您应该在开放通信之前看到安全层握手,如果握手不起作用,会话将立即终止,没有进一步的细节

追踪
Wireshark使用简单,下载速度快,可以在线显示所有内容。使用Wireshark进一步深入研究应用层看不到的内容

您应该使用&&而不是&

我也会清理一下你的代码。通过不参数化输入,您将面临SQL注入攻击

您还可以使用块将一次性对象包裹在中。它将使您的代码更干净、更具可读性

using (var conn = new SqlConnection("your connection"))
{
  using (var cmd = new SqlCommand(sql, conn))
  {
    conn.Open();
    using (var rdr = cmd.ExecuteReader())
    {
      ...
    }
  }
}
请尝试以下方法:

 if ((UserName == (string)rdr["Id"]) && (Password == (string)rdr["MachinePin"]))
            {
                returnBool = true;
            }

您应该使用&&运算符而不是single&您应该研究参数化。如果像这样连接查询,则会受到sql注入攻击。我发现它对调试也有很大帮助。我已经更改了运算符,但它仍然不起作用。不过,感谢你的建议:这是我在软件开发方面的第一年大学学习,所以一旦我的程序达到var username=rdr[Id],我们仍然在学习很多东西.ToString我收到一个InvalidOperationException,它告诉我在没有数据存在时读取的尝试无效,因此我假定没有从数据库中读取数据?好的,这告诉我需要备份一点,可能是连接字符串错误,或者读取尝试被拒绝。在这一点上,我将做两件事,确定是否建立了连接,以及是否有任何错误代码在连接后一直返回到读取。这些错误代码应该告诉您需要知道的内容。对于银行来说,它们是超级安全的。。。您可能正在使用安全功能。。。只是猜测。如果这有什么不同,我可以执行数据库插入,可以看到新的值,但我不能从itOk中读取。下一步是转到wire层,或者在尝试读取记录时仔细查看任何异常。我猜读的不是格式错误就是不允许。如果运行wire shark跟踪,请告诉我们上次从主机端返回的读取请求是什么?