حفظ الصور داخل قاعدة البيانات - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
الثلاثاء
2016-12-06
1:12 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

حفظ الصور داخل قاعدة البيانات
حفظ الصور في قاعدة بيانات

مقــــدمــه
استخدام قواعد البيانات امر شائع في الكثير من التطبيقات , ولربما اقتضت الحاجة الى تخزين الصور داخل قاعدة البيانات , وهذه المقاله ستشرح طريقه حفظ واسترجاع الصور من قاعدة البيانات - وقد استخدمنا قاعده بيانات على سكوال سيرفر .
قاعدة البيانات
اضفنا قاعدة بيانات توضيحيه فقط تحتوي على جدول (ImagesTable) يحتوي على عمودين (ImageID) وهو من النوعint ويتزايد تلقائياً , وعمود اخر (theImage) من النوع image وهو يحتوي على الصورة المخزنه , وهذا الجدول سيتم تخزين الصور داخله .

تحتوي قاعدة البيانات ايضا على امرين مخزنين (stored procedure) , الاول يقوم بحفظ الصور داخل قاعة البيانات , والاخر يقوم باسترجاع الصور منها , وسنقوم بوضع السكوال سكريبت الخاص بهم .
Save & Get Image Stored Procedures
تخزين وحفظ الصورة
يعتمد التخزين على فكره تحويل الصورة الى مصفوفه من النوع byte لتكون مناسبة للتخزين داخل قاعدة البيانات , وفي سبيل ذلك سنستخدم كلاس MemoryStream وهو كلاس خاص بتخزين في الذاكره مباشرة
-- يجب استخدام النيم سبيس System.IO
حيث نقوم بحفظ الصورة بداخله , ثم يتم تحويلها الى مصفوفه من النوع byte , وهذا الكود يوضح اكثر
Image in Memory Stream
 
ثم نقوم بعد ذلك بتخزين تلك المصفوفه داخل عمود theImage في الجدول , وذلك عن طريق فتح اتصال مع قاعدة البيانات وننفيذ StoredProcedure الخاص بحفظ الصورة , وقد وضعنا هضه المهمه داخل داله تقوم بأخد المصفوفه من النوع  byte وتخزينها في قاعدة البيانات , وهذا كود الداله
Save Image Method
 
حيث نقوم في البدايه يتعريف اتصال جديد مع قاعدة البيانات واضافة معلومات الاتصال بداخله , ثم نقوم بعمل امر SqlCommand بغرض تنفيذ امر معين داخل قاعدة البيانات , ويتم تجهيز اعدادت الامر , حيث يعطى له الاتصال الذي سيصله بقاعدة البيانات - وهو الامر المعرف مسبقا - , وايضا نوع الامر الذي سينفذه سواء اجراء مخزن - كما في حالتنا هذه وهو الاجراء المفضل في كثير من الاحيان - او امر نصي مباشر - حيث يكتب اكر السكوال مباشره - , وايضا نص الامر , وهنا مع استخدام الاجراء المخزن (stored procedure) يتم كتابة اسم الاجراء SaveImage
ثم ننتقل بعد ذلك بتعريف المتغيرات التي يحملها الاجراء داخل الامر وهي تعتبر في الامر Parameters , فنضيف الى الامر parms. بعدد المتغيرات الموجوده في الاجراء داخل قاعدة البيانات , وايضا تعريف اسم ونوع المتغير , وهنا لا نستخدم سوى متغير واحد فقط وهو الصورة من النوع  image , ثم بعد تعريفه تعطى له القيمة التي سيستخدمها الاجراء في تنفيذ الامر المخزن به , وهنا قمنا باعطائه المصفوفه byte التي تحتوي على الصورة , وهنا يكون الامر جاهز للتنفيذ , فنقوم بفتح الاتصال مع القاعده , وتنفيذ الامر واغلاق الاتصال مره اخرى .
وقد استخدمنا الداله ExecuteNonQuery لأن الامر لا يقوم بارجاع شئ من قاعده البيانات , حيث يقوم الامر بتخزين الصورة فقط , وهذه الداله تقوم بارجاع رقم يحتوي على عدد الصفوف التي تأثرت بتنفيذ الامر في قاعدة البيانات , ومن المتوقع - في الاطار الطبيعي للتنفيذ - ان يكون الرقم = 1 , حيث سيتأثر صف واحد فقط وهو الصف الذي سيضاف الي قاعدة البيانات , اما اذا كان الرقم = 0 فهذا يعني ان شيئاً لم يحدث , وبالتالي فإن الامر لم ينفذ ومن المحتمل حدوث خطأ ما ,
استرجاع الصورة من قاعدة البيانات 
بنفس المنطق السابق , وبنفس الطريقه نقوم باسترجاع الصورة من قاعدة البيانات , حيث ان الصورة مرت عند تخزينها على المراحل التاليه صورة > MemoryStream > مصفوفه من النوع byte > قاعدة البيانات , والان سنقوم بعكس العمليه بنفس الترتيب حيث تكون المراحل كالتالي قاعدة البيانات > مصفوفه byte > MemoryStream > صورة .
حيث نقوم باسترجاع الصورة من خلال الاجراء المخزن GetImage والذي تم وضع الكود الخاص به من قبل , وتكون القيمة الاتيه من قاعدة البيانات على هيئه مصفوفه من النوع byte وقد اضفنا داله تقوم باسترجاع الصورة من قاعدة البيانات في شكل مصفوفه byte , وترجع الصورة عن طريق الرقم الخاص بكل صورة في العمود ImageID , وهذا كود الداله .
Retrieve Image as byte[] Array
 
