2017-11-18 139 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

相關問題