استيراد كائن OLE من الوصول إلى MySQL
-
09-06-2019 - |
سؤال
لدي جدول في جدول الوصول يحتوي على إدخالات المنتج، ويحتوي أحد الأعمدة على صورة 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، لكنني لم أجربه.