对象不能从 DBNull 分配给其他类型

Object cannot be assigned to other types from DBNull

我在我的数据库中获得了最小数量。但是当我的数据库中没有数据时,我会收到此错误。

System.InvalidCastException: 'The object cannot be assigned to other types from 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()的结果为空,然后将其转换为空字符串并分配给getusername。 如果该行存在,但用户名为 NULL(这在您的数据库中甚至可能吗?),cmd.ExecuteScalar() 的结果是 DBNull.Value,导致 InvalidCastException。 无论如何,NullReferenceException 应该是不可能的,所以你的问题可能出在其他地方。

评论中的 jdweng 建议有效:

var results = (cmd.ExecuteScalar() == DBNull.Value) ? null : cmd.ExecuteScalar();

通过用 ISNULL 函数围绕 max/min 将您的查询更改为始终 return 值。

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();