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

时间:2011-11-08 13:39:54

标签: c# sql exception

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

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

似乎错误消息是明确的 - 您的查询返回null(在.NET中将是DbNull)。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

你可以做的就是......

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