获取列名并对数据表中的值求和c#
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#
您应该添加一个空检查,就像@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"));
}
}
你不需要DBNull来检查列的名字是否为空 – CodingYoshi
OP明确表示他得到一个'对象不能从DBNull转换为其他类型'错误 –
是的,OP确实说了,但你的答案并没有解决这个问题,你使用DBNull来检查列名是否为空 - 这不是如何检查它的,你不需要DBNull,即使列不存在,错误也会完全不同,这将是关于列没有找到 – CodingYoshi
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任何异常
* 1> 0 *的含义是什么? – CodingYoshi
它只是用于过滤目的。而不是1> 0您可以使用string.empty或列名> 5或任何筛选器https://msdn.microsoft.com/en-us/library/system.data.datatable.compute(v=vs.110).aspx –
我知道这是一个过滤器,但1总是大于0,那么这会给你带来什么? – CodingYoshi
没有什么不对您的代码,至少无法与已发布的部分。您需要告诉我们如何重现您的问题。 – CodingYoshi
你可以尝试'dt.Compute(“SUM(IsNull([”+ dtcolumn +“],0))”'https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression – Slai