Импорт объекта OLE из Access в MySQL

У меня есть таблица в таблице доступа, которая содержит записи о продукте, в одном из столбцов есть изображение jpg, сохраненное как объект OLE. Я пытаюсь импортировать эту таблицу в MySQL, но ничего не работает. Я пробовал инструмент миграции MySQL, но у него есть известная проблема с объектами Access и OLE. (Проблема в том, что он не работает и оставляет поля пустыми). Я также попробовал это предложение на этом сайте и пока данные импортируются, кажется, что изображение при передаче повреждается. Когда я пытаюсь просмотреть изображение, я просто получаю двоичное представление, если я сохраняю его на диске как изображение jpg и пытаюсь открыть, я получаю сообщение об ошибке, указывающее, что изображение повреждено.

С изображениями в Access все в порядке, их можно предварительно просмотреть. Access хранит данные как объект OLE, и когда я импортирую их в MySql, они сохраняются в поле MediumBlob.

У кого-нибудь была эта проблема раньше и как они ее решили?


person SecretDeveloper    schedule 03.09.2008    source источник


Ответы (3)


Насколько я помню, Microsoft "Помощник по миграции SQL Server для Access "правильно перенесет изображения OLE, но это только для Access-> SQLServer. Однако вы можете использовать это для перехода на SQLServer Express (бесплатная загрузка), а затем перейти с SQLServer на MySQL.

person DAC    schedule 03.09.2008

Итак, в интересах публичного обнародования моего грязного кода, вот что я придумал.
Примечание: это хитрость, предназначенная для однократного использования, а затем выбрасываемой.

Этот метод принимает представление данных, содержащее 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.

person SecretDeveloper    schedule 03.09.2008

Также существует olefield - модуль Python для извлечения данных из полей объекта OLE в Access. Я успешно извлек с его помощью файлы BMP. Вероятно, он мог бы работать с изображениями jpeg, но я не пробовал.

person ash    schedule 07.04.2012