Самый простой способ просмотреть данные из столбца изображения? - программирование
Подтвердить что ты не робот

Самый простой способ просмотреть данные из столбца изображения?

У меня есть несколько столбцов с типом данных image, и я хочу просмотреть (или просмотреть) данные в этих таблицах. Когда я использую Select top 1000 rows в SQL Server Management Studio, значение столбцов изображения отображается шестнадцатеричным. Самый простой способ просмотреть эти изображения, поскольку значение hex не полезно для меня?

PS.: база данных не находится под моим контролем, поэтому изменение типа данных не является вариантом.

4b9b3361

Ответ 1

Я бы написал proc (или запрос, см. ниже), чтобы экспортировать двоичный файл в файловую систему, а затем использовать любую старую утилиту управления фотографиями на полке (например, Windows Photo Viewer), чтобы принять Посмотрите, что внутри.

Если ваш умный в названии файла вы можете дать себе достаточно информации о каждом изображении в названии, чтобы быстро найти его в базе данных снова, как только вы наглядно найдете то, что ищете.

Вот proc, который будет экспортировать двоичный файл в файловую систему. Я изменил из этот примерный код. Он непроверен, но должен быть предельно близок к концепции. Он использует BCP для экспорта вашего двоичного кода. Проверьте здесь полные документы в утилите BCP.

Прок также дает вам возможность экспортировать все в таблицу или только одну строку на основе переданного ключевого ключа. Он использует курсор (yuck), а также некоторый динамический sql (yuck, yuck), но иногда вы должны делать то, что должны делать.

 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

Это все, конечно, предполагает, что то, что хранится в столбце "Изображение", на самом деле является изображением, а не другим типом файла. Надеюсь, если это изображение, вы также знаете тип, bmp, jpg, png, gif и т.д.

Если вы не хотите, чтобы hassle или reusability полностью обработанного proc попробовали один запрос, например:


    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

Ответ 2

Если у вас установлен LinqPad, предварительный просмотр изображений прост. Запросите свою запись, преобразуйте двоичные данные в изображение, а затем выгрузите вывод в окно предварительного просмотра.

Изменить: если вы не знаете, LinqPad - бесплатная утилита, которая может использоваться для многих вещей, таких как замена для студии управления. Большую часть времени я использую его как блокнот для .Net для отбрасывающих программ, тестового кода и образцов.

var entity = // fetch data

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

Вот как выглядит результат:

enter image description here

Ответ 3

Тип image не предназначен для хранения изображений, а просто "двоичных данных переменной длины". Этот тип устарел, и теперь вы должны использовать varbinary (max) для двоичных данных переменной длины.

Поскольку SQL Server не знает, какой тип двоичных данных был сохранен (.zip,.exe,.jpg,.anything), это не удивительно, что Management Studio не предоставляет предварительный просмотр.

Вы определенно не можете просматривать эти типы данных в Managment Studio, но мне нравится решение, данное @RTomas.

Ответ 4

Я не знаю, как это сделать в Management Studio. Вероятно, вам лучше написать письмо с простым приложением, которое может запросить базу данных, а затем преобразовать шестнадцатеричный код в правильный тип изображения (.jpg,.png и т.д.). Существуют также коммерческие приложения, которые сделают это для вас.

Ответ 5

Существует действительно замечательная надстройка для SSMS SSMSBoost, которая предоставляет множество полезных функций и, конечно, самый простой способ для предварительного просмотра изображений, хранящихся в SQL (по крайней мере, на мой взгляд)

ПРИМЕЧАНИЕ: вы должны перезапустить SSMS после установки этой надстройки.

Установите его и наслаждайтесь просмотром изображений с помощью: RightClick > Визуализировать как > Изображение