【问题标题】:My c# code goes thorough all if statements although all of them are false我的 c# 代码对所有 if 语句都进行了彻底检查,尽管它们都是错误的
【发布时间】:2019-05-15 12:48:42
【问题描述】:

我有一个考勤表程序。我已经三次检查了我的数据库表,它们的所有列都是空的。我说如果它们不为空,则尽管它们都是空的,但它们都通过了:D 我不知道出了什么问题。

private void textBoxX1_KeyDown(object sender, KeyEventArgs e)
{
    sqlcon.Close();
    sqlcon.Open();

    if (e.KeyCode == Keys.Enter)
    {
        string t = lbl_Time.Text;
        string d = lbl_Date.Text;

        string selectQueryName = "SELECT name FROM tbl_attendanceMembers where memberCode=" + "'" + textBoxX1.Text + "'";
        var sqlcmdName = new SqlCommand(selectQueryName, sqlcon);
        var resultName = sqlcmdName.ExecuteScalar();

        string selectQueryId = "SELECT MAX(id) FROM tbl_attendanceSheet";
        var sqlcmdId = new SqlCommand(selectQueryId, sqlcon);
        var resultId = sqlcmdId.ExecuteScalar();

        (1)if (resultId != null)
        {
            string selectQueryCockin = "SELECT Clockin FROM tbl_attendanceSheet where id=" + "resultId";
            var sqlcmdCockin = new SqlCommand(selectQueryCockin, sqlcon);
            var resultCockin = sqlcmdId.ExecuteScalar();

           (2)if (resultCockin != null)
            {
                (3)if (resultName != null)
                {

                    this.lbl_mmbrname.Text = resultName.ToString();
                    this.lbl_timestored.Text = t;
                    textBoxX1.Clear();                       
                }    
            }
        }
        else //if result id == null
        {
            sqlcon.Open();
            SqlCommand sqlcmdClockin = new SqlCommand("InputClockIn", sqlcon);
            sqlcmdClockin.CommandType = CommandType.StoredProcedure;
            sqlcmdClockin.Parameters.AddWithValue("@InputDate", d);
            sqlcmdClockin.Parameters.AddWithValue("@InputTime", t);
            sqlcmdClockin.ExecuteNonQuery();
            SqlDataAdapter sqlda = new SqlDataAdapter("SELECT * FROM tbl_attendanceMembers", sqlcon);
            DataTable dt = new DataTable();
            sqlda.Fill(dt);
            dataGridView1.DataSource = dt;
        }

        sqlcon.Close();

    }
}

当我执行这段代码时,它等于lbl_mmbrname.TextresultNamelbl_timestored.Text = t。所以这意味着它一直到第三个 if 语句是错误的......

我已经通过中断点(f9)检查了它。

第一个sqlcon.close(); 是因为如果我不写它会说连接没有关闭,这对我来说没有意义,因为我在那里写了sqlcon.close();...

【问题讨论】:

  • 确定要+ "resultId" 而不是+ resultId?也不要使用字符串连接来创建查询。使用参数化查询!这很容易受到 sql 注入的影响
  • 哇,你说得对。我必须纠正它。你能带我去一个关于学习更多和防止 SQL 注入的链接吗?谢谢你的建议
  • 最简单的 - 输入谷歌 ;)
  • @GiladGreen 是的,谢谢你

标签: c# if-statement null boolean


【解决方案1】:

根据this,如果DbCommand.ExecuteScalar()数据库返回null,您的查询将返回DbNull.Value对象。 所以我想你需要检查一下而不是null

编辑 有相关说明:

如果未找到结果集中第一行的第一列,则返回空引用。如果数据库中的值为空,则查询返回 DBNull.Value。

所以它可以同时返回 nullDBNull.Value

【讨论】:

  • 感谢编辑! OP 有一个后续问题,因为我没有发布完整的答案。