【问题标题】:What variable type should I use to save an image?我应该使用什么变量类型来保存图像?
【发布时间】:2011-01-12 09:18:11
【问题描述】:

我将把图像保存到 SQL 数据库中(不知道在那里使用什么类型),我将在数据库中查询一张学生肖像照的图像。

我应该使用什么变量类型来存储这张图片?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nana_s_Student_Gradebook
{
    class Student
    {
        public string name { get; set; }
        public string lastName { get; set; }
        public byte[] picture { get; set; }
        public DateTime dateOfBirth { get; set; }
    }
}

请指导一下? :)

【问题讨论】:

    标签: c# sql types


    【解决方案1】:

    在您的 .NET 代码中,您可能希望使用 System.Drawing.Image 或派生类。最终,您必须以一种或另一种方式将这些字节流式传输到 SQL Server,但您不需要从一开始就使用字节数组。 .NET 中所有与图片相关的类型都提供某种流式支持。

    在 SQL Server 端,无论如何,请使用 VARBINARY(MAX) 类型 - 它是二进制的,最大为 2 GB,速度很快,非常适合该用例。平均图像大小约为 1 MB,这可能是您最好的选择 - 甚至比使用 SQL Server 2008 FILESTREAM 属性更好(如果您有很多非常非常大的图像,这很好,大于 1 MB定期;这里,二进制文件本身存储在数据库控制下的服务器机器的文件系统中)。

    【讨论】:

    • 我正在使用 WPF 创建我的应用程序; using 命名空间应该是:Using System.Drawing;对吗?
    • @Sergio:是的,Image 类在 System.Drawing 中。
    【解决方案2】:

    考虑将图像存储为文件,然后在数据库中引用文件名,而不是二进制数据本身。这有几个优点,例如允许您将图像存储在其他服务器上并减少 SQL 服务器上的负载/流量。

    【讨论】:

      【解决方案3】:

      你说得对 - 在你的类中使用一个字节数组。对于小于 1 MB 的图像,请在 SQL Server 中使用 varbinary(max) 列。如果图像超过 1 MB 并且您使用的是 SQL Server 2008,请考虑使用 FILESTREAM 列。

      您可以使用this MSDN page 上的图表来引用 C#/Sql 数据类型映射。

      【讨论】:

        【解决方案4】:

        【讨论】:

        • 您可以将这些保存在数据库中吗?您不必先以某种方式将其保存到 byte[] 吗?
        • 是的,我必须先将图像更改为 byte[] 数组,然后再将其传递给我的数据库。
        • 我更关心你提出的数据结构。从数据库中读取字节后,我将使用 Image.FromStream() 方法读取字节(使用内存流或等效项)。为了存储回数据库,您可以将图像写回字节。但是对于内部逻辑,我不会携带字节数组。那是有限的使用。
        猜你喜欢
        • 2010-12-23
        • 1970-01-01
        • 2015-03-09
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多