我有一个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等
干杯。
答案 0 :(得分:0)
如果您确定数据是文本,则可以非常简单地使用Encoding.GetString将所有文本读入字符串,并将其与您的存储过程一起传递。
var uploadResult = Database.ExecuteSqlCommand("EXEC mySP @file = {0}...", Encoding.GetString(myData);
答案 1 :(得分:0)
我相信在你的情况下,过程@file参数类型应该是image
,而不是文本。