【问题标题】:How to speed up loading data from database如何加快从数据库加载数据
【发布时间】:2010-01-25 06:24:37
【问题描述】:

我正在使用 Webservice,它将通过数据表从数据库中返回数据,并将数据表转换为字节数组。在前端,我将 bytearray 重新转换为 datatable 并使用 ajaxloader 将其显示在表单中。它是动态加载。因此,对于每次点击,无论数据大小如何,都需要 10 秒来检索数据。所以,我使用了静态数据表,并在页面加载事件中加载了该数据表中的所有数据。但是,没有反应。它只需要同样的时间。甚至,没有要检索的数据,ajax 加载器正在加载 10 秒。问题出在 Ajax 或我的 Web 服务上??请告诉我一些其他的想法??!!

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

            }
        }
    }

【问题讨论】:

    标签: c# asp.net ajax web-services


    【解决方案1】:

    从问题来看,听起来就像您正在为每个请求将数据库中的所有数据加载到 DataTable 中;如果是这种情况,解释一些事情——你只想通过“WHERE”子句等从数据库中提取最少的数据。

    除此之外;您可能需要进行概要分析。放入一些跟踪点,让您可以看到时间花在了哪里。它可以在任何地方,但这个byte[] 对 ajax 来说听起来很奇怪(JSON 或 xml 将是显而易见的选择,最终序列化为 http/encoding 的一部分)。

    哦;并且static 数据(例如DataTablr)是网络服务的一大禁忌;你要么严重损坏它,要么序列化你的请求(扩展到 1 个用户)。

    【讨论】:

    • 发布了我的代码..它只是简单的查询..而且数据也少..我尝试删除转换..但是,我得到的效果相同..我想问题是ajax加载器??但是,没有 ajax 就无法使用
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2021-08-14
      • 2013-01-03
      相关资源
      最近更新 更多