2012-05-29 46 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,而不是文字。