如果不为空,我该如何管理空字节数组呢?

时间:2019-03-14 20:05:03

标签: c# arrays sql-server entity-framework stored-procedures

按照此过程,我将图像保存在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

并且我在带有此代码的Entity框架中使用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[]

那么如果它为null,我将不会遇到麻烦怎么办?

考虑它在不为空时可以正常工作

1 个答案:

答案 0 :(得分:0)

我建议在尝试使用数据之前明确检查null / empty。

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,然后可以在UserImage上配置一个HasOptional)。原因是该数据可能不会被如此频繁地访问,因此您可以在“用户”。如果您将User用作参考,并且代码渴望/延迟加载具有较大blob的User,则会对性能产生影响。如果用户图像数据在单独的相关表中,则在明确需要它之前,您可以引用用户而不会花费该昂贵数据的性能。