【问题标题】:How to manage to store null byte array in SQL Server with Entity Framework?如何使用实体框架在 SQL Server 中存储空字节数组?
【发布时间】:2019-03-14 20:05:02
【问题描述】:

我想通过这个过程将图像保存在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)

这是我如何使用 SQL 过程提取字段的方法

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

这就是我在 EF 中使用上述过程的方式

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[]

那么我该如何管理呢?如果那是空的,我不会有麻烦吗?

考虑一下,当输入不为空时它可以正常工作

【问题讨论】:

  • 您是否尝试使用空值测试您的代码?然后会发生什么?
  • 您可以将response.Entity.BirthCertificateImage ?? Array.Empty&lt;byte&gt;() 作为 MemoryStream 构造函数的参数。
  • @Steve MemorySteam 构造函数会抛出 ArgumentNullException。
  • 为什么不在开始显示操作之前检查它是否不为空?
  • @Steve 是的,它不能正常工作

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


【解决方案1】:

我建议在尝试使用数据之前明确检查 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 的新表具有 UserId 的 PK,然后用户可以在 UserImage 上配置一个 HasOptional)原因是该数据可能不会被频繁访问,您可以在其中加入/选择“用户”相当频繁。如果您使用 User 作为参考并且代码急切/延迟加载具有这些较大 blob 的用户,它将对性能产生影响。如果用户图像数据位于单独的相关表中,则在明确需要之前,您可以引用 User 而不会产生昂贵数据的性能成本。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多