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.
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
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:
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.
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
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.
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();