2010-01-25 109 views
0

我正在使用Webservice,它将通过数据表从数据库中返回数据,我将数据表转换为字节数组。在前端,我会将字节数组重新转换为数据表,并使用ajaxloader将其显示在表单中..这是动态加载。因此,无论数据大小如何,每次点击都需要10秒钟的时间才能收回数据。所以,我使用静态数据表,并且在页面加载事件中加载了该数据表中的所有数据。但是,没有反应。它只是在同一时间。即使没有数据需要检索,ajax加载器仍会继续加载10秒钟。问题是与Ajax或我的web服务? Plz,告诉我一些其他的想法??如何加速从数据库中加载数据

我对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); 
      } 
     } 
    } 

Web方法如下:

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); 
        } 
       } 

      } 
     } 
    } 

回答

0

从中听起来这个问题就像你从数据库加载所有的数据到这个DataTable为每个请求;如果是这样的话,解释的东西 - 你只想从数据库中获取最少的数据,通过“WHERE”从句等。

除此之外;你可能需要配置文件。加入一些跟踪点,可以让你看到时间花在哪里。它可能在任何地方,但这个byte[]听起来是一个奇怪的事情的AJAX(JSON或XML将是明显的选择,最终序列化为HTTP /编码的一部分)。

哦;和static数据(如DataTablr)是一个Web服务的大禁忌;你要么破坏它可怕,或序列化您的请求(扩展到1用户)。

+0

发表我的代码..它是如此简单的查询只..数据也只有更少..我尝试删除转换..但是,我得到同样的效果..我想ajaxloader的问题??但是,我不能没有Ajax – Nila 2010-01-25 09:33:46

0

如果您发布了一些代码,您可能会得到更准确的答案 - 您可能会犯错误,这会花费您的时间。你有没有分析任何东西?您应该能够很好地使用代码分析器来回答自己的问题。