2013-09-03 4 views
1

Это мой кодМой код занимает слишком много времени во время исполнения

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 секунд, чтобы выполнить, у меня есть около 8000 записей и (элементы) 1000+ (дилеры) 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», которые вы имеете в виду (хотя, вероятно, справедливо предположить, что доступ к БД один, вам нужно быть ясным) – musefan

+0

SqlCommand cmd = new SqlCommand («выберите сумму (количество), сумму (скорость) от SalesDetails, где ItemCode = '"+ items [i] +"' и dealer = '"+ дилеры [j] +"' и дата между '' + dateTimePicker1.Value.ToString ("yyyy-MM-dd") + "'и'" + dateTimePicker2.Value.ToString ("yyyy-MM-dd") + "'group by ItemCode, Dealer", con); SqlDataReader dr = cmd.ExecuteReader(); –

ответ

3

Прежде всего я не понял, если запрос к БД занимает слишком много времени или остальная часть функции или и то, и другое.

Если вы не знаете, вы должны начать с тестирования. вы можете использовать простой DateTime.Now и посмотреть, сколько клещей сделало каждую часть.

Если вы хотите проверить его еще лучше, вы можете использовать StopWatch, как указано в V4Vendetta. Вы можете найти пример here и в основном Syntext будет как:

// 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. я вижу, что в for цикле вы звоните:

«выберите slno из SalesDetails, где ...»

может быть лучше, чтобы получить всю таблицу и использовать вместо LINQ. таким образом вы сохраняете много вызовов БД. то же самое относится к остальным вашим запросам БД, я думаю, мы можем использовать до 3-5 вызовов БД.

+1

Избегайте «DateTime» для таких измерений. Используйте ['StopWatch'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – V4Vendetta

+2

@ V4Vendetta секундомер - отличный но я вижу код и думаю, что это тот, кто недавно начал программировать. я хотел дать ему минимальное понимание необходимого инструмента –

+0

Но 'StopWatch' - правильный инструмент для таких вещей, лучше для стартера знать правильные инструменты для работы – V4Vendetta

Смежные вопросы