如何将MySQL blob加载到C#字节数组中

wlwcrazw  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(89)

我有一个mysql表,其中有一个Medium Blob字段,我用PDF填充。
PDF存储在字段中,没有问题,并使用以下查询插入:

INSERT INTO PDFHistory ( OrderId, PDFByteArray) VALUES ( 123456, Convert.ToBase64String(pdf.ByteArray))

我无法提取记录并填充byte[]对象。输入不是有效的Base-64字符串,因为它包含一个非base 64字符,两个以上的填充字符,或填充字符中的非法字符。

dbManager.Open();
using (DataTable dt = dbManager.ExecuteDataTable(CommandType.Text, "SELECT * FROM PDFHistory WHERE OrderId = {0} ORDER BY Timestamp DESC LIMIT 1" ))
{
   if (dt.Rows.Count > 0)
   {
       byte[] PDFByteArray = Convert.FromBase64String(dt.Rows[0]["PDFByteArray"].ToString());
   }
}

任何见解都是赞赏的。
编辑:
mysqlblob记录如下所示(一般情况下)
JVBERi 0xLjQKJ......太多了..... AAAAAAAAAA==

egmofgnx

egmofgnx1#

我将根据我对MSSQL和ADO.NET的了解来回答这个问题。我认为类似的原则也适用于处理BLOB列类型。如果你想要的Byte[]最初存储在数据库中,那么我认为不需要使用 FromBase64String 进行转换,除非下游应用程序明确要求这样做。

如何从数据库中获取原始字节数组?

//Assuming you have already retrieve an instance to the Datatable
byte[] raw=(byte[])dt.Rows[0]["PDFByteArray"]

MySql参考

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-blob-reading.html

ADO.NET引用

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-binary-datahttps://support.microsoft.com/en-gb/help/309158/how-to-read-and-write-blob-data-by-using-ado-net-with-visual-c-nethttps://learn.microsoft.com/en-us/dotnet/api/system.data.idatarecord.getbytes?view=netframework-4.7.2

1cosmwyk

1cosmwyk2#

你可以使用一个内存流。

MemoryStream ms = new MemoryStream(PdfBlob);
                byte[] newPdf = ms.ToArray();
                ms.Close();

我不会将它转换为base64字符串。只有当您直接在网页(图像)中显示blob内容时,这才有意义。

icnyk63a

icnyk63a3#

在VB中的可行代码(NET CORE),尝试在C#中使用相同的逻辑

Dim Buf1 As Byte() = New Byte() {}
        ReDim Buf1(100)
        _DB.RawSqlQuery(Of Byte())($"select aes_encrypt('{Text}','{KeyString}') as aes_encrypt", Function(X)
                                                                                                     CType(X("aes_encrypt"), Byte()).CopyTo(Buf1, 0)
                                                                                                     ReDim Preserve Buf1(CType(X("aes_encrypt"), Byte()).Length - 1)
                                                                                                     Return Nothing
                                                                                                 End Function)

相关问题