2010-01-25 4 views
0

J'utilise Webservice qui va retourner les données de la base de données via datatable et je vais convertir la datatable en tableau d'octets. En frontal, je vais reconvertir le bytearray en datatable et utilisé ajaxloader pour l'afficher dans le formulaire. C'est un chargement dynamique. Donc, pour chaque clic, il faut 10 secondes pour récupérer les données indépendamment de la taille des données. Donc, j'ai utilisé la datatable statique et j'ai chargé toutes les données dans cette datatable dans l'événement de chargement de la page. Mais, pas de réaction. Cela prend seulement la même heure. Même, il n'y a pas de données à récupérer, le chargeur ajax est en cours de chargement pendant 10 secondes. Le problème est avec Ajax ou mon webservice ?? Plz, dites-moi une autre idée ?? !!Comment accélérer le chargement des données de la base de données

Mon code pour l'événement listboxclick

protected void listboxcity_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string sqlvalue = string.Empty; 
     //Thread.Sleep(200); 

     for (int i = 0; i < listboxcity.Items.Count; i++) 
     { 
      if (listboxcity.Items[i].Selected == true) 
       sqlvalue += listboxcity.Items[i].ToString() + ","; 

     } 

     if (sqlvalue.EndsWith(",")) 
     { 
      sqlvalue = sqlvalue.Remove(sqlvalue.Length - 1); 
     } 


     txtprefcity.Text = sqlvalue; 
     if (txtprefcity.Text != string.Empty) 
     { 
      listboxarea.Items.Clear(); 

      txtprefarea.Text = ""; 
      try{ 
      string[] strarea = txtprefcity.Text.ToString().Split(','); 
      foreach (String s in strarea) 
      { 
       DataTable dtarea = new DataTable(); 
       DataTable dt = bc.ConvertByteToDataTable(objservice.GetData("getdistrictbyname", new object[] { s })); 
       foreach (DataRow r in dt.Rows) 
        dtarea = bc.ConvertByteToDataTable(objservice.GetData("getarea", new object[] { int.Parse(r["countryid"].ToString()), int.Parse(r["stateid"].ToString()), int.Parse(r["districtid"].ToString()) })); 
       foreach (DataRow rw in dtarea.Rows) 
       { 
        listboxarea.Items.Add(rw["areaname"].ToString()); 
       } 
      } 
      } 
      catch (Exception ex) 
      { 
       ObjLog.Write(ex.Message); 
      } 
     } 
    } 

Méthode Web est la suivante:

public byte[] GetData(string StoredProcedureName, params object[] ParameterValues) 
    { 
     GC.Collect(); 
     using (SqlConnection MyConnection = new SqlConnection(connectionstring)) 
     { 
      using (SqlCommand MyCommand = new SqlCommand(StoredProcedureName, MyConnection)) 
      { 
       using (SqlDataAdapter MyAdapter = new SqlDataAdapter()) 
       { 
        MyConnection.Open(); 
        MyCommand.CommandType = CommandType.StoredProcedure; 
        MyAdapter.SelectCommand = MyCommand; 
        SqlCommandBuilder.DeriveParameters(MyCommand); 
        int Index = 0; 
        foreach (SqlParameter Parameter in MyCommand.Parameters) 
        { 
         if (Parameter.Direction == ParameterDirection.Input || Parameter.Direction == ParameterDirection.InputOutput) 
         { 
          if (ParameterValues[Index] != null) 
          { 
           if (ParameterValues[Index].ToString() != string.Empty) 
           { 
            Parameter.Value = ParameterValues[Index]; 
           } 
           else 
           { 
            Parameter.Value = DBNull.Value; 
           } 
          } 
          else 
          { 
           Parameter.Value = DBNull.Value; 
          } 

          Index++; 
         } 
        } 
        using (DataTable ds = new DataTable()) 
        { 
         MyAdapter.Fill(ds); 
         MyConnection.Close(); 
         return convertdatatabletobytearray(ds); 
        } 
       } 

      } 
     } 
    } 

Répondre

0

De la question, il sonne comme vous chargez toutes les données de la base de données dans ce DataTable pour chaque demande; si tel est le cas que aurait expliquer les choses - vous voulez seulement aller chercher le strict minimum des données de la base de données, via « OU » clauses etc.

Au-delà; vous allez probablement avoir besoin de profiler. Mettez quelques points de trace qui vous permettent de voir où le temps est passé. Il pourrait être n'importe où, mais cela byte[] semble une chose étrange pour ajax (JSON ou xml serait les choix évidents, finalement sérialisé dans le cadre de http/encodage).

Oh; et static données (telles que DataTablr) est un grand non-non sur un service Web; vous allez soit le corrompre horriblement, ou sérialiser vos demandes (mise à l'échelle pour 1 utilisateur).

+0

Posté mon code .. C'est si simple requête seulement .. Et les données sont également moins .. J'ai essayé d'enlever la conversion .. Mais, même effet que je reçois .. Je suppose que le problème avec ajaxloader ?? mais, je ne peux pas utiliser sans ajax – Nila

0

Vous obtiendrez probablement des réponses plus précises si vous postez du code - vous pourriez faire des erreurs qui vous coûtent du temps. Avez-vous déjà profilé quelque chose? Vous devriez être capable de répondre à votre propre question en utilisant bien les profileurs de code.

Questions connexes