Database.ExecuteSprocAccessor() неправильно отображает данные BLOB-объектов
Если кто-то может помочь мне понять это, я был бы очень признателен. Для начала у меня есть такой класс:
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 выглядит следующим образом:
Мой контроллер имеет операции добавления и просмотра для чтения и записи в БД. Я могу написать файл нормально, используя код действия ниже:
[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 всегда имеет значение null:
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()? Я делаю что-то не так?
Спасибо за ваше время заранее.
2 ответа
Вы можете использовать следующий код:
.Map(x => x.FileContent).WithFunc(ConvertVarBinaryToByteArray);
Затем создайте функцию следующим образом:
private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord)
{
return (byte[]) dataRecord.GetValue(dataRecord.GetOrdinal("FileContent"));
}
Я решил проблему следующим образом:
Добавьте этот код перед выполнением ExecuteSprocAccessor:
IRowMapper<FileEmail> rowMapper = MapBuilder<FileEmail>.MapAllProperties()
.Map(x => x.MyFile)
.WithFunc(ConvertVarBinaryToByteArray).Build();
И создайте метод, как Расс сказал выше:
private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord)
{
return (byte[])dataRecord.GetValue(dataRecord.GetOrdinal("FileContent"));
}