2

我有一个 ASP MVC 应用程序,它使用 HttpPostedFileBase 从 Razor 视图中获取上传的文件。这些被收集到模型中的列表中,然后传递到实体框架(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; }
}

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

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 等

干杯。

4

2 回答 2

0

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

于 2012-05-29T16:02:00.197 回答
0

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

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

于 2012-05-29T15:31:24.817 回答