【问题标题】:How to load MySQL blob into C# byte array如何将 MySQL blob 加载到 C# 字节数组中
【发布时间】:2014-03-19 05:34:23
【问题描述】:

我有一个 mysql 表,其中包含我用 PDF 填充的 Medium Blob 字段。

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());
   }
}

感谢任何见解。

编辑:

mysql blob 记录看起来像这样(一般)

JVBERi0xLjQKJ.....太多,无法发布.....AAAAAAAAAA==

【问题讨论】:

    标签: c# mysql blob


    【解决方案1】:

    我将根据我对 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://docs.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://docs.microsoft.com/en-us/dotnet/api/system.data.idatarecord.getbytes?view=netframework-4.7.2

    【讨论】:

      【解决方案2】:

      您可以为此使用内存流。

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

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

      【讨论】:

        【解决方案3】:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-10-31
          • 2019-12-18
          • 2012-06-06
          相关资源
          最近更新 更多