我有一个出勤表程序。我对数据库表进行了三重检查,并且它们的所有列均为空。我说过,如果它们不为null,则尽管它们全部为null,但它们都经过所有: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.Text
到resultName
和lbl_timestored.Text = t
。因此,这意味着它一直贯穿到第三个if语句,这是错误的...
我已经通过断点(f9)进行了检查。
由于第一个sqlcon.close();
是因为如果我不写它,它将说连接未关闭,这对我来说是没有意义的,因为我在此处写了一个sqlcon.close();
... >
答案 0 :(得分:3)
根据this,如果在DbCommand.ExecuteScalar()
上数据库返回null,则您的查询将返回一个DbNull.Value对象。
所以我想您需要检查一下而不是null
编辑 那里的相关评论:
如果未找到结果集中第一行的第一列,则返回空引用。如果数据库中的值为null,则查询返回DBNull.Value。
因此它可以同时返回null
和DBNull.Value