从SQL SELECT查询中在SQL Server中创buildExcel二进制文件

虽然我非常了解如何从SQL Server创buildExcel文件,但是这个特殊的要求是创buildBINARIES,而不需要保存到文件系统中。

伪代码是这样的:

DECLARE @ExcelBinaryData varbinary(max) SELECT * FROM someTable FOR EXPORT to @ExcelBinaryData 

我想这个二进制文件然后被返回到一个C#应用程序下载。

在不需要将文件保存到服务器的情况下欣赏解决scheme。 我知道如何保存文件,然后读取二进制文件。 但是这个要求是在没有写入文件系统的情况下完成的。

提前致谢。

一旦你从数据库中select你的二进制数据,将其添加到响应。 像这样的东西:

 string connectionString = "your connection string"; int id = 1; SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT [ExcelData] FROM [SavedFiles] WHERE ID = @ID"; cmd.Parameters.AddWithValue("@ID", id); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { byte[] bytes = (byte[])dr["ExcelData"]; Response.Buffer = true; Response.Charset = ""; Response.AddHeader("content-disposition", @"attachment;filename=""file.xlsx"""); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.BinaryWrite(bytes); Response.End(); } 

记住这不是完整的解决scheme,只是一个提示(我没有时间去testing它)。

好吧,为了防止其他人需要这样做,我已经妥协了,使用OLE DB和ACE驱动程序写入Excel临时文件,然后发送到SQL。 Excel文件操作如下。

PS:如果你像我一样为主要客户编写代码,我们倾向于避免可能会在系统中引入安全漏洞的随机数据库。 此代码使用MS库,没有其他外部来源。

 string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;c:\\someFile.xlsx";Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\""; using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; cmd.CommandText = "CREATE TABLE [table1] (id INT, name VARCHAR, datecol DATE );"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(1,'AAAA','2014-01-01');"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(2, 'BBBB','2014-01-03');"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(3, 'CCCC','2014-01-03');"; cmd.ExecuteNonQuery(); cmd.CommandText = "UPDATE [table1] SET name = 'DDDD' WHERE id = 3;"; cmd.ExecuteNonQuery(); conn.Close(); }