通过存储过程将上载的文件(InputStream)保存到SQL Server

时间:2012-05-29 15:16:04

标签: c# sql-server entity-framework

我有一个ASP MVC应用程序,它使用HttpPostedFileBase从Razor视图中获取上传的文件。这些被收集到模型中的List中,然后传递给实体框架(v4.0.30319),我在其中调用存储过程将文件保存到数据库。

(我确信有更好的方法可以做到这一点,但我正在处理现有的系统。)

在模型中我有:

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

当我保存附件时,我遍历列表并尝试调用存储的proc来保存输入流:

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

问题似乎是存储的proc期待一段文本

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

导致错误:

Operand type clash: varbinary is incompatible with text

转换字节数组(或InputStream)的最佳方法是什么,以便我可以通过存储过程保存它?

上传的文件可以是任何内容:xls,xlsx,pdf,tiff,doc等

干杯。

2 个答案:

答案 0 :(得分:0)

如果您确定数据是文本,则可以非常简单地使用Encoding.GetString将所有文本读入字符串,并将其与您的存储过程一起传递。

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

答案 1 :(得分:0)

我相信在你的情况下,过程@file参数类型应该是image,而不是文本。