2 votes

Le stockage des images dans la base de données entraîne une image partielle

J'essaie de stocker des images dans une base de données sql server. J'ai une colonne dans une table Image qui stocke les données et qui est de type varbinary(max). J'utilise NHibernate pour accéder à la base de données.

Le chargement de l'image dans le code et sa conversion en un tableau tampon fonctionnent bien. Lorsque je stocke l'image dans la base de données, quelle que soit la taille de l'image supérieure à 30 Ko que je mets, seule une partie de l'image est enregistrée.

J'ai vérifié les données stockées dans la base de données et toutes les images ont la même quantité de données stockées. Je pense donc que quelque chose limite la taille de l'octet[] qui peut être contenu dans la colonne.

Lorsque je sors les données de la base de données et que j'affiche l'image à l'écran, seule la partie supérieure de l'image apparaît.

Qu'est-ce qui pourrait ne pas aller ?

Mise à jour : J'ai vérifié la taille des données dans la colonne varbinary(max) et toutes les entrées de données sont de 8000bytes.

Voici le code :

Création du tableau :

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

Cartographie fluide :

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();
    }

Classe d'entité 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; }
}

3voto

VARAK Points 401

Je l'ai corrigé.

J'ai changé le mappage des données d'image en

Map(x => x.Data).Column("ImageData").CustomSqlType("VARBINARY(MAX)").Length(160000) ;

Pour une raison quelconque, les données étaient tronquées à 8000 octets via le mappage nhibernate. L'ajout de cet élément a réglé le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X