Хорошо, поэтому в интересах выкладывания моего грязного кода на публику, вот что я придумала.
Примечание: это взлом, предназначенный для использования один раз, а затем выброшенный.
Этот метод принимает datarowview, содержащий 1 строку данных из таблицы доступа. Изображения обернуты в OLE-сериализацию, я не совсем знаком с тем, как это работает, но с тем, как приложения Microsoft позволяют встраивать любой объект во что-то другое. (например, изображения в ячейках Excel). Мне нужно было удалить ненужную сериализацию вокруг изображения, поэтому я загрузил все поле в виде массива байтов и искал в нем 3 одновременных записи (FF D8 FF), которые представляют начало данных изображения внутри поля.
Private Function GetImageFromRow(ByRef row As DataRowView, ByVal columnName As String) As Bitmap
Dim oImage As Bitmap = New Bitmap("c:\default.jpg")
Try
If Not IsDBNull(row(columnName)) Then
If row(columnName) IsNot Nothing Then
Dim mStream As New System.IO.MemoryStream(CType(row(columnName), Byte()))
If mStream.Length > 0 Then
Dim b(Convert.ToInt32(mStream.Length - 1)) As Byte
mStream.Read(b, 0, Convert.ToInt32(mStream.Length - 1))
Dim position As Integer = 0
For index As Integer = 0 To b.Length - 3
If b(index) = &HFF And b(index + 1) = &HD8 And b(index + 2) = &HFF Then
position = index
Exit For
End If
Next
If position > 0 Then
Dim jpgStream As New System.IO.MemoryStream(b, position, b.Length - position)
oImage = New Bitmap(jpgStream)
End If
End If
End If
End If
Catch ex As Exception
Throw New ApplicationException(ex.Message, ex)
End Try
Return oImage
End Function
Тогда нужно вытянуть эти данные в растровое изображение. Поэтому для каждой строки в таблице доступа я извлекаю растровое изображение, а затем обновляю соответствующую запись MySQL.
Это работало нормально, но я предполагаю, что я мог бы удалить сериализацию лучше, возможно, есть API для этого.