Here's a really quick tip: how to convert a DataTable to CSV, and write it dynamically to the response stream.
In ASP.NET, If you need to allow users to download the contents of a datatable in flat file format (i.e. CSV, TAB etc) you could do this by writing the data to a temporary file, then writing the resulting file to the response using TransmitFile. However, a quicker and less expensive method is to stream it directly. Here's a method which allows you to do just that:
        /// <summary>
        /// Writes a datatable in delimited file format to the response stream.
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="fileName"></param>
        /// <param name="delimiter"></param>
        private void WriteDelimitedData(DataTable dt, string fileName, string delimiter)
        {
            //prepare the output stream
            Response.Clear();
            Response.ContentType = "text/csv";
            Response.AppendHeader("Content-Disposition", 
                string.Format("attachment; filename={0}", fileName));

            //write the csv column headers
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Response.Write(dt.Columns[i].ColumnName);
                Response.Write((i < dt.Columns.Count - 1) ? delimiter : Environment.NewLine);
            }

            //write the data
            foreach (DataRow row in dt.Rows)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    Response.Write(row[i].ToString());
                    Response.Write((i < dt.Columns.Count - 1) ? delimiter : Environment.NewLine);
                }
            }

            Response.End();
        }

And here's an example of calling the above method with some test data:
           //create a datatable to hold the test data
            DataTable dt = new DataTable();
            dt.Columns.Add("Column 1", typeof(string));
            dt.Columns.Add("Column 2", typeof(string));

            //generate some random data in the datatable
            Random rnd = new Random();
            for (int i = 0; i < 100; i++)
            {
                dt.Rows.Add(rnd.Next(1, 1000000).ToString(), rnd.Next(1, 1000000).ToString());
            }

            this.WriteDelimitedData(dt, "testdata.csv", ",");
 
Quick, and easy Open-mouthed