2012-05-29 48 views
2

我有一個ASP MVC應用程序,它使用HttpPostedFileBase從Razor視圖中拾取上載的文件。這些被收集到模型中的List中,然後傳遞給實體框架(v4.0.30319),我在其中調用存儲過程將文件保存到數據庫。通過存儲過程將上傳的文件(InputStream)保存到SQL Server

(我敢肯定有這樣做的更好的辦法,但我處理與現有系統)

在這個模型中,我有:

public List<Attachment> Attachments { get; set; } 

其中連接對象的樣子:

public class Attachment 
{ 
    public System.IO.Stream InputStream { get; set; } 
    public String FileName { get; set; } 
    public String ContentType { get; set; } 
    public Int32 ContentLength { get; set; } 
} 

當我保存附件我遍歷列表,並嘗試調用存儲過程來保存輸入流:

foreach(var file in ticket.Attachments) 
    { 
    if (file != null) 
     { 
     try 
      { 
      //create a byte array from the input file stream 
      byte[] myData = new byte[file.ContentLength]; 
      file.InputStream.Read(myData, 0, file.ContentLength); 

      ... 

      var uploadResult = Database.ExecuteSqlCommand("EXEC mySP @file = {0}...", myData); 

的問題似乎是,存儲過程期待一段文字

ALTER PROCEDURE [dbo].[mySP] 
    @file   AS TEXT, 
    @tcFileExtension VARCHAR(50), 
    ... 

這是造成錯誤:

Operand type clash: varbinary is incompatible with text 

什麼是字節數組轉換的最佳方式(或InputStream),以便我可以通過存儲過程保存它?

上傳的文件可以是任何東西:XLS,XLSX,PDF,TIFF,DOC等

乾杯。

回答

0

如果您確定數據是文本,您可以使用Encoding.GetString非常簡單地將所有文本讀取到字符串中,並將其傳遞到存儲過程。

var uploadResult = Database.ExecuteSqlCommand("EXEC mySP @file = {0}...", Encoding.GetString(myData);

+0

歡呼聲。文件類型可以是任何東西。我編輯了這個問題來反映這個問題 – GrahamJRoy

+0

如果文件類型可以是任何東西,那麼你的列的類型是錯誤的。 – scottm

+0

我認爲這是一個blob,而不是實際的文本 – GrahamJRoy

0

我相信,在您的情況@file參數類型的程序應該是image,而不是文字。