0

Если кто-нибудь может помочь мне понять это, я был бы очень признателен. Во-первых, у меня есть класс, как так:Database.ExecuteSprocAccessor() не правильно отображает данные о блобе

public class Blob 
{ 
    public int BlobID { get; set; } 
    public string BlobName { get; set; } 
    public string FileName { get; set; } 
    public string FileMimeType { get; set; } 
    public int FileSize { get; set; } 
    public byte[] FileContent{ get; set; } 
    public DateTime DateCreated { get; set; } 
    public int CreatedByProfileID { get; set; } 
} 

Довольно стандартный, это просто объект, который отображается в виде таблицы с точно такими же именами полей. Таблица в SQL Server выглядит следующим образом:

enter image description here

Мой контроллер имеет добавлять и просматривать действия, чтобы сделать чтение и запись в БД. Я могу написать файл штрафа, используя код действия ниже:

[HttpPost] 
public ActionResult Add(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0) 
    { 
     Database db = DatabaseFactory.CreateDatabase("dbconnstr"); 

     byte[] fileContent = new byte[file.ContentLength]; 
     file.InputStream.Read(fileContent, 0, file.ContentLength); 

     object[] paramaters = 
     { 
      file.FileName, 
      file.FileName, 
      file.ContentType, 
      file.ContentLength, 
      fileContent, 
      DateTime.Now, 
      12518 
     }; 

     db.ExecuteNonQuery("sp_Blob_Insert", paramaters); 
    } 

    return RedirectToAction("Index"); 
} 

Но когда я использую Просмотреть код действия ниже, чтобы прочитать файл, чтобы браузер, поле FileContent всегда нуль:

public ActionResult View(int id) 
{ 
    Database db = DatabaseFactory.CreateDatabase("dbconnstr"); 

    Blob blob = db.ExecuteSprocAccessor<Blob>("sp_Blob_SelectByPkValue", id).Single(); 

    return File(blob.FileContent, blob.FileMimeType, blob.FileName); 
} 

Однако, если я специально отобразить имя поля, оно работает:

public ActionResult View(int id) 
{ 
    Database db = DatabaseFactory.CreateDatabase("dbconnstr"); 

    IRowMapper<Blob> mapper = MapBuilder<Blob>.MapAllProperties().MapByName(x => x.FileContent).Build(); 

    Blob blob = db.ExecuteSprocAccessor<Blob>("sp_Blob_SelectByPkValue", mapper, id).Single(); 

    return File(blob.FileContent, blob.FileMimeType, blob.FileName); 
} 

Является ли это ошибка с функцией ExecuteSprocAccessor()? Я что-то делаю неправильно?

Спасибо за ваше время заранее.

+0

вы нашли ответ? У меня такая же проблема – ydd1987

+0

У меня нет, и у меня нет никакой удачи в поисковых системах ... – ryanulit

ответ

0

Вы можете использовать следующий код:

.Map(x => x.FileContent).WithFunc(ConvertVarBinaryToByteArray); 

Затем создать функцию, как это:

private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord) 
{ 
    return (byte[]) dataRecord.GetValue(dataRecord.GetOrdinal("FileContent")); 
} 
0

Я решил проблему так:

Добавьте этот код перед тем выполнить ExecuteSprocAccessor:

IRowMapper<FileEmail> rowMapper = MapBuilder<FileEmail>.MapAllProperties() 
     .Map(x => x.MyFile) 
     .WithFunc(ConvertVarBinaryToByteArray).Build();  

И создайте способ, которым Russ сказал выше:

private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord) 
    { 
     return (byte[])dataRecord.GetValue(dataRecord.GetOrdinal("FileContent")); 
    } 
Смежные вопросы