2017-02-16 104 views
0

創建SQL服務器Excel二進制雖然我深知如何從SQL服務器創建Excel文件,這個特殊的要求是創建二進制文件,而沒有保存到文件系統。從SQL SELECT查詢

僞代碼是這樣的:

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

我想這個二進制文件,然後返回到供下載C#應用程序。

欣賞不需要將文件保存到服務器的解決方案。我知道如何保存文件然後讀取二進制文件。但是這個要求是在沒有任何對文件系統的寫入的情況下完成的。

在此先感謝。

回答

1

從數據庫中選擇二進制數據後,將其添加到響應中。 事情是這樣的:

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(); 
} 

要記住,這不是完整的解決方案,只是一個提示(和我沒有時間來測試它)。

+0

是的,當您將二進制文件保存在Excel中時很容易。根據上述,我有一個SELECT語句,比如「SELECT name,surname FROM users」,我想將它保存到Excel二進制文件並返回到我的C#應用​​程序。我使用HTTPMessaging向瀏覽器發送二進制,MIME類型,文件名。缺少的是需要從頭開始創建的Excel二進制文件。 –

+0

並不那麼簡單。 Google for NPOI庫,您將找到創建Excel文件的庫。而且,我記得沒錯,你必須將創建的excel保存到文件系統中...... – Nino

0

好吧,爲了防止其他人需要這樣做,我已經妥協了,使用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(); 
      }