代码之家  ›  专栏  ›  技术社区  ›  codeNinja

将具有16k行的表数据写入文件时超时

  •  1
  • codeNinja  · 技术社区  · 7 年前

    我在我的网站上有一个功能,管理员可以在其中下载表的内容。这个表大约有16K,只有8列。

    using (MySqlConnection con = new MySqlConnection(constr))
            {
    
                string query = "SELECT * from wp_portal_users";
                using (MySqlCommand cmd = new MySqlCommand(query))
                {
    
                    cmd.Connection = con;
                    con.Open();
    
                    MySqlDataReader sdr = cmd.ExecuteReader();
                    DataTable dt = new DataTable();
                    if (sdr.HasRows == true)
                    {
                        dt.Columns.Add("sysproID");
                        dt.Columns.Add("password");
                        dt.Columns.Add("username");
                        dt.Columns.Add("update_time", typeof(string));
                        dt.Columns.Add("tempPasswordValidity");
                        dt.Columns.Add("tempPassword");
                        dt.Columns.Add("last_login");
                        dt.Columns.Add("login_count");
                        dt.Rows.Add("Syspro ID", "Password", "Username", "Last Updated", "Temp Password Validity", "Temp Password", "Last Login", "Login Count");
                        DataRow dr = null;
    
                        while (sdr.Read())
                        {
                            dr = dt.NewRow();
                            dr["sysproID"] = sdr["sysproID"].ToString();
                            dr["password"] = sdr["password"].ToString();
                            dr["username"] = sdr["username"].ToString();
                            dr["update_time"] = sdr["update_time"].ToString();
                            dr["tempPasswordValidity"] = sdr["tempPasswordValidity"].ToString();
                            dr["tempPassword"] = sdr["tempPassword"].ToString();
                            dr["last_login"] = sdr["last_login"].ToString();
                            dr["login_count"] = sdr["login_count"].ToString();
                            dt.Rows.Add(dr);
                        }
                    }
    
                    string csv = string.Empty;
    
                    foreach (DataRow row in dt.Rows)
                    {
                        foreach (DataColumn column in dt.Columns)
                        {
                            //Add the Data rows.
                            csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
                        }
    
                        //Add new line.
                        csv += "\r\n";
                    }
    
                    //Download the CSV file.
                    Response.Clear();
                    Response.Buffer = true;
                    Response.AddHeader("content-disposition", "attachment;filename=PortalUsers.csv");
                    Response.Charset = "";
                    Response.ContentType = "application/text";
                    Response.Output.Write(csv);
                    Response.Flush();
                    Response.End();
                }
    
            }
    

    当它在只有几行的表上运行时,它工作得很好。16k行超时。我可以更改什么来更正此性能问题?

    1 回复  |  直到 7 年前
        1
  •  1
  •   ProgrammingLlama Raveena Sarda    7 年前

    您不应该仅仅为了遍历行而在内存中构建数据表(然后将其丢弃)。 手工构建数据表的速度相当慢。

    而是使用MySqlDataReader将列字符串添加到变量中。

                if (sdr.HasRows == true)
                {
                    string csv = string.Empty;
    
                    while (sdr.Read())
                    {
                        csv += sdr["sysproID"].ToString().Replace(",", ";") + ',';
                        // add other columns
    
                        csv += "\r\n";
                    }
                }
                //Download the CSV file.
    

    编辑 :

                if (sdr.HasRows == true)
                {
                    StringBuilder sb = new StringBuilder();
    
                    while (sdr.Read())
                    {
                        sb.Append(sdr["sysproID"].ToString().Replace(",", ";"));
                        sb.Append(";");
                        // add other columns
    
                        sb.AppendLine();
                    }
                }
                //Download the CSV file.