2010-01-25 5 views
0

데이터베이스에서 데이터 테이블을 통해 데이터를 반환하는 Webservice를 사용 중이며 데이터 테이블을 바이트 배열로 변환합니다. 프런트 엔드에서는 bytearray를 datatable로 변환하고 ajaxloader를 사용하여 폼에 표시합니다. 동적로드입니다. 따라서 각 클릭에 대해 데이터 크기에 관계없이 데이터를 검색하는 데 10 초가 걸립니다. 그래서, 정적 데이터 테이블을 사용하고 페이지로드 이벤트에서 해당 데이터 테이블의 모든 데이터를로드했습니다. 하지만, 아무 반응. 그것은 단지 같은 시간을 가지고 있습니다. 다시 조사 할 데이터가 없어도 ajax 로더가 10 초 동안로드됩니다. Ajax 또는 웹 서비스에 문제가 있습니까 ?? 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); 
      } 
     } 
    } 

웹 방법은 다음과 같습니다 그것은 소리 질문에서

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[]은 아약스의 경우 이상한 점이 있습니다 (JSON 또는 xml이 확실한 선택 일 것임) 궁극적으로은 http/인코딩의 일부로 일련 번호가 지정됩니다.

오. 및 static 데이터 (예 : DataTablr)는 웹 서비스에서 큰 no-no입니다. 너는 몹시을 망가 뜨리거나 요청을 직렬화 (1 명으로 조정) 할 것이다.

+0

게시 됨 내 코드 .. 매우 간단한 쿼리뿐입니다. 데이터도 적습니다 .. 변환을 제거해 보았습니다.하지만 동일한 효과가 나타납니다. 아약스 로더에 문제가 있다고 생각하십니까 ?? 하지만 아약스 없이는 사용할 수 없다. – Nila

0

일부 코드를 게시하면 더 정확한 답변을 얻을 수 있습니다. 실수로 시간을 낭비 할 수 있습니다. 아직 프로파일을 만들지 않았습니까? 코드 프로파일 러를 잘 사용하여 자신의 질문에 대답 할 수 있어야합니다.

관련 문제