Reputation: 1317
I have a mysql table with a Medium Blob field that I filled with PDFs.
The PDFs are stored in the field without issue, and are inserted using the following query:
INSERT INTO PDFHistory ( OrderId, PDFByteArray) VALUES ( 123456, Convert.ToBase64String(pdf.ByteArray))
I am unable to pull the record and populate a byte[] object. I get the error "The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters."
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());
}
}
Any insight is appreciated.
Edit:
The mysql blob record looks like this (in general)
JVBERi0xLjQKJ.....too much to post.....AAAAAAAAAA==
Upvotes: 2
Views: 5140
Reputation: 1
Workable code in VB (NET CORE), try to use the same logic in 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)
Upvotes: 0
Reputation: 1654
I will answer this question from my knowledge of MSSQL and ADO.NET. I think similar principles apply when it comes to handling BLOB column type. If you want the Byte[] that was originally stored in the database then I do not see a need for conversion using FromBase64String unless the downstream application requires this explicitly.
How to get the raw byte array from the database?
//Assuming you have already retrieve an instance to the Datatable
byte[] raw=(byte[])dt.Rows[0]["PDFByteArray"]
MySql Reference
https://dev.mysql.com/doc/connector-net/en/connector-net-programming-blob-reading.html
ADO.NET Reference
https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-binary-data https://support.microsoft.com/en-gb/help/309158/how-to-read-and-write-blob-data-by-using-ado-net-with-visual-c-net https://learn.microsoft.com/en-us/dotnet/api/system.data.idatarecord.getbytes?view=netframework-4.7.2
Upvotes: 1
Reputation: 2175
You can use a memorystream for this.
MemoryStream ms = new MemoryStream(PdfBlob);
byte[] newPdf = ms.ToArray();
ms.Close();
I would not convert it to and from base64 strings. That would only matter if you were displaying blob contents directly in a web page (an image).
Upvotes: 0