Link to home
Start Free TrialLog in
Avatar of mugsey
mugseyFlag for United Kingdom of Great Britain and Northern Ireland

asked on

Best way to export data in searchable format from a datareader

I am buildig up a dynamic query that results in datareader being populated like follows........

while (thisReader.Read())
{
  //do some kind of export stuff to CSV or EXEL -- let client download file to browser
}

...................................

So I want to be able to export the cotents of the datarader to ideally an CSV or EXCEL file.  In addition I want just to strip out fields like firstname, lastname, address1, address2, postcode

Thanks

Avatar of REA_ANDREW
REA_ANDREW
Flag of United Kingdom of Great Britain and Northern Ireland image

Hwo about this?
            string filename = "YourDownload.csv";
            StringBuilder sb1 = new StringBuilder();
            using (StringWriter sw1 = new StringWriter(sb1))
            {
                sw1.Write(sda1.GetName(0) + "," + sda1.GetName(1) + "," + sda1.GetName(2));
                while (sda1.Read())
                {
                    sw1.WriteLine(sda1["Field1"] + "," + sda1["Field2"] + "," + sda1["Field3"]);
                }
                using (StreamWriter swr1 = File.CreateText(filename))
                {
                    sw1.WriteLine(sw1.ToString());
                    sw1.Flush();
                }
            }
            Response.Redirect(filename);

Open in new window

Avatar of mugsey

ASKER

Thanks for the reply - I will just test it out.  So does this just push it to the browser?
Avatar of mugsey

ASKER

Actually

The code snippet

string filename = "YourDownload.csv";

How could I get the user to type in the file name?
ermm well say... OK say you have a textbox on your page so, 1 textbox, a label saying please input a filename and a button saying create a download.

You assign the filename as :

YourTextBox.Text +".csv";

Do you want it to simply redirect to a page and make sure a download screen appears and avoid it going into the browser?

If so I will drum  up a working example for you which has a text box. That ok?

Let me know. :-)

Andrew
Avatar of mugsey

ASKER

Hi Andew

Thanks a lot

Yes that would be great mate.  Thanks again
Avatar of mugsey

ASKER

I will try your example when I get home in about 2 hours - cheers !!!!!!!!
Right OK here is the final version.  Obviously just create your CSV using your while loop. For testing I have used a simple for loop, but you will see the logic and what is happening to achieve the download.

Cheers

Andrew
The ASP.NET Page
-----------------------------------
 
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Downloader.aspx.cs" Inherits="MVC_Prototype.Downloader" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Download"></asp:Label>
        <asp:TextBox ID="txtFilename" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Create Download" OnClick="Button1_Click" />
    </div>
    </form>
</body>
</html>
 
 
C# Code
-----------------------------------
 
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;
 
namespace MVC_Prototype
{
    public partial class Downloader : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
 
        protected void Button1_Click(object sender, EventArgs e)
        {
            string filename = txtFilename.Text+".csv";
            StringBuilder sb1 = new StringBuilder();
            using (StringWriter sw1 = new StringWriter(sb1))
            {
                sw1.WriteLine("Heading1" + "," + "Heading2" + "," + "Heading3");
                for (int i = 0; i < 100; i++)
                {
                    sw1.WriteLine("Andy" + "," + "Andy" + "," + "Andy");
                }
                Response.Clear();
                Response.AddHeader("content-disposition", "attachment;filename=" + filename);
                Response.Write(sw1.ToString());
            }
        }
    }
}

Open in new window

either CSV or XML...XML is great for standard data sharing..its compatible and all...


CT.
Avatar of mugsey

ASKER

Hi No it would need to be CSV
ASKER CERTIFIED SOLUTION
Avatar of REA_ANDREW
REA_ANDREW
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of mugsey

ASKER

Sorry Andrew - been off work - YOU ARE A GENIOUS!!!!!!! Works great.  Will post another related question now.
Andrew do you have a solution that will pick the fields from the screen (datareader?) and export it to excel? In your example you have hard coded values.