0

約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
    }             
4

3 に答える 3

0

C# で計算する代わりに、以下のように SQL でこれを計算できます。

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

C# を使用する必要がある場合は、2 つの Parse() 呼び出しを 1 つの Convert() 呼び出しに置き換えることをお勧めします。また、2 つの 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 に答える
0

このような重いタスクを C# で実行しないことをお勧めします。代わりに、この計算された値を SQL サーバー自体から返し (この重いデータをストアド プロシージャで操作してみてください)、計算された値を返します。

于 2013-09-18T07:42:04.767 に答える