2008-09-03 10 views
1

제품 항목이 포함 된 액세스 테이블에 테이블이 있는데, 열 중 하나에 OLE 개체로 저장된 jpg 이미지가 있습니다. 이 테이블을 MySQL로 가져 오려고하는데 아무 것도 작동하지 않는 것 같습니다. MySQL 마이그레이션 도구를 사용해 보았지만 Access 및 OLE 개체와 관련된 알려진 문제점이 있습니다. (문제는 그것이 작동하지 않으며 필드를 공백으로 남겨 둡니다.) 나는 또한 this site 에 대한 제안을 시도했으며 데이터를 가져 오는 동안 이미지가 전송에서 손상된 것처럼 보입니다. 내가 jpg 이미지로 디스크에 저장하고 열려고하면 이미지가 손상되었다는 오류 메시지가 나타나면 이미지를 미리 봅니다. 바이너리 뷰를 얻습니다.Access에서 MySQL로 가져 오기

Access의 이미지는 좋으며 미리 볼 수 있습니다. 액세스는 데이터를 OLE 객체로 저장하고 MySql으로 가져올 때 MediumBlob 필드에 저장됩니다.

이전에이 문제가 발생한 사람이 누구였습니까? 어떻게 해결 했습니까?

답변

1

오케이 그래서 공개적으로 내 더러운 코드를 방송하기 위해 여기에 무슨 일이 생겼는지.
참고 : 이것은 한 번 사용 된 다음 버려 지도록 설계된 해킹입니다.

이 메서드는 액세스 테이블에서 1 행의 데이터가 포함 된 datarowview를 가져옵니다. 이미지는 OLE 직렬화로 래핑됩니다. Microsoft는이 방식의 작동 방식에 완전히 익숙하지 않지만 Microsoft 응용 프로그램을 사용하여 개체를 다른 어떤 것에 임베드하는 방법을 알고 있습니다. (예 : 이미지를 Excel 셀로). 필자는 전체 필드를 Byte 배열로로드하고 필드 내에서 이미지 데이터의 시작을 나타내는 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 항목을 업데이트하십시오.
괜찮 았지만 아마 더 나은 방법으로 직렬화를 제거했을 수도 있습니다.

1

"SQL Server Migration Assistant for Access"은 OLE 이미지를 올바르게 마이그레이션 하겠지만 Access-> SQLServer에만 해당됩니다. 그러나이 작업을 통해 SQLServer Express (무료 다운로드)로 마이그레이션 한 다음 SQLServer에서 MySQL로 마이그레이션 할 수 있습니다.

0

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

관련 문제