Тип данных 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))
первый.
Но может быть проще извлечь это как двоичный файл и преобразовать его в ваше клиентское приложение.