无法从DBNull将对象分配给其他类型

问题描述 投票:2回答:3

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

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();
c# sql-server asp.net-mvc dbnull executescalar
3个回答
0
投票

在运行时(在ODP.NET下进行了测试,但在任何ADO.NET提供程序下均应相同),它的行为是这样的:

如果该行不存在,则cmd.ExecuteScalar()的结果为null,然后将其强制转换为空字符串并分配给getusername。如果该行存在,但用户名中为NULL(甚至在您的数据库中也可以吗?),则cmd.ExecuteScalar()的结果为DBNull.Value,结果为InvalidCastException。无论如何,NullReferenceException应该是不可能的,因此您的问题可能出在其他地方。


0
投票

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

0
投票

jdweng评论中的建议正在起作用:

var results = (cmd.ExecuteScalar() == DBNull.Value) ? null : cmd.ExecuteScalar();
© www.soinside.com 2019 - 2024. All rights reserved.