+9  A: 

You need to tell the browser that what you are sending is not html and shouldn't be displayed as such in the browser. The following code can be used to return some text in your server-side code and it will present the save dialog to the user as you wanted:

Response.Clear(); //eliminates issues where some response has already been sent
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename));
Response.Write(yourSQL);
Response.End;

filename = the name you wish to give it

yourSQL = the content of the sql file

Neil Trodden
getting an error on doing this. added a screenshot in the question post.
SaM
I'm copying that code out of a page I use that downloads .csv data so I know it works. I call it in the page_load event, perhaps your page has already started sending data back to the client?
Neil Trodden
My code is in the button_click event...why does it need to be in page_laod()?I need the download to start on a button click event...
SaM
Look at Mehrdad's comment on your question above, he is right do a response.redirect to a dedicated page. I realised that the page that I use to do the download simply looks at the request string to work out the id of the item I need to return and it has no controls on the page at all.See also the answer from mehrdad who gives a much better answer than mine - a httphandler is better practise.
Neil Trodden
+12  A: 

Create a separate HTTP Handler (DownloadSqlFile.ashx):

<%@ WebHandler Language="C#" Class="DownloadHandler" %>

using System;
using System.Web;

public class DownloadHandler : IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        var fileName = "myfile.sql";
        var r = context.Response;
        r.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        r.ContentType = "text/plain";
        r.WriteFile(context.Server.MapPath(fileName));
    }
    public bool IsReusable { get { return false; } }
}

Then make the button in your ASP.NET page navigate to DownloadSqlFile.ashx.

Mehrdad Afshari
This is better than my answer in terms of design patterns.
Neil Trodden
This does make the assumption that the file you want to download is a static file.
Tim Jarvis
A: 

Add a Response.Clear before you Response.Write to fix the error, if stated properly in the Chrome dialog.

So to integrate in the snippet in other answer...

//add this
Reponse.Clear(); 

//from other answer
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename));
Response.Write(yourSQL);
Response.End;
Greg Ogle
+3  A: 

The problem is that you're using the code on the same page as is currently loaded in the browser. You are attempting to modify the response stream and disposition of the current loaded page. Instead, create a separate HttpHandler, as suggested by Mehrdad. Then on the click of the button, you will invoke the URL to the handler. The button could even be a simple hyperlink that had the following as the source URL:

<a href="DownloadSqlFile.ashx">Download SQL</a>

Make sense? The point being, you cannot modify the response of the already loaded page. Launch a new request using a handler to do the work.

Ryan Farley
A: 

I'm using Mehrdad's example. However the file is named after the *.ashx file, instead of the actual file name. I'm very new to C#. Is there a property or something that I can change to make the destination filename more user friendly?

A: 

Hi all... on file download, using above Response method, on "Open", "save" , and "Cancel" button click, is there any way to track whather user has clicked on save or not?

nikeeta