الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة فى استرجاع الصورة من قاعدة البيانات

مغلق
بدأه mr_boss في 29 مارس 2007 · 6 رد · 927 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أخوانى الأعزاء

لدى جدول به صورة ، أريد أن أقوم باستدعائها فى PictureBox

وقمت بكتابة الكود (الصورة المرفقة) ، ولكن يظهر خطأ ، أرجو إفادتى حول كيفية إصلاح هذا الخطأ

ImageError.jpg

تحياتى

Flag_of_Palestine.gif
#2

السلام عليكم ورحمة الله وبركاته.

مرحبا أخي, قم بتوضيح الكود أكثر, فأنت لم تذكر ما ترجعه دالة selectCommand وما فائدة وجود الـ DataAdapter ان كنت لا تستخدمه, وما الذي يرجعه sp_CoPhotoLoad ؟

عموما أنا كتبت Method يمكنك استخدامها بتمرير الخلية التي تحتوي على الصورة :

private Bitmap CreateImage(object cell)
{
	if (cell.GetType() == typeof(byte[]))
	{
	  return new Bitmap(new MemoryStream((byte[])cell));
	}

	else if (cell.GetType() == typeof(Bitmap))
	{
	  return (Bitmap)cell;
	}

   return null;
}

بعد ملئ الجدول والتأكد انه يحتوي على الصور, قم بتمرير الخلية التي تحتوي على الصورة للـ Method السابقة :

pictureBox1.Image = CreateImage(ds.Tables[0].Rows[0]["CoPhoto"]);

ان كنت تود استرجاع صورة واحدة وهذا ما أظنه فليس هناك داع لاستخدام DataSet و DataAdapter والخ.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

أشكرك أخى العزيز على الاهتمام

الموضوع أنى أريد استدعاء صورة من قاعدة بيانات SQL2000

وكنت أحاول ذلك عن طريق Stored Procedure يأتى بالصورة ، ثم يضعه فى Dataset من خلال SelectCommand Method ، وتحتوى Dataset على []Object Byte

والمشكلة هى رسالة الخطأ التى تظهر Parameter is not valid

وعندما تتبعت الكود ، وجدت myStr يحتوى على قيمة 21 ، ولكن لا يستطيع وضعها داخل PictureBox.Image

فأرجو الإفادة جزاك الله خيراً

وبالمناسبة أنى وجدتك ، لدى طلب أرجو ألا أثقل عليك به

طلب منى برنامج يتم عمل الفورم الخاصة به عن طريق ملفات HTML ، باستخدام JavaScript ، بحيث يكون البرنامج خليط بين

Windows Application و Web Application

ويكتب الكود عن طريق C# 2005 ، ولكن بدون فورم ، ويتم وضع Events بالبرنامج لعدد من Controls

ولكن يتم تحديد مكان هذه Controls فى ملف HTML

أرجو إفادتى بطريقة عمل هذا ، حيث أنى أتعرض لهذا لأول مرة ، وإن وجد مثال أكون شاكراً لله ثم لك

جزاك الله خيراً

Flag_of_Palestine.gif
#4

أخى العزيز معتز

برجاء الرد للأهمية

تحياتى

Flag_of_Palestine.gif
#5

في الحقيقة لا أستطيع حل المشكلة بدون رؤية أو معرفة ما تستقبله وما ترجعه الـ Stored Procedure ! على كل حال ان كان العمود الذي يحتوي على الصورة اسمه PhotoColumn والجدول اسمه PhotosTable, يمكنك عمل هذا :

DataTable yourDataTable = new DataTable();

SqlCommand yourCommand = new SqlCommand("Select PhotoColumn from PhotosTable");
yourCommand.Connection = yourConnection;

yourCommand.Connection.Open();
yourDataTable.Load(yourCommand.ExecuteReader());
yourCommand.Connection.Close();

بعد هذا ارسل الخلية التي تود عرض صورتها في الـ PictureBox لدالة الـ CreateImage التي كتبتها في الكود السابق, مثلا :

yourPictureBox.Image = CreateImage(yourDataTable.Rows[0][0]);

وان كنت تود استرجاع صورة واحدة فلا داع لاستخدام الـ DataTable فاعمل Query مثلا بـ ID الصف الذي تريده واستخدم ExecuteScalar.

وبالنسبة للاستفسار الثاني فالحقيقة لم أفهم منك المطلوب بدقة, فاعطني مثال أو اسم برنامج موجود يشبه ما تريد فعله.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#7

من خلال المثال الذي وضعته أعتقد أن طريقة حفظ الصورة في قاعدة البيانات غير صحيحة:

execCommand("sp_SavePhoto '" + pictureBox1.Image + "'");

يجب تمرير مصفوفة من البايتات Byte[]:

1 - Save Image to MemoryStream
2 - Write Memory Stream to Byte array
3 - Use SqlParameter to pass Byte[] value

أرجو تجريب الخطوات السابقة لأنها مجربة وصحيحية 100%

والشيفرة التالية أستخدمها في مشاريعي وهي شغالة 100%:

private byte[] GetImageBytes()
		{
			string TempFile = Path.GetTempFileName();
				pbLogo.Image.Save(TempFile);

			FileStream fs = new FileStream(TempFile, FileMode.Open);
			byte[] buffer = new byte[fs.Length];

			fs.Read(buffer, 0, Convert.ToInt32(fs.Length));
			fs.Close();
			return buffer;
		}

أما تمرير مصفوفة البايتات فيتم كما يلي:

Command.AddWithValue("@Image", GetImageBytes());

الشيفرة التالية مجرد مثال بسيط وغير كامل أرجو أن تستفيد منه

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…