Тип данных SQL Server Image для преобразования Base64

Я использую тип данных "Изображение" в MS SQL 2012 для хранения изображений.

проблема: у меня есть изображение в строке BASE64 в C#

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

Я конвертирую его в byte[] в C#, так как мне нужно сохранить его в столбце типа данных IMAGE. Как это:

byte[] imageInByteArray =Convert.FromBase64String("MyImage");

Это успешно сохранено как это:

Данные массива byte[] в базе данных -

Теперь я пытаюсь получить изображение и преобразовать его обратно в BASE64, используя это:

var imageA = results.Read<byte[]>().ToArray();
string imageB =Convert.ToBase64String(imageA);

Теперь я получаю такой результат:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

Результат не тот, который я ожидал, он должен быть таким

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

3 ответа

Я нашел решение для этого, пожалуйста, посмотрите на это, потому что это может быть полезно, если вы не хотите изменять свой тип данных Image в вашей базе данных:

Я отправил строку base64 как есть в базу данных и там преобразовал ее в varbinary следующим образом:

SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')

и вставил его в столбец изображения.

Затем я получил изображение в base64 следующим образом:

 SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...

Он дал мне точную строку Base64, которую я отправил ранее.

Благодарю вас.

Вы можете конвертировать двоичный файл в Base64, используя XML и подсказку "для пути xml"

select file_name,ColumnWithBinary,ColumnToSwFinalResult
from TableWithBinary
cross apply (select ColumnWithBinary '*' for xml path('')) T (ColumnToSwFinalResult)
GO

Я считаю, что вам нужна помощь о том, как хранить данные изображения на сервере SQL.

Вы можете создать таблицу, как показано ниже. Обратите внимание, что вы можете не захотеть создавать базу данных, достаточно таблицы. Если у вас уже есть таблица, в которой вы хотите сохранить эти данные, вам нужно убедиться, что тип столбца - varbinary(max).

CREATE DATABASE MyDatabase;  
GO  
USE MyDatabase;  
GO  
CREATE TABLE MyImageDatabaseTable (Id int, BLOBData varbinary(max));  
GO  

Тогда вы можете прочитать данные как:

SqlConnection objConn = new SqlConnection(connectionString);  
objConn.Open();  
SqlCommand objCmd = new SqlCommand("Select * From MyImageDatabaseTable", objConn);  
SqlDataReader dr = objCmd.ExecuteReader();  
while(dr.Read())
{
     byte[] myImageByteArrayData = (byte[]) dr["BLOBData"];  

     string myImageBase64StringData = Convert.ToBase64String(myImageByteArrayData );
}

Надеюсь это поможет.

Я использую этот метод ниже, чтобы преобразовать bytearray из базы данных в изображение.

public Bitmap ConvertByteArrayToBitmap(byte[] Array)
{
    if (Array == null) return null;

    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
        ms.Write(Array, 0, Array.Length);
        ms.Position = 0L;

        return new Bitmap(ms);
    }
}

С уважением.

Я понял!!!

Код C#

string base64Encoded = Convert.ToBase64String(((byte[])result.photoFromSQLImageColumn));
string base64Decoded;
byte[] data = System.Convert.FromBase64String(base64Encoded);
base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);

и в этой переменной -----> base64Decoded у вас будет правильная строка base64!!

Привет из Мехико!!!

Отвечая на ваш вопрос

Как извлечь base64 из базы данных, используя этот массив byte[]?

SQL-сервер неявно преобразует ваш двоичный файл в base64 при встраивании его в XML.

Попробуй это

--I fill a binary variable with some dummy content
DECLARE @SomeBinary VARBINARY(MAX) = CAST('This is a dummy content' AS VARBINARY(MAX));
--this is the resulting binary
SELECT @SomeBinary;
--Now you see what happens using FOR XML PATH
SELECT (SELECT @SomeBinary FOR XML PATH(''))

Мы можем преобразовать это легко

DECLARE @base64 VARCHAR(MAX)='VGhpcyBpcyBhIGR1bW15IGNvbnRlbnQ=';
SELECT CAST(@base64  AS XML).value('.','varbinary(max)');

Возможно, вам придется использовать CAST(YourImageTypedColumn AS VARBINARY(MAX)) первый.

Но может быть проще извлечь это как двоичный файл и преобразовать его в ваше клиентское приложение.

Другие вопросы по тегам