문제

제품 항목이 포함된 액세스 테이블에 테이블이 있는데 열 중 하나에 OLE 개체로 저장된 jpg 이미지가 있습니다.이 테이블을 MySQL로 가져오려고 하는데 아무것도 작동하지 않는 것 같습니다.MySQL 마이그레이션 도구를 사용해 보았으나 Access 및 OLE 개체에 알려진 문제가 있습니다.(문제는 작동하지 않고 필드를 비워 둡니다.) 또한 제안을 시도했습니다. 이 장소데이터를 가져오는 동안 전송 중에 이미지가 손상된 것 같습니다.이미지를 미리 볼 때 바이너리 보기만 표시됩니다. 디스크에 jpg 이미지로 저장하고 열려고 하면 이미지가 손상되었다는 오류가 발생합니다.

Access의 이미지는 양호하며 미리 볼 수 있습니다.Access는 데이터를 OLE 개체로 저장하고 MySql로 가져올 때 MediumBlob 필드에 저장됩니다.

이전에 이 문제를 겪은 사람이 있었고 어떻게 해결했습니까?

도움이 되었습니까?

해결책 2

좋아, 내 더티 코드를 공개적으로 공개하기 위해 내가 생각해낸 것입니다.
메모 :이것은 한 번 사용하고 버리도록 설계된 해킹입니다.

이 메서드는 액세스 테이블의 데이터 행 1개가 포함된 datarowview를 가져옵니다.이미지는 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가 있을 것입니다.

다른 팁

내가 기억하는 한, 마이크로소프트는 "Access용 SQL Server 마이그레이션 도우미"는 OLE 이미지를 올바르게 마이그레이션하지만 이는 Access->SQLServer에만 해당됩니다.그러나 이를 사용하여 SQLServer Express(무료 다운로드)로 마이그레이션한 다음 SQLServer에서 MySQL로 마이그레이션할 수 있습니다.

또한 있습니다 올레필드 - Access의 OLE 개체 필드에서 데이터를 추출하는 Python 모듈입니다.BMP 파일을 성공적으로 추출했습니다.JPEG 이미지에서도 작동할 수 있지만 시도하지는 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top