Как ускорить загрузку данных из базы данных - PullRequest
0 голосов
/ 25 января 2010

Я использую Webservice, который будет возвращать данные из базы данных через datatable, и я преобразую datatable в байтовый массив. В начале я переконвертирую bytearray в datatable и использую ajaxloader для отображения его в форме. Это динамическая загрузка. Таким образом, для каждого клика требуется 10 секунд для восстановления данных независимо от их размера. Итак, я использовал static datatable и загрузил все данные в datatable в событие загрузки страницы. Но никакой реакции. Это занимает только то же время. Даже если нет данных для извлечения, загрузчик ajax загружается в течение 10 секунд. Проблема с Ajax или моим веб-сервисом ?? Плз, подскажите какую-нибудь другую идею ?? !!

Мой код для события 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);
                    }
                }

            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 января 2010

Вы, вероятно, получите более точные ответы, если разместите какой-то код - возможно, вы делаете ошибки, которые стоят вашего времени. Вы что-нибудь еще профилировали? Вы должны быть в состоянии ответить на свой вопрос с хорошим использованием профилировщиков кода.

0 голосов
/ 25 января 2010

Из вопроса звучит , как будто вы загружаете все данные из базы данных в эту DataTable для каждого запроса; если это так, что будет объяснять что-то - вы просто хотите извлечь минимум данных из базы данных, используя предложения "WHERE" и т. д.

Помимо этого; Вы, вероятно, будете нуждаться в профиле. Вставьте несколько точек трассировки, которые позволят вам увидеть, где время тратится. Это может быть где угодно, но это byte[] звучит странно для ajax (JSON или xml были бы очевидным выбором, в конечном итоге , сериализованный как часть http / encoding).

О; и static данные (такие как DataTablr) - это большой запрет на веб-сервис; вы либо собираетесь его испортить ужасно , либо сериализуете ваши запросы (масштабируя до 1 пользователя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...