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

حفظ صورة داخل قاعدة بيانات SqlServer بإستخدام VB.Net2005

مغلق
بدأه mqmmss في 19 مايو 2006 · 11 رد · 8,075 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخواني الأعزاء السلام عليكم ورحمة الله وبركاتة

في الحقيقة بحثت في المنتدى عن هذا الموضوع ولكن كل ما وجدته هو كيفبه حفظ صورة في قاعدة Access وبإستخدام VB.Net2003 عن طريق DataSet :(

ولقد حاولت أن أغير في الشفرة لأحصل على ما أريد ولكنني لم أتمكن من القيام بذلك ولكن بلا جدوى :(

كما أشكر أخي غملاسي على المعلومات الأكثر من رائعة والتي أنا متأكد بأنني أعجز عن شكرك ولكن يمكن أن أقول لك بارك الله فيك وكثر الله من أمثالك , كما أشكر جميع الأعضاء

إخواني الكرام أريد برنامج ( يحفظ الصورة وليس المسار ) يقوم بما يلى :-

1- إستخدام الأداة OpenFileDialog ليتم من خلالها تحديد مسار الصورة .

2- يتم حفظ الصورة في قاعدة بيانات SqlServer .

- في SqlServer ماهو نوع الحقل المستخدم هل أجعلة VarBinary أو Image .

ملاحظة / قاعدة البيانات SqlServer و اللغة VB.Net2005

إخواني أتمنا أن أحصل على مساعدتكم

ومشكوريييييييين سلفاً.

تم تعديل هذه المشاركة بواسطة mqmmss في 19 مايو 2006 في 21:31

#2

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

قاعدة البيانات لا تقبل الصور الا على هيئة مصفوفة من النوع byte و نعتبر ان الجدول الذى نريد ادخال صورة فيه يتكون من عمودين هما (اسم الصورة و الصورة)

و العمود الاول من النوع nvarchar(255) , و العمود الثانى من النوع Image و الى نقوم بتخزين الصورة فيه

و اليك الكود المناسب لادخال الصورة داخل قاعدة البيانات

و لنفرض ان الجدول المراد ادخال الصورة فيه اسمه picturetable و العمود الاول اسمه picfilename و الععمود الثانى اسمه pictiure

 Dim con As New SqlConnection("Database= Mydata;integrated security=true")
		Dim fname As String
		If Filedlg.ShowDialog = DialogResult.OK Then
			picbox1.Image = Image.FromFile(fileDlg.FileName)
			Dim m() As String = Split(Filedlg.FileName, "\")
			Array.Reverse(m)
			Fname = m(0)
		Else
			Exit Sub
		End If
		Dim arrfilename() As String = Split(fname, "\")
		Array.Reverse(arrfilename)
		Dim ms1 As New MemoryStream()
		picbox1.Image.Save(ms1, picbox1.Image.RawFormat)
		Dim arrimg() As Byte = ms1.GetBuffer
		ms1.Close()
		Dim strSQL As String = _
							 "insert into Picturetable (picfilename,picture)" & _
							 "values(@picname,@pic)"
		Dim cmdSQL As New SqlCommand(strSQL, con)
		With cmdSQL
			.Parameters.Add(New SqlParameter("@p1name", SqlDbType.NVarChar, 255)).Value = fname
			.Parameters.Add(New SqlParameter("@p1", SqlDbType.Image)).Value = arrimg
		End With
		Try
			con.Open()
			cmdSQL.ExecuteNonQuery()
			con.Close()
			MsgBox("The new item added in table ")
		Catch ex As SqlException
			MsgBox(ex.Message)
		Finally
			con.Close()
		End Try

لاحظ اضافة الكود التاى فى اول الفورم

imports system.data
imports system.data.sqlclient
imports system.IO

لا تنسونا بصالح الدعاء

تم تعديل هذه المشاركة بواسطة m_3ryan في 19 مايو 2006 في 23:16

#3

السلان عليكم

شكرا على هذه المعلومات القيمة أخي الكريم

وبارك الله فيك

#4

السلام عليكم

بما أن الطلب يختص بـ 2005 فالامر غاية في السهولة ولا يحتاج للكود المعروض من اخينا m_3ryan

كل الذي عليك ان تقوم به هو ان تربط صندوق الصور PictureBox بالعامود Column من نوع صور Image في الجدول

بهذا الشكل

'Clear picture box binding if any
			PicBox.DataBindings.Clear()

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

وهذا ليس بالاهمية بكثر ما هو تحديد حجم الصورة قبل حفظها في قاعدة البيانات لذلك يمكنك التحقق من ذلك بهذا الشكل....

 With OFD

	'Your custom Title
					.Title = "صندوق الصور"

	'Last time recent folder had opened.
					.RestoreDirectory = True

					.Filter = "Image Files(*.JPG)|*.JPG"

	'IF the picture Picked Up Then
					If .ShowDialog = Windows.Forms.DialogResult.OK Then

	'Check the Image size 
	Dim FInfo As New FileInfo(.FileName)
	Dim FileSize As Integer = (FInfo.Length \ 1024)
						If FileSize > 20 Then 'if bigger than 20 KB Refuse it
							MsgBox("حجم الصورة الحالي هو " & FileSize & " كيلوبايت " & " قم بتقليل الصورة. الحد الأقصى هو 20 كيلوبايت فقط !")

							Return 'Exit Sub
						End If


					End If
				End With

الـ OFD هو اختصار لاسم العنصر OpenFileDialog بالتوفيق إن شاء الله.

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

#5

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

إخواني الأكارم شكراً جزيلاً على تعاون الجميع وأخص

أخي m_3ryan و مشرفنا الغالي والذي نفتخر به دائماً أخي الغملاسي

صراحة إخواني الأعزاء إن برنامجي لا يحتاج إلى لصورتين فقط ( صورة خلفية للنظام و صورة أخرى شعار للتقارير(أتمنا قراءة سؤالي الموجود في أخر هذا الرد )) ولذلك فأنا لا أحتاج إلا لحقل واحد فقط لذا إستخدمت عملية Update بدلاً من Insert.

ولذلك قمت بالإستفادة من كل من شفرة أخي m_3ryan بعد تحويلها من VB.Net2003 إلى VB.Net2005 وكذلك إلى شفرة أخي الغملاسي ( من مشاركاتة السابق )

وهنا أعرض لكم الشفرة التي تقوم بحفظ الصورة في قاعدة البيانات وإسترجاعها من قاعدة البيانات من خلال أداة PictureBox

كما هو موضح أدنى :

على إفتراض أن Hotel هو إسم قاعدة البيانات و Picturetable هو إسم الجدول و picture هو الحقل الذي سيتم حفظ وجلب الصورة منه .

	Friend con As New SqlClient.SqlConnection("Database= Hotel;integrated security=true")

'عرض الصورة في أداة PictureBox بعد جلبها من قاعدة البيانات

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Try
			picbox2.Image = Nothing
			Dim str As String = "SELECT picture FROM Picturetable"
			Dim cmdImage As New SqlClient.SqlCommand(str, con)
			Dim b() As Byte
			con.Open()
			If Not IsDBNull(cmdImage.ExecuteScalar) Then
				b = cmdImage.ExecuteScalar()
				If (Not b Is Nothing) Then
					Dim stream As New IO.MemoryStream(b, True)
					stream.Write(b, 0, b.Length)
					picbox2.Image = New Bitmap(stream)
					stream.Close()
				End If
			End If
		Catch ex As Exception
			Throw ex
		Finally
			con.Close()
		End Try

	End Sub

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

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

		Dim fname As String
		If Filedlg.ShowDialog = Windows.Forms.DialogResult.OK Then
			picbox1.Image = Image.FromFile(Filedlg.FileName)
			Dim m() As String = Split(Filedlg.FileName, "\")
			Array.Reverse(m)
			fname = m(0)
		Else
			Exit Sub
		End If
		Dim arrfilename() As String = Split(fname, "\")
		Array.Reverse(arrfilename)
		Dim ms1 As New IO.MemoryStream()
		picbox1.Image.Save(ms1, picbox1.Image.RawFormat)
		Dim arrimg() As Byte = ms1.GetBuffer
		ms1.Close()
		Dim strSQL As String = "Update Picturetable Set picture=" & "@pic"
		Dim cmdSQL As New SqlClient.SqlCommand(strSQL, con)
		With cmdSQL
			.Parameters.Add(New SqlClient.SqlParameter("@pic", SqlDbType.Image)).Value = arrimg
		End With
		Try
			con.Open()
			cmdSQL.ExecuteNonQuery()
			con.Close()
			MsgBox("The new item added in table ")
		Catch ex As SqlClient.SqlException
			MsgBox(ex.Message)
		Finally
			con.Close()
		End Try

	End Sub

عفواً إخواني الأعزاء لطرحي هذا السؤال هنا ولكنني أنظر إلى مدى إرتباط سؤالي بهذا الموضوع لذلك أتمنا أن يتم الرد علي هنا أو إعطائي رابط في قسم التقارير ( إن تكرمتم )

سؤالي هو أنني أريد عرض الصورة التي يتم جلبها من قاعدة البيانات ( كما أوضحت سابقاً ) في أداة Picture ولكن الموجودة داخل التقرير .

لا تنسو دعواتكم وجزاكم الله خير .

تم تعديل هذه المشاركة بواسطة mqmmss في 21 مايو 2006 في 18:05

#6

السلام عليكم

كما أخبرتك أخي من قبل , انه لا يحتاج إلى هذا التعقيد, فقط أربط الصورة بالحقل وتنتهي المشكلة

اما في التقرير فهنالك حلول كثيرة , ابسطها هو ان تقوم بإدراج الحقل من الـ Field Explorer في اي مكان في

التقرير لا اكثر , ويمكن عملية التصفية اي اختيار الصورة عن غيرها برقم الـ ID عبر ممرر التقرير Report Parameters بالتوفيق إن شاء الله.

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

#8

السلام عليكم

اقتباس
بما أن الطلب يختص بـ 2005 فالامر غاية في السهولة ولا يحتاج للكود المعروض من اخينا m_3ryan

كل الذي عليك ان تقوم به هو ان تربط صندوق الصور PictureBox بالعامود Column من نوع صور Image في الجدول

أخي الغملاسي أنا أريد تحديد الصورة من خلال الأداة OpenFileDialog ومن ثم عرضها على الأداة PictureBox وبعد ذلك حفظ الصورة في القاعدة

وفي إعتقادي ( إن صح قولي وإن أخطأت إخبرني ) بأن طريقتك تستخدم لعرض الصورة على الأداة PictureBox فقط , هل كلامي صحيح ؟؟

هل إتضحت الفكرة *-)

أخخخخخخ عفواً أخي الغملاسي لقد نسيت أن أخبرك بأن فكرتك حول عرض الصورة في التقرير صحيح أنها صحيحة ولكنني أريد القيام بذلك عن طريق الشفرة لأن قبل فتح التقرير فإنني أقوم بعمل إستعلام لقاعدة البيانات لجلب البيانات الأساسية للتقرير من خلال SqlDataAdapter ومن ثم عرض البيانات الأساسة داخل التقرير كما في الشفرة التالية( التي أعطاني إياها أخي SOLOمن قبل ) :-

CType(rpt.ReportHeaderSection1.ReportObjects("Text1"), CrystalDecisions.CrystalReports.Engine.TextObject).Text = "my text"

ولكن في حالة عرض الصورة كيف يمكنني القيام بذلك ؟؟

أحتاج الكوووووووووود.

ومشكووووورين

تم تعديل هذه المشاركة بواسطة mqmmss في 21 مايو 2006 في 22:08

#9

اخى العزيز الكود الخاص بعرض الصورة فى picture box هو

بفرض ان اسم الجدول pictures و المطلوب عرض الصورة فى السطر الاول و ان العمود الخاص بالصور هو picture

بفرض ان اسم ال picturebox فى الفورم هو picturebox2

ds هو اسم ال dataset

			
Dim arrPicture() As Byte = CType(dsPictures.Tables("pictures").Rows(0)("Picture"),Byte())
Dim ms As New MemoryStream(arrPicture)
With PictureBox2
	 .Image = Image.FromStream(ms)
	 .SizeMode = PictureBoxSizeMode.CenterImage
	 .BorderStyle = BorderStyle.Fixed3D
End With
ms.Close()

و لكن يجب وضع الكود

imports system.io

فى اول الفورم

اتمنى ان يكون هذا هو ما تريد

تم تعديل هذه المشاركة بواسطة m_3ryan في 21 مايو 2006 في 22:40

#10

الى الامام دائما اخى الحبيب

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

#11

عذراً إخواني على التأخير..

شكراً جزيلاً لكم إخواني على تعاونكم وإلى الأمام وبارك الله في الجميع

#12
اقتباس
أخي الغملاسي أنا أريد تحديد الصورة من خلال الأداة OpenFileDialog ومن ثم عرضها على الأداة PictureBox وبعد ذلك حفظ الصورة في القاعدة

وفي إعتقادي ( إن صح قولي وإن أخطأت إخبرني ) بأن طريقتك تستخدم لعرض الصورة على الأداة PictureBox فقط , هل كلامي صحيح ؟؟

لا أخي غير صحيح , الصحيح هو بعد عملية ربط الـ picture box بالحقل سيكون كأي حقل أخر مربوط مع الـ DataSet لذلك عند عملية الحفظ

SaveItem سيتم حفظ الصورة في قاعدة البيانات ...

اقتباس
ولكن في حالة عرض الصورة كيف يمكنني القيام بذلك ؟؟

عزيزي عند عرض الصورة ستتغير وفقاً للقيمة الممررة إليك هذا المثال.

'Declare Report Object
	Dim rptObjects As ReportDocument
  With rptObjects

				.SetParameterValue("@CriteriaID", cboxLoadData.SelectedValue)

				.SetParameterValue("@All", cboxLoadData.SelectedValue)

				.SetParameterValue("@SDate", dtpSDate.Value.ToShortDateString)

				.SetParameterValue("@EDate", dtpEDate.Value.ToShortDateString)
 End With

 'Assign report source
			CRV.ReportSource = rptObjects
			CRV.Refresh()

هذا الكود يقوم بتمرير أربع ممررات للتقرير , كلما تغيرت القيمة تغيرت الصورة وفقاً لمكانها في العامود , لا أكثر

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

تم تعديل هذه المشاركة بواسطة الغملاسي في 25 مايو 2006 في 03:29

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

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

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