我在数据库中得到最小的数字。但是,当数据库中没有数据时,我会收到此错误。
System.InvalidCastException:'无法从DBNull将对象分配给其他类型。'
代码:
SqlCommand cmd = new SqlCommand("SELECT MAX(GidenEvrakSira) FROM GidenEvrak", con);
SqlCommand smd = new SqlCommand("Select Min(GidenEvrakSira) FROM GidenEvrak Where UserID is null", con);
con.Open();
maxnum = Convert.ToInt32(cmd.ExecuteScalar());
minum = Convert.ToInt32(smd.ExecuteScalar());
con.Close();
在运行时(在ODP.NET下进行了测试,但在任何ADO.NET提供程序下均应相同),它的行为是这样的:
如果该行不存在,则cmd.ExecuteScalar()
的结果为null,然后将其强制转换为空字符串并分配给getusername。如果该行存在,但用户名中为NULL(甚至在您的数据库中也可以吗?),则cmd.ExecuteScalar()
的结果为DBNull.Value,结果为InvalidCastException
。无论如何,NullReferenceException
应该是不可能的,因此您的问题可能出在其他地方。
通过ISNULL
函数将最大值/最小值包围起来,将查询更改为始终返回值。
SqlCommand cmd = new SqlCommand("SELECT isnull(MAX(GidenEvrakSira),0) FROM GidenEvrak", con);
SqlCommand smd = new SqlCommand("Select isnull(Min(GidenEvrakSira),0) FROM GidenEvrak Where UserID is null", con);
con.Open();
maxnum = Convert.ToInt32(cmd.ExecuteScalar());
minum = Convert.ToInt32(smd.ExecuteScalar());
con.Close();
jdweng评论中的建议正在起作用:
var results = (cmd.ExecuteScalar() == DBNull.Value) ? null : cmd.ExecuteScalar();