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

كيف ادخل صورة من picture box الى اكسس داتا بيس والعكس

مغلق
بدأه Romantic_touch في 11 ديسمبر 2006 · 5 رد · 1,718 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الاخوان الاعزاء واجهتني مشكلة في كيف ادخل صورة من

picturebox

الى قاعدة بيانات اكسس

والعكس صحيح

وايضا التعديل عليها

ودمتم

تم تعديل هذه المشاركة بواسطة Romantic_touch في 11 ديسمبر 2006 في 18:23

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#2

السلام عليكم

لإضافة صورة من picturebox إلى Access DataBase سيكون كالتالي:

في 2003 يكون الحل بأن نكتب جملة الادخال بهذا الشكل:

Dim sqlStatement As String = _
	("INSERT INTO pictures(FileName,Picture) VALUES(?,?)")

ثم نقوم بإنشاء عنصر من نوع Oledb Command يأخذ الـ Querey كممرر أول و عنصر الاتصال كممرر تاني, بهذا الشكل:

 Dim cmd As New OleDbCommand(sqlStatement, cn)

ثم نضع الممرارت للحقول التي لدينا في الجدول المعني, بهذا الشكل:

With cmd
				.Parameters.Add(New OleDbParameter("@FileName", _
		   OleDbType.WChar, 50)).Value = arrFilename(0)
				.Parameters.Add(New OleDbParameter("@Picture", _
			OleDbType.Binary)).Value = image
			End With

ثم ننفذ عملية الاضافة بهذا الشكل:

 cn.Open()
			cmd.ExecuteNonQuery()
			cn.Close()

و أما قراءة الصورة فتكون على طريقتين الاولى قراءة الصورة من الـ DataSet

بحكم أنه تم ملئ حقل الصور أثناء تحميل النموذج (فكرة سيئة)

الطريقة على 2003

أولاً نعرف متغير يأخذ مكان موقع الصف, من حيث الـ Position بهذا الشكل:

 Dim PictureIndex As Integer = _
			CType(Me.BindingContext(Ds2, "pictures").Position, Integer)

ثانياً : نعرف متغير مصفوفي Arrays من نوع byte لإسناد الصورة فيه بهذا الشكل:

 Dim arrPicture() As Byte = _
			 CType(Ds2.Tables(0).Rows(PictureIndex)("Picture"), _
			 Byte())

ثالثاً : نستنسخ عنصر من القالب MemoryStream , ونمرر المتغير من نوع byte عند بناءه , بهذا الشكل:

 Dim ms As New MemoryStream(arrPicture)

رابعاً نسند هذا العنصر لصندوق الصور Picture box بهذا الشكل:

  PicBox.Image = Image.FromStream(ms)

طريقة جديدة لكن عن طريق الـ 2005 وهي عملية ربط صندوق الصور بالعامود مباشرتاً بهذا الشكل:

 PicBox.DataBindings.Add( _
			New Binding("Image", PlayerProfilesBindingSource, "Picture", True))

حيثُ الكلمة true معنية باختصار الوقت و الجهد في قراءة وتحويل القيمة.

الطريقة الثانية سواءً على 2003 أو 2005 قراءة الصورة من قاعدة البيانات مباشرتاً ( فكرة رائدة )

اولاً نقوم بإنشاء متغير نصي يحتوي على جملة الاستعلام المشروطة برقم السجل بهذا الشكل:

 Dim strSQL As String = _
			"SELECT AuthorPicture FROM Authors WHERE AuthorID ='" & Me.txtAutorID.Text & "'"

ثم نعرف عنصر من نوع Command ونعرف متغير من نوع byte بهذا الشكل:

 Dim cmdImage As New SqlCommand(strSQL, CnnMain)

			Dim Imagebyte() As Byte

ثم نفتح عنصر الاتصال ونتحقق من القيمة العائدة من العنصر Command إن لم تكن Null نسندها في المتغير byte

وكذلك للإطمئنان نتحقق من المتغير byte بعد الاسناد فإن كانت بهِي قيمة ,

سنستنسخ عنصر من القالب MemoryStream ونمرر المتغير byte في بناءه,

ثم نستخدم السلوك write لنكتب قيم المتغير byte كلها في نفس العنصر stream

ثم نسند هذا العنصر stream لصندوق الصور عبر القالب Bitmap بهذا الشكل

 CnnMain.Open()
			If Not IsDBNull(cmdImage.ExecuteScalar) Then
 Imagebyte = cmdImage.ExecuteScalar()

 If (Not Imagebyte Is Nothing) Then
					Dim stream As New MemoryStream(Imagebyte, True)
					stream.Write(Imagebyte, 0, Imagebyte.Length)
					pboxAuthor.Image = New Bitmap(stream)
					stream.Close()
					strSQL = Nothing
			   End If
  End If

لتحميل المثال الاول إليك الرابط التالي

لتحميل المثال الثاني إليك الرابط التالي

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#3

الأخ الغملاسي

انا عملت نفس الكود تبعك وخصوصا

Dim stream As New MemoryStream(Imagebyte, True)
					stream.Write(Imagebyte, 0, Imagebyte.Length)
					pboxAuthor.Image = New Bitmap(stream)
					stream.Close()

ولكن المشكلة هيه انه في السطر قبل الاخير عندك

والذي عندي هو

Dim image1 As New Bitmap(St)

يطلع لي خطأ يقول

parameter not valid

وللتوضيح اكثر هذا هو الكود الذي استخدمته انا من قبل

Public Function byteArray2Image(ByVal b() As Byte) As Image
		Dim St As New IO.MemoryStream(b, True)
		If St.Length > 0 Then
			St.Write(b, 0, b.Length)
			Dim image1 As New Bitmap(St)
			byteArray2Image = CType(image1, Image)
		Else
			byteArray2Image = Nothing
		End If

	End Function

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#4

السلام عليكم

الكود صحيح 100 على 100 تحقق من رقم الخطأ أو مصدر الخطأ بالتحديد قد يكون العامود أو اسماء العناصر ,, المهم

ان الكود يعمل كما ينبغي.

	Public Function byteArray2Image(ByVal b() As Byte) As Image
		Dim St As New IO.MemoryStream(b, True)
		If St.Length > 0 Then
			St.Write(b, 0, b.Length)
			Dim image1 As New Bitmap(St)
			Return CType(image1, Image)
		Else
			Return Nothing
		End If

	End Function
	Protected Sub ReadImages()
		Try

			Dim PictureIndex As Integer = _
			CType(Me.BindingContext(Ds2, "pictures").Position, Integer)

			Dim arrPicture() As Byte = _
			 CType(Ds2.Tables(0).Rows(PictureIndex)("Picture"), _
			 Byte())

			With PicBox
				.Image = byteArray2Image(arrPicture)
				.SizeMode = PictureBoxSizeMode.StretchImage
				.BorderStyle = BorderStyle.Fixed3D
			End With

			lblFilePath.Text = _
			 Ds2.Tables(0).Rows(PictureIndex)("FileName").ToString
			Me.lblImageSize.Text = PictureSizeFromPictureBox(PicBox) & " KB "
		Catch ex As Exception
			MessageBox.Show(ex.Message)
		End Try
	End Sub

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#5

أخى العزيز

لدى نفس المشكلة ، ونفس الخطأ ، أرجو الإفادة حول هذه المشكلة

تحياتى

Flag_of_Palestine.gif
#6

هذا الجواب اخ مستر بوس

/index.ph...=123374&hl=

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

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

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

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

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

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

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