Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编辑大型数据表性能问题_C#_Winforms_Datatable - Fatal编程技术网

C# 编辑大型数据表性能问题

C# 编辑大型数据表性能问题,c#,winforms,datatable,C#,Winforms,Datatable,我有一个数据表,大约有10万条记录。Datatable有多个包含一些整数值的列。我需要添加这些整数值,并将其写入列Total Count和Common Count。我正在使用下面的代码,但大约需要10-15秒。我怎样才能有效地做到这一点 编辑的部分开始 cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@pudTowerList", SqlDbType.VarChar, 8000).Value = cellId;

我有一个数据表,大约有10万条记录。Datatable有多个包含一些整数值的列。我需要添加这些整数值,并将其写入列
Total Count
Common 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
    }             
foreach(数据行中的数据行drow)
{
int nTotalCount=0;
int nCommonCount=0;
对于(int i=2;i
找到替换的方法

int.Parse(drow[i].ToString());
直接铸造:

(int)drow[i];
如果您的单元格值中已经没有整数,请尽可能将它们保留在单元格中

除此之外,请注意列值更新可能引发的任何事件,这可能是导致您速度减慢的原因


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

我建议不要在c#中执行如此繁重的任务,而是从sql server it self返回此计算值(尝试在存储过程中处理此繁重数据)并返回计算值。

您可以在sql中计算此值,而不是在c#中计算,如下所示:

SELECT Id,Col1,Col2,Col3, 
Col1+Col2+Col3 as TotalCount,
SIGN(Col1)+SIGN(Col2)+SIGN(Col3) as CommonCount
FROM test.SO1;
如果必须使用C#,我建议立即改进,用一个Convert()调用替换两个Parse()调用。您还将避免两个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++;
}

但是如果它是只读的。。我怎样才能编辑这本书values@Anirudh我不打算在数据库中插入总数。这仅用于在网格中显示值。请看我编辑的问题,从我的理解来看,nTotalCount是所有列值的总和,NcomonCount是不是零的列值的数量。我理解对了吗?请澄清。您的意思是程序返回我的计算值性能不影响计算总数和常用计数值,但在我们将值分配给datarow的行。如果我评论这两行代码,它实际上运行时的性能相当令人满意。上面提到的c代码中的差异使我的测试性能提高了40-60%。但正如您所说,如果赋值是瓶颈,我可以建议使用TPL/多线程,但我不确定它在这种情况下是否有帮助。您可以分享更多信息或向我们展示如何向DataTable添加列的代码吗?我已经在其中展示了我的问题。。我通过DataReaderHanks Rajeev填充datatable。但我想了解的是,如果“Total Count”和“Common Count”列来自StoredProc本身,或者您使用的是dt.columns.Add(new DataColumn(){ColumnName=“Col1”,DataType=typeof(int)});要将这些列添加到DataTable?它们来自存储的proc,但默认值为“0”