السلام عليكم ورحمة الله وبركاته
الاخوان الاعزاء واجهتني مشكلة في كيف ادخل صورة من
picturebox
الى قاعدة بيانات اكسس
والعكس صحيح
وايضا التعديل عليها
ودمتم
السلام عليكم ورحمة الله وبركاته
الاخوان الاعزاء واجهتني مشكلة في كيف ادخل صورة من
picturebox
الى قاعدة بيانات اكسس
والعكس صحيح
وايضا التعديل عليها
ودمتم
تم تعديل هذه المشاركة بواسطة Romantic_touch في 11 ديسمبر 2006 في 18:23
<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>
السلام عليكم
لإضافة صورة من 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
لتحميل المثال الاول إليك الرابط التالي
لتحميل المثال الثاني إليك الرابط التالي
بالتوفيق إن شاء الله.
في المثال يتضح المقال
الأخ الغملاسي
انا عملت نفس الكود تبعك وخصوصا
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>
السلام عليكم
الكود صحيح 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بالتوفيق إن شاء الله.
في المثال يتضح المقال
هذا الجواب اخ مستر بوس
<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…