5

我在 MS SQL 2012 中使用数据类型“图像”来存储图像。

问题:我在 C# 的 BASE64 字符串中有一个图像

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

我将其转换为 C# 中的 byte[],因为我需要将其保存到数据类型为 IMAGE 的列中。像这样:

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

保存成功是这样的:

数据库中的 byte[] 数组数据 -

在此处输入图像描述

现在我正在尝试检索图像并将其转换回 BASE64 使用:

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

现在我得到这样的结果:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

结果不是我期待的应该是这样的

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2
4

6 回答 6

4

我找到了解决方案,请查看此问题,因为当您不想更改数据库中的数据类型 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 字符串。

谢谢你。

于 2019-03-07T05:55:20.557 回答
2

我相信您需要有关如何在 sql server 中存储图像数据的帮助。

您可以创建如下表。请注意,您可能不想创建数据库,只需一个表就足够了。如果您已经有一个要保存此数据的表,则必须确保列的类型是 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 );
}

希望这可以帮助。

于 2019-02-21T10:27:46.253 回答
1

您可以使用 XML 和提示“用于 xml 路径”将二进制文件转换为 Base64

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

在此处输入图像描述

于 2020-03-02T22:56:30.303 回答
1

我知道了!!!

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 字符串!

来自墨西哥的问候!!!

于 2020-11-06T06:56:28.533 回答
1

我使用下面的这种方法,将 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);
    }
}

问候。

于 2019-02-21T11:16:22.737 回答
1

回答你的问题

如何使用此 byte[] 数组从数据库中检索 base64?

SQL-Server 在将二进制文件嵌入 XML 时会将其隐式转换为 base64。

尝试这个

--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))第一个。

但是将其作为二进制文件检索并在客户端应用程序上进行转换可能更容易。

于 2019-02-21T10:28:39.310 回答