2013-09-03 2 views
1

의 시간이 너무 오래 걸리는 것은이 (1000, 나는 주변에 8000 기록과 (항목)이내 코드가 실행

private void button1_Click(object sender, EventArgs e) 
    { 
     double prate = 0; 
     double srate = 0; 
     double rate = 0; 
     double qty = 0; 
     double val = 0; bool b = false; 
     List<string> item = new List<string>(); 
     List<string> brand = new List<string>(); 
     List<string> station = new List<string>(); 
     List<string> dealer = new List<string>(); 
     int m1=0, m2=0; 
     for (int k = 0; k < treeView1.Nodes.Count; k++) 
     { 
      for (int l = 0; l < treeView1.Nodes[k].Nodes.Count; l++) 
      { 

       if (treeView1.Nodes[k].Nodes[l].Checked == true) 
       { 
        brand.Add(treeView1.Nodes[k].Tag.ToString()); 
        item.Add(treeView1.Nodes[k].Nodes[l].Tag.ToString()); 
        m1++; 
       } 
      } 
     } 



     for (int i = 0; i < treeView2.Nodes.Count; i++) 
     { 

      for (int j = 0; j < treeView2.Nodes[i].Nodes.Count; j++) 
      { 
       if (treeView2.Nodes[i].Nodes[j].Checked == true) 
       { 
        station.Add(treeView2.Nodes[i].Tag.ToString()); 
        dealer.Add(treeView2.Nodes[i].Nodes[j].Tag.ToString()); 
        m2++; 
       } 
      } 
     } 

     string[] brands; string[] items; string[] stations; string[] dealers; 
     brands = brand.ToArray(); 
     items = item.ToArray(); 
     stations = station.ToArray(); 
     dealers = dealer.ToArray(); 
     SqlConnection con = new SqlConnection(Global.constr); 
     con.Open(); 
     SqlCommand del = new SqlCommand("delete PLReport", con); 
     del.ExecuteNonQuery(); 
     del.Dispose(); 
     for (int i = 0; i < m1; i++) 
     { 

      prate = 0; 
      SqlCommand cmdr = new SqlCommand("select top 1 purchasePrice from PurchaseDetails where ItemCode='" + item[i] + "' order by doc_date Desc", con); 
      SqlDataReader drr = cmdr.ExecuteReader(); 
      while (drr.Read()) 
      { 
       prate = Convert.ToDouble(drr[0]); 

      } 
      drr.Close(); 
      cmdr.Dispose(); 
      for (int j = 0; j < m2; j++) 
      { 
       SqlCommand cmd33 = new SqlCommand("select slno from SalesDetails where ItemCode='" + items[i] + "' and dealer='" + dealers[j] + "' and date between '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' and '" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "'", con); 
       SqlDataReader r33 = cmd33.ExecuteReader(); 
       if (!r33.HasRows) 
        continue; 
       r33.Close(); 
       cmd33.Dispose(); 
       SqlCommand cmd = new SqlCommand("select sum(Qty),sum(rate) from SalesDetails where ItemCode='" + items[i] + "' and dealer='" + dealers[j] + "' and date between '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' and '" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "' group by ItemCode,Dealer", con); 
       SqlDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 
        //MessageBox.Show("fgfg"); 
        srate = 0; 
        b = double.TryParse(dr[1].ToString(), out srate); 
        rate = 0; 
        if (srate != 0) 
         rate = srate - prate; 
        qty = 0; 
        b = double.TryParse(dr[0].ToString(), out qty); 
        val = qty * rate; 
        if (checkBox3.Checked)//zero valued entry 
        { 
         SqlCommand cmd2 = new SqlCommand("insert PLReport values('" + stations[j] + "','" + dealers[j] + "','" + brands[i] + "','" + items[i] + "','" + val + "')", con); 
         cmd2.ExecuteNonQuery(); 
         cmd2.Dispose(); 
        } 
        else 
        { 
         if (val != 0) 
         { 
          SqlCommand cmd2 = new SqlCommand("insert PLReport values('" + stations[j] + "','" + dealers[j] + "','" + brands[i] + "','" + items[i] + "','" + val + "')", con); 
          cmd2.ExecuteNonQuery(); 
          cmd2.Dispose(); 
         } 
        } 
       } 
       dr.Close(); 
       cmd.Dispose(); 
      } 


     } 


      frmPLReport obj = new frmPLReport(); 
      obj.ttle = "Item Wise Profit & Loss report from " + dateTimePicker1.Value.ToString("dd/MM/yyyy") + " to " + dateTimePicker2.Value.ToString("dd/MM/yyyy"); 
      obj.option = 0; 
      obj.ShowDialog(); 

     con.Close(); 
    } 

