web-dev-qa-db-fra.com

Quel est le moyen le plus simple de prévisualiser les données d’une colonne d’image?

J'ai quelques colonnes avec le type de données image et je veux prévisualiser (ou parcourir) les données de ces tables. Lorsque j'utilise Select top 1000 rows dans SQL Server Management Studio, la valeur des colonnes de l'image est affichée en hexadécimal. Quel est le moyen le plus simple de prévisualiser ces images car la valeur hexadécimale ne m’est pas utile?

PS: la base de données n’est pas sous mon contrôle, donc changer de type de données n’est pas une option.

17
André

J'écrirais un proc (ou une requête; voir ci-dessous) pour exporter le fichier binaire vers le système de fichiers, puis utiliser n'importe quel ancien utilitaire de gestion de photos disponible sur le marché (c'est-à-dire Windows Photo Viewer) pour jeter un coup d'œil à ce qu'il contient. 

Si votre nom astucieux dans votre nom de fichier, vous pouvez vous donner suffisamment d'informations sur chaque image du nom pour le retrouver rapidement dans la base de données une fois que vous avez localisé visuellement ce que vous recherchez. 

Voici un proc qui exportera du binaire vers le système de fichiers. J'ai modifié à partir de cet exemple de code . Il n'a pas été testé mais devrait être extrêmement proche du concept. Il utilise BCP pour exporter votre binaire. Vérifiez ici le documentation complète sur l'utilitaire BCP

Le proc vous donne également la possibilité d'exporter tout le contenu de la table, ou seulement une seule ligne basée sur la clé primaire passée. Il utilise un curseur (beurk), ainsi que du SQL dynamique (beurk, beurk) mais parfois, il faut faire ce que l'on doit faire.

 CREATE PROCEDURE ExportMyImageFiles
 (   
   @PriKey INT,
   @OutputFilePath VARCHAR(500)
 ) 
 AS 
 BEGIN 
     DECLARE @sql VARCHAR(8000) 

     IF @PriKey IS NULL /* export all images */
     BEGIN
        DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR

        SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable] 
           WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + 
           '" queryout ' + @OutputFilePath + MyImageName + '.' + 
           MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
        FROM [dbo].[MyTable]

        OPEN curExportBinaryImgs
        FETCH NEXT FROM curExportBinaryImgs INTO @sql

        WHILE @@FETCH_STATUS = 0
        BEGIN            
            EXEC xp_cmdshell @sql, NO_OUTPUT
            FETCH NEXT FROM curExportBinaryImgs INTO @sql
        END

        CLOSE curExportBinaryImgs
        DEALLOCATE curExportBinaryImgs
     END
     ELSE       /* Export only the primary key provided */     
     BEGIN
        SELECT @sql = 'BCP "SELECT MyImage FROM [dbo].[MyTable] 
        WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + 
            '" queryout ' + @OutputFilePath
            + MyImageName + '.' + MyImageType + 
            ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
        FROM [dbo].[MyTable]
        WHERE PrimaryKey = @PriKey

        EXEC xp_cmdshell @sql,NO_OUTPUT
     END 
 END

Tout cela en supposant bien sûr que ce qui est stocké dans votre colonne Image est en réalité une image et non un autre type de fichier. Espérons que si c'est une image, vous connaissez également le type, bmp, jpg, png, gif, etc.

Si vous ne voulez pas que cela soit compliqué ou réutilisable, essayez une requête unique comme celle-ci:


    DECLARE @OutputFilePath VarChar(500) = /* put output dir here */

    DECLARE @sql VARCHAR(8000)
    DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR
    SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable] 
       WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + 
       '" queryout ' + @OutputFilePath + MyImageName + '.' + 
       MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
    FROM [dbo].[MyTable]

    OPEN curExportBinaryImgs
    FETCH NEXT FROM curExportBinaryImgs INTO @sql

    WHILE @@FETCH_STATUS = 0
    BEGIN            
        EXEC xp_cmdshell @sql, NO_OUTPUT
        FETCH NEXT FROM curExportBinaryImgs INTO @sql
    END

    CLOSE curExportBinaryImgs
    DEALLOCATE curExportBinaryImgs
15
RThomas

Si vous avez LinqPad installé, la prévisualisation des images est simple. Interrogez votre enregistrement, convertissez les données binaires en une image, puis transférez le résultat dans la fenêtre d'aperçu. 

Edit: Si vous n'êtes pas au courant, LinqPad est un utilitaire gratuit qui peut être utilisé pour beaucoup de choses, comme remplacer le studio de gestion. La plupart du temps, je l'utilise comme bloc-notes pour .Net pour les programmes à jeter, le code de test et les échantillons.

var entity = // fetch data

using (var ms = new MemoryStream(entity.Image.ToArray()))
{
    System.Drawing.Image.FromStream(ms).Dump();
}

Voici à quoi ressemble le résultat:

enter image description here

24
hawkke

Le type image n'est pas destiné au stockage d'images, il s'agit simplement de "données binaires de longueur variable". Ce type est obsolète et vous devez maintenant utiliser varbinary (max) pour les données binaires de longueur variable.

Comme SQL Server ne sait pas quel type de données binaires a été stocké (.Zip, .exe, .jpg, .anything), il n’est pas surprenant que Management Studio ne fournisse pas d’aperçu.

Vous ne pouvez certainement pas prévisualiser ces types de données dans Managment Studio, mais j'aime bien la solution proposée par @RTomas.

9
Phil

Il existe un très bon complément pour SSMS SSMSBoost qui fournit de nombreuses fonctionnalités utiles et, bien sûr, le moyen le plus simple de prévisualiser les images stockées en SQL (du moins à mon avis).

NOTE: vous devez redémarrer SSMS après avoir installé ce complément.

Installez-le et profitez de la prévisualisation des images avec juste: Clic droit> Visualiser en tant que> Image

4
ABS

Je ne connais pas de moyen d'accomplir cela dans Management Studio. Vous seriez probablement mieux de serveur en écrivant une application simple qui peut interroger la base de données puis convertir l'hex en le type d'image correct (.jpg, .png, etc.) Il existe également des applications commerciales qui le feront pour vous.

4
goric

En utilisant linqpad, le code pourrait devenir encore plus simple

Si vous avez l'entité/le type avec vous sur la colonne de données binary, vous verriez la méthode .ToImage ()

En ce qui me concerne, je parcours toutes les lignes et publie toutes les colonnes binaires en images.

J'espère que ça aide.

var yourData_Or_List = // fetch data
DataItem_Or_ListItem.BinaryDataColumn.ToImage().Dump();

 liqpad binary data to image

0
Baljeetsingh