C# Convert.ToInt无法将对象从DBNull强制转换为其他类型
下面的代码似乎有什么问题?我认为数据库中有null,如何对包含null的列求和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 ==
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);