하나의 '난'루프가 실행하는 데 약 4 초를 취하고 내 코드입니다 딜러) 400 조건.

이 부분

는 실행 시간이 오래 걸리는 :

SqlCommand cmd = new SqlCommand("select sum(Qty),sum(rate) from SalesDetails where ItemCode='" + items[i] + "' and dealer='" + dealers[j] + "' and date between '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' and '" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "' group by ItemCode,Dealer", con); 
SqlDataReader dr = cmd.ExecuteReader(); 

그것의 너무 오랜 시간이 어떻게 문제를 해결하는 방법. 내 테이블 구조에서는 색인 생성이 허용되지 않습니다. 다른 해결책이 도움이 될 것입니다.

+1

아마도이 질문은 [코드 검토] (http://codereview.stackexchange.com/)에 더 적합 할 것입니다. – musefan

+0

정확한 부분을 식별해야합니다. 당신은 여러개의''i ''루프를 가지고 있습니다. (아마도 DB 액세스 하나를 가정한다면 그것은 분명합니다.) – musefan

+0

SqlCommand cmd = new SqlCommand ("select sum (Qty), sum (("yyyy-MM-dd") SalesDetails에서 ItemCode = ''+ items [i] + ''및 dealer = ''+ 딜러 [j] + ''및 날짜 ''+ dateTimePicker1.Value.ToString + " 'and'"+ dateTimePicker2.Value.ToString ("yyyy-MM-dd") + "그룹 by ItemCode, Dealer", con); SqlDataReader dr = cmd.ExecuteReader(); –

답변

3

DB에 대한 쿼리가 너무 오래 걸리거나 함수의 나머지 부분 또는 둘 모두를 수행하는 경우 먼저 이해하지 못했습니다.

모르는 경우 테스트를 시작해야합니다. 당신은 간단한 DateTime.Now을 사용할 수 있고 각 부분이 얼마나 많은 틱을했는지를 볼 수 있습니다.

더 나은 방법으로 테스트하고 싶다면 V4Vendetta와 마찬가지로 StopWatch를 사용할 수 있습니다. 당신은 예를 들어 here을 찾을 수와 같이 기본적으로 syntext은 다음과 같습니다 DB를 액세스

// Create new stopwatch 
Stopwatch stopwatch = new Stopwatch(); 

// Begin timing 
stopwatch.Start(); 

// YOUR CODE HERE 

// Stop timing 
stopwatch.Stop(); 

// Write result 
Console.WriteLine("Time elapsed: {0}", 
    stopwatch.Elapsed); 

이 너무 오래 걸릴 내가 너무 많은 SQL 쿼리를 호출하지 조언을 할 수있는 것입니다.

모든 테이블을 얻을 대신 LINQ 사용하는 것이 좋을 것 "여기서 ... SalesDetails에서 slno을 선택"나는 for 루프에서 전화를 걸고있는 것을 알 수있다. 그렇게하면 DB 호출을 많이 절약 할 수 있습니다. DB 쿼리의 나머지 부분도 마찬가지입니다. 최대 3-5 개의 DB 호출을 사용할 수 있다고 생각합니다.

+1

그런 측정을 위해'DateTime'을 피할 것입니다. ['StopWatch']를 사용하십시오. (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – V4Vendetta

+2

@ V4Vendetta 스톱워치는 훌륭합니다 도구를 사용하지만 코드를보고 이것이 오래 전에 프로그래밍을 시작한 사람이라고 생각합니다. 나는 그에게 최소한의 이해가 필요한 도구를주고 싶었다. –

+0

그러나'StopWatch'는 그런 것들을위한 올바른 도구이다. 시동기가 직업에 알맞은 도구를 아는 것이 더 좋다. – V4Vendetta