2011-04-18 50 views
2

我试图将图像存储在sql server数据库中。我在存储数据的Image表中有一列,并且类型为varbinary(max)。我使用NHibernate来访问数据库。将图像存储在数据库中会产生部分图像

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

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

当我将数据从数据库中拉出并在屏幕上显示图像时,它仅显示图像的顶部。

什么可能是错的?

更新: 我检查了varbinary(max)列中数据的大小,所有数据项都是8000bytes。

下面的代码:

创建表:

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

你想要一个文本形式或实际代码的答案?如果你想要的代码,我建议你也发布一些我们也... – Niklas 2011-04-18 17:59:19

+0

修复它。 将图像数据映射更改为 Map(x => x.Data).Column(“ImageData”)。CustomSqlType(“VARBINARY(MAX)”)。Length(160000); – VARAK 2011-04-18 18:41:18

回答

3

固定它。

改变了图象 - 映射到

地图(X => x.Data).COLUMN( “的ImageData”)CustomSqlType( “VARBINARY(MAX)”)长度(160000)。;

出于某种原因,通过nhibernate映射将数据截断为8000字节。添加这个固定它。

+2

我有同样的问题,添加这些属性不会修复它,数据仍然会被存储在最大8000b,任何想法除了映射配置还有什么可能导致这一点? – jgemedina 2012-02-22 23:53:57

+0

为我工作。使用SQL 2008,NHibernate 3.2和通过代码进行映射 – 2012-07-05 11:15:55