2016-02-12 95 views
0

我想寻求帮助,以什么使这个代码需要太长时间的过程:需要帮助,循环数据库的时间太长

using (OleDbDataReader dr = command.ExecuteReader()){ 
     while (dr.Read()) 
     { 
      count += 1; 
    if (Convert.ToDecimal(dr["AMOUNT"]) ==  Convert.ToDecimal(0.00) && 
    Convert.ToDecimal(dr["PENALTY"]) == Convert.ToDecimal(0.00) && Convert.ToDecimal(dr["DEPDIV"]) == Convert.ToDecimal(0.00)) 
     { 
      //Cancel Upload and let user check is .DTLS contains Amount 
      ViewBag.Message = "UPLOADING CANCELLED!! : .DTLS file does not contain any amount for the Following Fields :" 
     + "AMOUNT UNPAID, " 
     + "PENALTY " 
     + "DEPDIV " 
     + "PLEASE CHECK INGRES SETTING FOR MONEY FORMAT(REQUIRED MONEY FORMAT IS : II_MONEY_FORMAT=L:á" 
     + "THEN REDOWNLOAD THE .MAST and DTLS FILE from the DELINQUENT EMPLOYERS EXTRACTION UTILITY BEFORE UPLOADING"; 

      return View(); 
     } 
     else 
     { 
      string Acctno, EyerID, Percov; 
      decimal Amount, Penalty, DepDiv; 

      EyerID = dr["EYERID"].ToString().Trim(); 
      Percov = dr["PERCOV"].ToString().Trim(); 
      Amount = Convert.ToDecimal(dr["AMOUNT"]); 
      Penalty = Convert.ToDecimal(dr["PENALTY"]); 
      DepDiv = Convert.ToDecimal(dr["DEPDIV"]); 
      Acctno = SaveUpdateTransMaster.spRetrieveAcctNo(EyerID, brid, "MCDEL", Convert.ToDateTime(currCutoff)); 

      ListLedger.Add(new TransLedger 
      { 
       EyerID = EyerID, 
       AcctNo = Acctno, 
       Percov = Percov, 
       AmtDue = Amount, 
       Penalty = Penalty, 
       DepDiv = DepDiv, 
      }); 
     } 
    } 
} 

"MCDEL"); 
} 

foreach (var row in ListLedger) 
{ 
    SaveUpdateTransMaster.spUploadTransLedgerCA(row.AcctNo, row.EyerID, 
    currCutoff, row.Percov,Convert.ToDecimal(row.AmtDue), Convert.ToDecimal(row.Penalty), 
    Convert.ToDecimal(row.DepDiv), brid, "MCDEL"); 
} 

这里是我的情况:

我通常取数百万行到FoxPRO DBF,将其存储到列表 ,并通过StoredProc将其插入数据库。

+0

哪部分代码占用了大量时间?根据你提供的例子,人们只能猜测'using'和'foreach'语句可能是瓶颈,因为访问数据库和otehrone似乎做一些网络操作,对吧? – nozzleman

+0

循环数百万次并不是一个好主意,试着找到一种方法来使用导入/导出向导从DBF导入数据。为此也可能有一些免费的工具。 – FLICKER

+0

@nozzleman - 先生,通常需要时间的部分是整个while循环过程。在1小时内,它只能将72936行添加到列表中 – mj5460

回答

0

看起来你正在复制你的一些代码。当你创建每一行时,你将Amount,Penalty和DepDiv转换成小数,然后当你上传它们时,你再次将这些字段转换为十进制。另外,你正在if语句的条件部分中计算它们。您应该在if语句之前计算每行的值,以减少一些代码重复并节省时间。即使每行只节省一毫秒,也就是每百万行约17分钟。

但是,正如Alan B所建议的那样,也许您可​​以发布Foxpro查询的代码,并且我们可以查看速度和/或数据格式的改进。可能还会更改查询以输出可以直接导入到SQL Server的内容,例如逗号或制表符分隔的文件。