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的內容,例如逗號或製表符分隔的文件。