我正在尝试编写一个允许用户以CSV格式从数据库下载数据的ASP.NET页面。我已经编写了下面的代码,它位于后面的代码中,并且会在单击按钮时运行。这是我写的:
private void RunBackup()
{
Button1.Enabled = false;
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", "attachment; filename=backup.csv");
try
{
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString))
using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8))
{
var queryString = "SELECT * FROM [Data] WHERE [ID] = @id";
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.Add("@id", SqlDbType.Int).Value = userId;
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Write header row.
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++)
{
if(columnCounter > 0)
{
writer.Write(separator);
}
writer.Write(reader.GetName(columnCounter));
}
writer.WriteLine(string.Empty);
// Write out the data.
while (reader.Read())
{
// Write out the column.
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++)
{
if (columnCounter > 0)
{
writer.Write(separator);
}
writer.Write(reader.GetValue(columnCounter).ToString().Replace(",", ";").Replace("\"", " "));
}
writer.WriteLine(string.Empty);
}
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
catch(Exception e)
{
}
finally
{
Button1.Enabled = true;
}
它的效果很好,除了我不仅获得带有SQL数据的CSV文件,而且还在文件的最末端得到了页面的HTML。我无法弄清楚这是做什么的,虽然我怀疑它与Response
标题或与Response.OutputStream
的输出有关。
我希望任何指向正确的方向。
答案 0 :(得分:0)
默认情况下,ASP.Net将表单呈现为Html并将其放入响应中,除非您告诉相反的情况,以便表单返回到客户端。这就是你在下载文件中看到一个Html页面的原因。
在RunBackup()
方法的末尾添加此代码。
Response.End();
这样可以防止将更多内容添加到您的文件中。
您的代码已经具有CompleteRequest(),这是优雅地跳过管道中的其他事件并准备结束请求的重要部分。如果应用程序配置为缓冲输出,则Response.Flush();可以添加。