繁体   English   中英

从SQL数据库返回单个值时,C#InvalidCastException

[英]C# InvalidCastException when returning single value from SQL database

我正在尝试从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;
    }

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

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

由于您未指定,因此我假设这是问题所在:

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

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

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

检查DbNull的返回值并从数据层返回默认值,或者检查查询和数据库以确保不返回null

一些SQL Server认为空列表的总和为null而不是0。因此,您必须自己处理从null到int的转换。 不直接将查询结果转换为int。

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

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

可能您可以做的是...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM