C# 将图像保存到数据库

C# 将图像保存到数据库,c#,sql-server,asp.net-mvc-3,image,C#,Sql Server,Asp.net Mvc 3,Image,我有一些简单的实体,现在需要有一个配置文件图像。正确的方法是什么?因此,它是1对1关系,一个图像只与一个实体相关,反之亦然。此图像应通过webform上传,并插入相关实体 如果有人能给我指出正确的方向,如何将图像持久化到数据库和相关实体将会非常好 我想下面的链接会为您提供解决方案 代码很简单,但为什么要使用DB? 如果这是一个网站,为什么不将其保存到磁盘上一个您可以轻松引用它的位置 数据库经过优化以存储已知大小和相对较小大小的数据。您的图像很可能会超过8KB,这意味着它是一个最大数据类型。 图像

我有一些简单的实体,现在需要有一个配置文件图像。正确的方法是什么?因此,它是1对1关系,一个图像只与一个实体相关,反之亦然。此图像应通过webform上传,并插入相关实体


如果有人能给我指出正确的方向,如何将图像持久化到数据库和相关实体将会非常好

我想下面的链接会为您提供解决方案


代码很简单,但为什么要使用DB? 如果这是一个网站,为什么不将其保存到磁盘上一个您可以轻松引用它的位置

数据库经过优化以存储已知大小和相对较小大小的数据。您的图像很可能会超过8KB,这意味着它是一个最大数据类型。 图像将存储在您的个人资料的单独行/页上

就我个人而言,我会将图像保存在一个已知的文件夹中,并使用id作为图像名称。对于没有图像且使用标准gif或类似格式的配置文件,可以通过将配置文件id的simlinks/hardlinks设置为公共gif来保持简单/修剪

public class Profile
{
    public int Id {get;}
    public string Name {get; private set;}
    public Image Picture {get; private set;}

    public void Save()
    {
        using (var connection = new SqlConnection("myconnectionstring"))
        using (var command = new SqlCommand("", connection))
        {
            command.CommandText =
                "UPDATE dbo.TblProfile " +
                "SET " +
                    "Name = @name, " +
                    "Picture = @picture " +
                "WHERE ID = @id";
            command.Parameters.AddWithValue("@name", Name);
            command.Parameters.AddWithValue("@picture", Picture);
            command.Parameters.AddWithValue("@id", Id);
            command.ExecuteNonQuery();
        }
    }
}
只是一个旁白:我认为在db中存储图像不是一个好主意

一般来说,在db中存储图像不是一个好主意,因为dbs设计用于存储文本,而不是大的二进制块。最好是存储图像路径并将图像保存在文件夹中。如果您想确定ID为实体1323.jpg的1对1关系名称映像

如果您想拥有映像路径,则应遵循通用代码中的一些指导原则:

上传图像时,检查图像是否有效,甚至对图像标题进行二进制检查 不允许在插入新实体时覆盖现有图像。 将图像命名为主键1.jpg、2.jpg 在加载图像时,不要假设图像会出现在那里。 如果可能,不允许与图像进行手动交互,不允许在机器中进行远程处理,也不允许将图像从一个位置复制到另一个位置。手动交互可能导致不一致。 但我认为出于某种原因你应该这么做。因此,为了实现您的目标:

数据库设计

在表中创建二进制列binary或varbinary 如果您在具有1-1关系的其他表中创建它,效果会更好。然而,这个想法是避免在水合实体时加载图像。使用延迟加载方法仅在需要时加载图像。 当你做一个大的选择时,你必须避免加载图像。例如,如果你想在一个组合中加载你的所有实体,避免从任何地方选择,因为它将免费加载数千个图像。正如我所说的,这可以通过将图像放在不同的表中,或者在SELECT中只加载适当的列,或者进行延迟加载来实现。甚至更好的方法是在DB中没有图像,只有路径 C代码

使用BynaryReader阅读它 用于存储它的用户字节数组

检查此链接以获取代码示例:


好的,我决定按照你的建议在文件系统中存储图像。这主意听起来好多了。我假设我需要创建另一个实体照片,其中包含id、名称、路径、描述以及相关实体?任何链接请或sugg。我将编辑我的答案给你一些建议。顺便说一句,我不明白为什么有些人对你的问题投了否决票……我发布了另一个问题来将图像存储到文件系统中,看看为什么这个问题被否决了?当我对一个问题投反对票时,我会发表评论解释为什么。。。