سؤال

لدي جدول في جدول الوصول يحتوي على إدخالات المنتج، ويحتوي أحد الأعمدة على صورة jpg مخزنة ككائن OLE.أحاول استيراد هذا الجدول إلى MySQL ولكن يبدو أن لا شيء يعمل.لقد قمت بتجربة أداة ترحيل MySQL ولكن هناك مشكلة معروفة في Access وكائنات OLE.(المشكلة هي أنها لا تعمل وتترك الحقول فارغة) لقد جربت الاقتراح أيضًا هذا الموقعوأثناء استيراد البيانات يبدو كما لو أن الصورة قد تعرضت للتلف أثناء النقل.عندما أحاول معاينة الصورة، أحصل على عرض ثنائي، وإذا قمت بحفظها على القرص كصورة jpg وحاولت فتحها، أحصل على خطأ يفيد بأن الصورة تالفة.

الصور الموجودة في Access جيدة ويمكن معاينتها.يقوم Access بتخزين البيانات ككائن OLE وعندما أقوم باستيرادها إلى MySql يتم حفظها في حقل MediumBlob.

هل واجه أحد هذه المشكلة من قبل وكيف تم حلها؟

هل كانت مفيدة؟

المحلول 2

حسنًا، من أجل نشر الكود القذر الخاص بي علنًا، إليك ما توصلت إليه.
ملحوظة :هذا اختراق مصمم ليتم استخدامه مرة واحدة ثم يتم التخلص منه.

تأخذ هذه الطريقة عرض بيانات يحتوي على صف واحد من البيانات من جدول الوصول.يتم تغليف الصور في تسلسل 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) للقيام بذلك.

نصائح أخرى

بقدر ما أتذكر، مايكروسوفت "مساعد ترحيل خادم SQL للوصول" سوف يقوم بترحيل صور OLE بشكل صحيح، ولكن هذا مخصص فقط لـ Access->SQLServer.ومع ذلك، ما يمكنك فعله هو استخدام هذا للانتقال إلى SQLServer Express (تنزيل مجاني) ثم الترحيل من SQLServer إلى MySQL.

هناك ايضا أوليفيلد - وحدة بايثون لاستخراج البيانات من حقول كائنات OLE في Access.لقد نجحت في استخراج ملفات BMP به.ربما يمكن أن يعمل مع صور jpeg، لكنني لم أجربه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top