C# 编辑大型数据表性能问题
我有一个数据表,大约有10万条记录。Datatable有多个包含一些整数值的列。我需要添加这些整数值,并将其写入列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;
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”