0

我有一个包含大约 10 万条记录的数据表。Datatable 有多个包含一些整数值的列。我需要添加这些整数值并将其写入列Total CountCommon Count. 我正在使用以下代码,但大约需要 10-15 秒。我怎样才能有效地做到这一点?

编辑部分开始

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@pudTowerList", SqlDbType.VarChar, 8000).Value = cellId;
cmd.Parameters.Add("@pudTowerCol", SqlDbType.VarChar, 8000).Value = cellIdCol;
sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
SqlCon.Close();
cmd.Dispose();

编辑部分结束

在这里我编辑这个数据,然后在最后绑定到gridview

 foreach (DataRow drow in dt.Rows)
   {
      int nTotalCount = 0;
      int nCommonCount = 0;
      for (int i = 2; i < nColumnCount; i++)
      {
         nTotalCount += int.Parse(drow[i].ToString());
         if (int.Parse(drow[i].ToString()) != 0)
         {
            nCommonCount += 1;
         }
      }
       drow["Total Count"] = nTotalCount; // On commenting this lines it runs fast
       drow["Common Count"] = nCommonCount; // On commenting this lines it runs fast
    }             
4

3 回答 3

0

寻找替代方法

int.Parse(drow[i].ToString());

直接铸造:

(int)drow[i];

如果单元格值中没有整数,请尽一切可能将它们放在那里。

除此之外 - 留意任何可能因列值更新而触发的事件 - 也许这就是让你慢下来的原因。

另一个想法:使用 SQL 计算列值!

于 2013-09-18T05:57:32.507 回答
0

我建议不要在 c# 中执行如此繁重的任务,而是从它自己的 sql server 返回这个计算值(尝试在存储过程中操作这些繁重的数据)并返回计算值。

于 2013-09-18T07:42:04.767 回答
0

您可以在 SQL 中计算,而不是在 C# 中计算,如下所示:

SELECT Id,Col1,Col2,Col3, 
Col1+Col2+Col3 as TotalCount,
SIGN(Col1)+SIGN(Col2)+SIGN(Col3) as CommonCount
FROM test.SO1;

如果您必须使用 C#,我可以建议的直接改进是将两个 Parse() 调用替换为一个 Convert() 调用。您还将避免两次 ToString() 调用。尝试这个:

代替

nTotalCount += int.Parse(drow[i].ToString());
if (int.Parse(drow[i].ToString()) != 0)
{
    nCommonCount += 1;
}

有了这个

var val = Convert.ToInt32(drow[i]);
if(val != 0)
{
    nTotalCount += val;
    nCommonCount++;
}
于 2013-09-18T08:21:52.623 回答