2017-11-18 140 views
0
for (int i = 9; i < dt.Columns.Count; i++) 
{ 
    string dtcolumn = dt.Columns[i].ColumnName.ToString(); 

    dt.Rows[dt.Rows.Count - 1][i] = Convert.ToInt32(dt.Compute("SUM(" + dtcolumn + ")", " " + dtcolumn + " > 0")); 
} 

它在列值不为空时正在工作。但有时抛出invalidcastexception和显示对象不能从DBNULL转换到其他types.how以避免invalidcastexception获取列名并对数据表中的值求和c#

+0

没有什么不对您的代码,至少无法与已发布的部分。您需要告诉我们如何重现您的问题。 – CodingYoshi

+0

你可以尝试'dt.Compute(“SUM(IsNull([”+ dtcolumn +“],0))”'https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression – Slai

回答

0

您应该添加一个空检查,就像@sajeetharan说的,但他提到的空检查可能无法正常工作,因为这是ADO 。净。你应该使用DBNull检查null。

像这样的事情

for (int i = 9; i < dt.Columns.Count; i++) 
{ 
    if(!DBNull.Value.Equals(dt.Columns[i].ColumnName)) 
    { 
     string dtcolumn = dt.Columns[i].ColumnName.ToString(); 
     dt.Rows[dt.Rows.Count - 1][i] = Convert.ToInt32(dt.Compute("SUM(" + dtcolumn + ")", " " + dtcolumn + " > 0")); 
    } 
} 
+0

你不需要DBNull来检查列的名字是否为空 – CodingYoshi

+0

OP明确表示他得到一个'对象不能从DBNull转换为其他类型'错误 –

+0

是的,OP确实说了,但你的答案并没有解决这个问题,你使用DBNull来检查列名是否为空 - 这不是如何检查它的,你不需要DBNull,即使列不存在,错误也会完全不同,这将是关于列没有找到 – CodingYoshi

0
  for (int j = 0; j < dt.Rows.Count; j++) 
      { 
       for (int k = 9; k < dt.Columns.Count; k++) 
       { 
        if (dt.Rows[j][k].ToString() == "") 
        { 
         dt.Rows[j][k] = "0"; 
        } 
       } 
      } 


    for (int i = 9; i < dt.Columns.Count; i++) 
     { 
     string dtcolumn = dt.Columns[i].ColumnName.ToString(); 
     dt.Rows[dt.Rows.Count - 1][i] = Convert.ToInt32(dt.Compute("SUM(" + dtcolumn + ")", "1 > 0")); 

     } 

谢谢你,这代码工作没有trowing任何异常

+0

* 1> 0 *的含义是什么? – CodingYoshi

+0

它只是用于过滤目的。而不是1> 0您可以使用string.empty或列名> 5或任何筛选器https://msdn.microsoft.com/en-us/library/system.data.datatable.compute(v=vs.110).aspx –

+0

我知道这是一个过滤器,但1总是大于0,那么这会给你带来什么? – CodingYoshi

相关问题