Solved

Convert datareader to CSV and export to web browser in ASP.NET C#

Posted on 2007-11-22
10
1,908 Views
Last Modified: 2008-02-01
I have a datareader

while (thisReader.Read())
{
}

Now how can I export the contents of this datarader to a web browser in CSV format, so the user can save the file on this desktop.

0
Comment
Question by:mugsey
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
10 Comments
 
LVL 39

Expert Comment

by:Pratima Pharande
ID: 20333725
Try this
 //Add Response header 
        Response.Clear();
        Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", fileName));
        Response.Charset = "";
        Response.ContentType = "application/vnd.xls";
        //GET Data From Database                
        SqlConnection cn = new SqlConnection(dataSrc.ConnectionString);
        string query = dataSrc.SelectCommand.Replace("\r\n", " ").Replace("\t", " ");
        
        SqlCommand cmd = new SqlCommand(query, cn);
        
        cmd.CommandTimeout = 999999 ;
        cmd.CommandType    = CommandType.Text;
        try
        {
            cn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            StringBuilder sb = new StringBuilder();            
            //Add Header          
            for (int count = 0; count < dr.FieldCount; count++)
            {
                if (dr.GetName(count) != null)
                    sb.Append(dr.GetName(count));
                if (count < dr.FieldCount - 1)
                {
                    sb.Append(",");
                }
            }
            Response.Write(sb.ToString() + "\n");
            Response.Flush();            
            //Append Data
            while (dr.Read())
            {
                sb = new StringBuilder();
               
                for (int col = 0; col < dr.FieldCount - 1; col++)
                {
                    if (!dr.IsDBNull(col))
                        sb.Append(dr.GetValue(col).ToString().Replace(",", " "));
                    sb.Append(",");
                }
                if (!dr.IsDBNull(dr.FieldCount - 1))
                    sb.Append(dr.GetValue(dr.FieldCount - 1).ToString().Replace(",", " "));
                Response.Write(sb.ToString() + "\n");
                Response.Flush();
            }
            dr.Dispose();

Open in new window

0
 
LVL 39

Expert Comment

by:Pratima Pharande
ID: 20333726
0
 
LVL 7

Expert Comment

by:bungHoc
ID: 20333738
Try this:

private string ToCSV(DataTable dataTable)
{
 
  DataTable schemaTable = myReader.GetSchemaTable();
 
  StringBuilder sb = new StringBuilder();      
  foreach (DataColumn column in schemaTable.Columns)
  {
    sb.Append(column.ColumnName + ',');
  }            
 
  sb.Append("\r\n");
      
  foreach (DataRow row in schemaTable.Rows)
  {
    foreach (DataColumn column in schemaTable.Columns)
    {
      sb.Append(row[column].ToString() + ',');
    }                  
    sb.Append("\r\n");
  }      
  return sb.ToString();
}

Open in new window

0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:mugsey
ID: 20333747
OK thanks guys I will try in the next hour
0
 

Author Comment

by:mugsey
ID: 20333769
Thanks pratima_mcs

How can I specify the file name and where to save the file?  Thanks
0
 
LVL 39

Expert Comment

by:Pratima Pharande
ID: 20333830
When you run this code it will ask with a popup to open , save
0
 

Author Comment

by:mugsey
ID: 20333949
OK thanks - so you know the line

Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", fileName));

Where does filename come from?

You see my code is like this

Currently I have a datareader that is populated from a dynamic search

  while (thisReader.Read())
                {
                 

                }

How can I amend your code above so it works



0
 
LVL 39

Expert Comment

by:Pratima Pharande
ID: 20333974
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", fileName));

in this they have used the parament send to the function ...

you can use your own tempory file name there like

Response.AddHeader("content-disposition", string.Format("attachment;filename=temp.csv", fileName));

that will appear by default in save dialog
0
 

Author Comment

by:mugsey
ID: 20334019
OK thANKS

But could you amend your example so it wiould fit into the following?

while (thisReader.Read())
                {
                 

                }



0
 
LVL 39

Accepted Solution

by:
Pratima Pharande earned 500 total points
ID: 20337369

//Add Response header 
        Response.Clear();
        Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", fileName));
        Response.Charset = "";
        Response.ContentType = "application/vnd.xls";
       
                
            StringBuilder sb = new StringBuilder();            
            //Add Header   Put this if you want headers        
            for (int count = 0; count < thisReader.FieldCount; count++)
            {
                if (thisReader.GetName(count) != null)
                    sb.Append(thisReader.GetName(count));
                if (count < thisReader.FieldCount - 1)
                {
                    sb.Append(",");
                }
            }
            Response.Write(sb.ToString() + "\n");
            Response.Flush();            
            //Append Data
            while (thisReader.Read())
            {
                sb = new StringBuilder();
               
                for (int col = 0; col < thisReader.FieldCount - 1; col++)
                {
                    if (!thisReader.IsDBNull(col))
                        sb.Append(thisReader.GetValue(col).ToString().Replace(",", " "));
                    sb.Append(",");
                }
                if (!thisReader.IsDBNull(thisReader.FieldCount - 1))
                    sb.Append(thisReader.GetValue(thisReader.FieldCount - 1).ToString().Replace(",", " "));
                Response.Write(sb.ToString() + "\n");
                Response.Flush();
            }
            thisReader.Dispose();

Open in new window

0

Featured Post

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Just a quick little trick I learned recently.  Now that I'm using jQuery with abandon in my asp.net applications, I have grown tired of the following syntax:      (CODE) I suppose it just offends my sense of decency to put inline VBScript on a…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question