【问题标题】:C# InvalidCastException when returning single value from SQL database从 SQL 数据库返回单个值时 C# InvalidCastException
【发布时间】:2011-11-08 13:39:54
【问题描述】:

我正在尝试从 SQL 数据库返回一个值。但是,每次执行以下方法时,我都会收到一条错误消息:“InvalidCastException 未处理。对象无法从 DBNull 转换为其他类型。”

您能对此有所了解,我们将不胜感激。我使用的方法如下。

谢谢。

    public static int ScrapTotal2(string prdTypeV, string startDateV, string prtCodeV)
    {
        int scrapTotal2;

        SqlParameter prdType = new SqlParameter("@prdType", SqlDbType.VarChar);
        prdType.Value = prdTypeV;
        SqlParameter startDate = new SqlParameter("@startDate", SqlDbType.VarChar);
        startDate.Value = startDateV;
        SqlParameter prtCode = new SqlParameter("@prtCode", SqlDbType.VarChar);
        prtCode.Value = prtCodeV;

        SqlCommand scrapTotal2SC = new SqlCommand("SELECT SUM([QTY_SCRP]) FROM [TBL_PRDMST] WHERE [PRD_CODE] LIKE @prdType AND [PRD_DATE] = @startDate AND [PRT_CODE] LIKE @prtCode", DataAccess.myConnection);
        scrapTotal2SC.Parameters.Add(prdType);
        scrapTotal2SC.Parameters.Add(startDate);
        scrapTotal2SC.Parameters.Add(prtCode);

        DataAccess.myConnection.Open();
        scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar());
        DataAccess.myConnection.Close();

        return scrapTotal2;
    }

【问题讨论】:

  • 您的选择返回 NULL 还是有效值?先签入数据库
  • 您是否有权访问代码并能够对其进行调试?如果您能告诉我们哪一行引发了异常,那就太好了。将你的方法代码包装在 try-catch 中,你会得到有用的信息。

标签: c# sql exception


【解决方案1】:

您的 SELECT 语句返回 NULL 值。您必须先检查它是否为空:

object result = scrapTotal2SC.ExecuteScalar();
if (result == DBNull.Value) 
{ 
    /* write your code */ 
}
else
{
    scrapTotal2 = Convert.ToInt32(result);
}

【讨论】:

  • 谢谢。我错误地假设总和为 0 而不是 null。这效果很好。
【解决方案2】:

由于您没有指定,我将假设这一行是问题所在:

scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar());

当您在数据库中获得 NULL 时,它将在您的代码中转换为 DBNull 类型。此类型无法转换为 Int32

你可以这样检查:

var obj = scrapTotal2SC.ExecuteScalar()
if (obj == DBNull.Value)
{
    // whatever logic you want to handle nulls
} else {
    scrapTotal2 = Convert.ToInt32(obj);
}

【讨论】:

  • 抱歉忘了说明是哪一行引发了问题。感谢您的帮助。
【解决方案3】:

似乎错误消息很清楚 - 您的查询返回 null(在 .NET 中为 DbNull)。

这不能转换为Int32,因为整数是值类型,不能是null

要么检查DbNull 的返回值并从您的数据层返回一个默认值,要么检查您的查询和数据库以确保不会返回null

【讨论】:

  • @RoyiNamir - 但它不会将DbNull 转换为0DbNull != null.
  • @RoyiNamir - 是的,它将null 转换为0,但不是DbNull
  • @Oded,你说得对。当它返回 Dbnull 时,它在 .net 眼中不是 null .....但是这个语句看起来很有趣: if (sdf==DbNull.Value) finalResult=null....然后运行 ​​convert.....funny不是吗?
【解决方案4】:

一些SQL服务器认为空列表的总和是null而不是0。所以你必须自己处理从null到int的转换。不直接将查询结果转换为int。

【讨论】:

    【解决方案5】:

    试试scrapTotal2 = Convert.ToInt32(((string)scrapTotal2SC.ExecuteScalar()));

    【讨论】:

      【解决方案6】:

      错误消息是因为返回值为NULL,而您正试图将其存储在INT 类型变量中......这是无法完成的。

      你能做的大概就是……

      if(retval is null) then assign var = 0.
      

      【讨论】:

      • DBNull 与 null 不同,OP 必须检查是否 retval == DBNull.Value
      • 实际上,我的意思是一样的,但无法收集语法,因此用伪代码编写。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多