حيث تقوم الداله بتعريف اتصال وامر سكوال جديد كما تم شرحه في السابق , وايضا تعريف الاعدادات الخاصه بالامر , وبنفس طريقه اضافة المتغيرات السابقه نضيف المتغير الذي سيستخدمه هذا الاجراء في تنفيذ الامر , حيث في الداله السابقه كان المتغير من النوع image حيث كان يتم اعطائه قيمة الصورة متمثله في مصفوفه byte , اما في هذا الاجراء فان المتغير - وهو ايضاً متغير واحد فقط - من النوع int وهو ياخذ رقم الصوره في العمود imageId .
ثم نقوم بفتخ الاتصال , وتنفيذ الامر وغلق الاتصال , ولكن في هذه الحاله فان هناك قيمة سترجع من قاعدة البيانات , وهي قيمة الصورة المخزنه , ولان ما سيأتي من تنفيذ الامر هو قيمة واحده فقط - حيث يختار الامر الصورة التي في الصف الذي رقمه imageId - , فاننا استخدمنا الداله ExecuteScalar وهي تقوم بارجاع البيانات في صورة object وذلك حتى تكون لدى الداله المرونه في ارجاع اي نوع من البيانات - حيث النوع object يمكنه حمل اي نوع من البيانات - , فتقوم الداله بارجاع الصورة في عنصر من النوع object , فنقوم بتحويله الى مصفوفه من النوع byte (Casting) , وهذه المصفوفه هي التي تعود من دالتنا في البرنامج return value .

والان وصلنا للمرحله الثانيه للصورة وهي مرحله (مصفوفه byte) , وبالتالي سننتقل للمرحله التاليه , حيث سنقوم بوضع المصفوفه داخل MemeoryStream , ثم بعد ذلك تحويلها الى صورة لتنتهي المراحل جميعها , واليكم الكود .
Byte Array > MemoryStream > Image
 
حيث نقوم باخد القيمة المرتجعه من الداله GetImageFromDB , ووضعها في MemoryStream , ثم اخذ الصورة من ال MemoryStream عن طريق الداله Image.FromStream والخاصه بالكلاس Image , وقد قمنا بعمل فحص للمصفوفه , حيث لو كانت المصفوفه خاليه null فهذا يعني ان الامر لم يرجع شئ من قاعدة البيانات , وهذا قد يكون خطأ عير متوقع او ان الصورة المطلوبه غير موجوده اصلا , حيث يمكن ان يكون رقم الصورة imageId غير مدرج في قاعدة البيانات .

وفي النهايه تكون لديك صورة , يمكنك وضعها اينما تشاء او التصرف فيها كيفما تشاء , سواء بحفظها او عرضها وهكذا.
ختـــــــام
موضوع تخزين البيانات داخل قواعد البيانات موضوع هام جداً , وقد رأيت الكثر من التساؤلات حول هذا الموضوع في كثير من الاماكن , فأبينا إلا ان نكون من ناشري الموضوع لتعم الاستفاده للجميع

-- تم رفع سكريبت لقاعدة البيانات يمكنك تحميله وتنفيذه داخل ال Query Analyzer اذا كان لديك سكوال سيرفر على جهازك , وهذا رابط التحميل
تحميل المشروع
  Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2011-08-19 4:09 PM)
مشاهده: 5075 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 0
إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz