将图像存储在数据库中会产生部分图像

时间:2011-04-18 17:52:00

标签: sql-server nhibernate fluent-nhibernate

我正在尝试将图像存储在sql server数据库中。我在Image表中有一个存储数据的列,其类型为varbinary(max)。我正在使用NHibernate来访问数据库。

将图像加载到代码中并将其转换为缓冲区数组可以正常工作。当我将图像存储在数据库中时,无论我放入30kb以上的大小图像,都只保存部分图像。

我检查了存储在数据库中的数据,并且所有图像都存储了相同数量的数据,因此我的猜测是某些内容限制了可以保留在列中的byte []的大小。

当我从数据库中提取数据并在屏幕上显示图像时,它只显示图像的顶部。

可能出现什么问题?

更新 我检查了varbinary(max)列中数据的大小,所有数据条目都是8000字节。

以下是代码:

表格创建:

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Image')
            CREATE TABLE [Image]
            (
                [ImageId]                       INT IDENTITY(1,1)       NOT NULL,
                [FileName]                      NVARCHAR(MAX)           NOT NULL,
                [ImageData]                     VARBINARY(MAX)          NOT NULL,
                [Caption]                       NVARCHAR(MAX)           NULL,
                CONSTRAINT PK_ImageId PRIMARY KEY CLUSTERED (ImageId ASC)
                ON [PRIMARY]
            )

流利的映射:

public ImageMap()
    {
        Id(x=>x.Id,"ImageId").GeneratedBy.Identity();
        Map(x => x.Caption);
        Map(x => x.FileName);
        Map(x => x.Data).Column("ImageData");
        HasMany(x => x.ArticleImages).KeyColumn("ImageId").Inverse();
        HasOne(x => x.Thumbnail).PropertyRef(r=>r.Image).Cascade.All();
    }

NHibernate实体类:

using System.Collections.Generic;


public class Image : BaseEntity
{
    /// <summary>
    /// Image's name
    /// </summary>
    public virtual string FileName { get; set; }

    /// <summary>
    /// Image's Caption
    /// </summary>
    public virtual string Caption { get; set; }

    /// <summary>
    /// Binary data for the image
    /// </summary>
    public virtual byte[] Data { get; set; }

    /// <summary>
    /// Link to article
    /// </summary>
    public virtual IEnumerable<ArticleImage> ArticleImages { get; set; }

    /// <summary>
    /// The thumbnail for the image
    /// </summary>
    public virtual ImageThumbnail Thumbnail { get; set; }
}

1 个答案:

答案 0 :(得分:3)

修正了它。

将imagedata映射更改为

Map(x =&gt; x.Data).Column(“ImageData”)。CustomSqlType(“VARBINARY(MAX)”)。长度(160000);

由于某种原因,数据通过nhibernate映射被截断为8000字节。添加此修复它。