Мой код C # проходит все операторы if, хотя все они ложные - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть программа посещений.Я трижды проверил свои таблицы базы данных, и все их столбцы равны нулю.Я сказал, что если они не равны нулю, они проходят через них, но, хотя все они равны нулю, они проходят через них все: Я не знаю, в чем дело.

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.Textдо resultName и lbl_timestored.Text = t.Таким образом, это означает, что он прошел весь путь до 3-го оператора if, который является ложным ...

Я проверил его через точки разрыва (f9).

Первым sqlcon.close(); потому что, если я не напишу это, он скажет, что соединение не закрыто, что не имеет смысла для меня, потому что я написал sqlcon.close(); там ...

1 Ответ

0 голосов
/ 14 декабря 2018

Согласно this , если для DbCommand.ExecuteScalar() база данных возвращает ноль, ваш запрос получает возвращенный объект DbNull.Value .Поэтому я думаю, вам нужно проверить это вместо null

РЕДАКТИРОВАТЬ Соответствующее замечание там:

Если первый столбец первой строки вНабор результатов не найден, возвращается нулевая ссылка.Если значение в базе данных равно нулю, запрос возвращает DBNull.Value.

, поэтому он может возвращать как null, так и DBNull.Value

.
...