как я могу управлять массивом нулевых байтов, если он был нулевым, у меня не будет проблем? - PullRequest
0 голосов
/ 14 марта 2019

Я сохраняю изображения в своей базе данных в VARBINARY(max) с помощью этой процедуры

ALTER proc [dbo].[User_Create]
(@BirthCertificateImage varbinary(max),
@BookletImage varbinary(max),
@GreenCardImage varbinary(max))
as
insert into [User]
(BirthCertificateImage,BookletImage,GreenCardImage)
values
(@BirthCertificateImage,@BookletImage,@GreenCardImage)

И я извлекаю поле с помощью этой процедуры

ALTER proc [dbo].[User_GetById]
(@UserId int)
as
select * from [User]
where
Id = @UserId

, и я использую процедуру User_GetById вПлатформа сущностей с этим кодом

var user = await db.Database.SqlQuery<UserModel>("User_GetById @UserId"
, new SqlParameter("UserId",id)).SingleOrDefaultAsync();

, и это мой код для отображения двоичного изображения в PictureBox

var birthCertificateMs = new 
MemoryStream(response.Entity.BirthCertificateImage);
birthCertificatePictureBox.Image = Image.FromStream(birthCertificateMs);
birthCertificateMs.Close();

, а также тип моего свойства для обслуживания изображения: byte[]

Так как мне справиться с этим, если оно было нулевым, у меня не будет проблем?

считают, что оно работает правильно, когда оно не равно нулю

1 Ответ

0 голосов
/ 15 марта 2019

Я бы порекомендовал явно проверять наличие нулевого / пустого значения, прежде чем пытаться использовать данные.

if(response.Entity.BirthCertificateImage != null && response.Entity.BirthCertificateImage.Length > 0)
{
    using(var birthCertificateMs = new MemoryStream(response.Entity.BirthCertificateImage))
    {
        birthCertificatePictureBox.Image = Image.FromStream(birthCertificateMs);
    }
}

и я бы предпочел обернуть все это в блок Try / Catch, чтобы обработать, где байтовые данные не содержат изображения. (Это случается, особенно когда системы становятся более зрелыми, кто-то поддерживает добавление туда PDF-файла или чего-то подобного.)

Еще один совет: для больших двоичных данных, таких как изображения, я бы порекомендовал обновить схему, чтобы переместить их в отдельную таблицу, связанную в отношении 1-0..1 с пользователем. (Таким образом, новая таблица с именем UserImage с PK UserId, затем User может быть настроена с HasOptional на UserImage. Причина этого в том, что эти данные, вероятно, не будут доступны так часто, где вы могли бы присоединиться / выбрать на » Пользователь "довольно часто. Если вы используете пользователя в качестве эталона и код нетерпеливо загружает пользователя этими большими BLOB-объектами, это повлияет на производительность. Если данные об изображении пользователя находятся в отдельной связанной таблице, вы можете ссылаться на пользователя без затрат на производительность этих дорогих данных, пока они не потребуются явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...