C# Convert.ToInt无法将对象从DBNull强制转换为其他类型

C# Convert.ToInt无法将对象从DBNull强制转换为其他类型,c#,exception,databinder,C#,Exception,Databinder,下面的代码似乎有什么问题?我认为数据库中有null,如何对包含null的列求和 int Total_QtyinHand = 0; int Total_QtyAllocated = 0; int Total_QtyinStock = 0; int Total_QtyUpcoming = 0; protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType ==

下面的代码似乎有什么问题?我认为数据库中有null,如何对包含null的列求和

int Total_QtyinHand = 0;
int Total_QtyAllocated = 0;
int Total_QtyinStock = 0;
int Total_QtyUpcoming = 0;

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // VVV  --- Exception happens on the line below --- VVV
        Total_QtyinHand += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "QuantityonHand"));
        Total_QtyAllocated += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Allocated_Quantity"));
        Total_QtyinStock += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Qty_in_Stock"));
        Total_QtyUpcoming += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "UpcomingStock"));
    }

    else if (e.Row.RowType == DataControlRowType.Footer)
    {
        e.Row.Cells[3].Text = "Total Qty";
        e.Row.Cells[3].Font.Bold = true;

        e.Row.Cells[4].Text = Total_QtyinHand.ToString();
        e.Row.Cells[4].Font.Bold = true;

        e.Row.Cells[5].Text = Total_QtyAllocated.ToString();
        e.Row.Cells[5].Font.Bold = true;

        e.Row.Cells[6].Text = Total_QtyUpcoming.ToString();
        e.Row.Cells[6].Font.Bold = true;
    }

}

这段代码在我的测试中运行良好

tot += DataBinder.Eval(e.Row.DataItem, "mylab").ToString() != string.Empty 
    ? Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "mylab")) 
    : 0;

e.Row.Cells[0].Text = tot.ToString();

当使用数据库API时,如果数据库中存在null值,则将用DBNull.value替换一个值。您的代码试图直接将其转换为int,但失败了。将该值直接与null进行比较也没有帮助,因为该值不是null,而是DBNull.value

因此:

或者,如果该值实际上是隐藏的字符串,则可能需要对其进行解析。最好将数据库的架构升级为实际存储并返回一个数值,稍后将详细介绍:

object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
if (value != DBNull.Value)
{ 
    int result = -1;
    if (int.TryParse((string)value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result))
    {
       Total_QtyinHand += result;
    }
}
当然,您可以在单独的函数中捕获此逻辑,或者使用?:运算符:

object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
Total_QtyinHand += (value == DBNull.Value ? 0 : (int)value);

在研究答案时,您可能会发现许多建议,建议通过字符串对值进行往返运算,然后再次对其进行解析。这会导致非常奇怪的行为,我强烈建议不要这样做。我甚至写了一封信。如果您的模式是正确的,那么数据库中的值已经是数字格式,并且没有理由在文化解析中引入各种奇怪的行为。使用.Parse或.TryParse方法时,请确保为其提供所需的NumberStyle和数字存储的区域性,以防止意外的分析错误,例如,如果十进制分隔符设置不正确,则将值乘以100。

哪一行会引发该异常?通过将0指定为null。尝试这种方式,该行会引发异常总数\u qtyHand+=Convert.ToInt32DataBinder.Evale.Row.DataItem,QuantityonHand;为什么不使用TryParse?int-outValue=0;int.TryParseDataBinder.Evale.Row.DataItem,QuantityonHand,out outValue;总_qtyHand+=输出值;当然,DataBinder.Evale.Row.DataItem QuantityonHand可以提取到一个变量中,因为这样会使代码无法读取!String.isnullorEmptyDataBinder.Evale.Row.DataItem,QuantityonHand.Tostring then tryyou's bad您也转换为同样坏主意的对象您接受我否决了这个问题,原因有两个:对DataBinder.Eval的双重调用非常昂贵,与null的比较不起作用,由于DataBinder返回的是DBNull.Value和昂贵的字符串转换,因此这是错误的解决方案,即使它可以工作。最后:没有人解释为什么会这样做,以及一开始的错误是什么。谢谢jessehouwing,它会成功的!回答重复和重复的问题的目的是什么?请帮助!问题你已经回答了这个问题,也没有删除这个短语,但你仍然有2万名代表:-\
object value = DataBinder.Eval(e.Row.DataItem, "QuantityonHand");
Total_QtyinHand += (value == DBNull.Value ? 0 : (int)value);