【问题标题】:Object cannot be assigned to other types from DBNull对象不能从 DBNull 分配给其他类型
【发布时间】:2019-10-05 03:44:05
【问题描述】:

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

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

【问题讨论】:

  • 对不起。您收到的错误信息是什么?请编辑您的问题并添加错误消息的确切文本。
  • 如果没有数据,Min(...)Max(...) 返回值DBNull。在将结果交给Convert.ToInt32 之前,您必须检查此类 NULL 值
  • 将 DBNull 转换为 null。所以尝试这样的事情: var results = (cmd.ExecuteScalar == DBNull.Value) ? null : cmd.ExecuteScalar
  • 是的,它有效。谢谢@jdweng var results = (cmd.ExecuteScalar() == DBNull.Value) ? null : cmd.ExecuteScalar();

标签: c# sql-server asp.net-mvc dbnull executescalar


【解决方案1】:

评论中的 jdweng 建议有效:

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

【讨论】:

  • 这会执行两次命令,这不是一个好习惯,特别是如果命令写入数据。考虑将cmd.ExecuteScalar() 的输出放在一个变量中。
【解决方案2】:

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

如果该行不存在,cmd.ExecuteScalar() 的结果为空,然后将其转换为空字符串并分配给 getusername。 如果该行存在,但用户名中有 NULL(这在您的 DB 中甚至可能吗?),cmd.ExecuteScalar() 的结果是 DBNull.Value,导致InvalidCastException。 无论如何,NullReferenceException 应该是不可能的,所以你的问题可能出在其他地方。

【讨论】:

  • 没有。我确定问题就在这里。它只需要在 if 循环中。我找不到这条路。 :(
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多