如何加速从数据库加载数据

时间:2010-01-25 06:24:37

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

我正在使用Webservice,它将通过数据表从数据库返回数据,我将数据表转换为字节数组。在前端,我将把bytearray重新转换为datatable并使用ajaxloader在表单中显示它。它是动态加载。因此,对于每次单击,无论数据大小如何,都需要10秒钟来检索数据。所以,我使用静态数据表,并在页面加载事件中加载了该数据表中的所有数据。但是,没有反应。它只需要同一时间。即使没有数据可以检索,ajax加载器也会继续加载10秒钟。问题出在Ajax或我的webservice上? 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);
                    }
                }

            }
        }
    }

2 个答案:

答案 0 :(得分:0)

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

除此之外;你可能需要描述一下。添加一些跟踪点,以便您查看花费的时间。它可能在任何地方,但是这个byte[]对ajax来说听起来很奇怪(JSON或xml将是明显的选择,最终序列化为http /编码的一部分)。

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

答案 1 :(得分:0)

如果您发布一些代码,您可能会获得更准确的答案 - 您可能会犯错误,这会花费您的时间。你有什么描述吗?您应该能够充分利用代码分析器来回答您自己的问题。