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