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

استرجاع صورة من قاعده البيانات عن طريق SqlDataReader

بدأه محمد فؤاد تركي في 29 يناير 2013 · 10 رد · 4,570 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السادة الزملاء

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

 

أحاول استرجاع صورة من قاعده البيانات باستخدام DataReader حيث GetDate هي DataReader وعندما لايوجد صورة يعطيني الخطأ الموضع أدناه

فحاولت معالجة المشكلة باستخدام DBNULL لكنها لا تعمل عند استرجاع قيمة الصورة فارغة ولكن نفس الرسالة اما اذا كان الحقل يحتوي علي صورة

فتسترجع البيانات بشكل سليم

 

post-46243-0-18967500-1359461451_thumb.j

 

 

 

If GetData Is System.DBNull.Value Then

                    PicLayout.Image = Nothing

                Else

                    Dim data As Byte() = DirectCast(GetData("TransPicLayout"), Byte())
                    Dim data2 As Byte() = DirectCast(GetData("TransPic1"), Byte())


                    Dim ms As New MemoryStream(data)
                    Dim ms2 As New MemoryStream(data2)
                    PicLayout.Image = Image.FromStream(ms)
                    Pic1.Image = Image.FromStream(ms2)


                End If

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#2

باعتقادي ان كلمة is هي لمقارنة النوع وليس القيمه بينما = تستخدم للمقارنه في فيجوال بيسك

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

السلام عليكم ...

  1. هناك فرق بين ان يكون الـــ DataReader  بحد ذاته  له القيمة Null  و بين أن تكون إحدى القيم في البيانات الداخلية هي Null  أو DbNull  ...
  2. على فرض أن الـــ DataReader  قيمته ليست Null  يكون الكود :
     Dim TransPicLayout = GetData("TransPicLayout")
            Dim TransPic1 = GetData("TransPic1")
    
            If Not TransPicLayout Is System.DBNull.Value Then
                Dim data As Byte() = DirectCast(TransPicLayout, Byte())
                Dim ms As New MemoryStream(data)
                PicLayout.Image = Image.FromStream(ms)
            End If
    
            If Not TransPic1 Is System.DBNull.Value Then
                Dim data2 As Byte() = DirectCast(TransPic1, Byte())
                Dim ms2 As New MemoryStream(data2)
                Pic1.Image = Image.FromStream(ms2)
            End If

     

2

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#4

السلام عليكم جميعا

الخطاء هنا هو نوع البيانات مختلف عند الحفظ و عند الاسترجاع لقد مررت بهذه الحالة

 

الخطاء يكمن في ان قاعدة البيانات تحفظ الصورة من نوع بايت Byte  وعند الاسترجاع يجن ان يتم تحويلها الى نوع اخر وهو نوع الصورة مثل JPEG

و وضعها في مربع الصور ليتم عرضها

 

انا حللت المشكلة وذلك بوضع حقل داخل قاعدة البيانات واعطيته اسم path  لتخزين مسار الصورة فيه وعند الاستدعاء يتم وضع مسار الصورة في مربع عرض الصورة وهذه الطريقة افضل بكثيير من التعامل مع الملفات داخل قاعدة البيانات وهذه صور لبرنامج استخدمت معه هذه الطريقة : 

 

قبل البحث 

post-174818-0-03654400-1359469880_thumb.

 

وبعد البحث

post-174818-0-81020000-1359469890_thumb.

 

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

 

بالتوفيق

تم تعديل هذه المشاركة بواسطة عبدالرحمن المرشود في 29 يناير 2013 في 17:34

بسم الله الذي لا يضر مع اسمه شيء بالارض ولا بالسماء وهو السميع العليم

#5

بارك الله فيك أخي الفاضل حسام علي التوضيح هذا ما اكتشفته فعلا

 

اضافة بسيطة علي الكود و هي اذا كانت الصورة موجوده و تم استدعاء الـــ Record الذي يلية والذي يحوي بيانات NULL نستخدم Else

 

بارك الله فيك مرة أخري

 

لكن عندي سؤال آخر يا استاذنا الفاضل اذا تكرمت وهو أريد أن اضغط Double كليك علي الصورة المعروضة داخل PictureBox ليتم عرضها في Windows photo viewer الخاص بالويندوز الافتراضي

 

شكرا لك

 

 

 Else : PicLayout.Image = Nothing

 

 

Else : Pic1.Image = Nothing

 

 

 

Dim TransPicLayout = GetData("TransPicLayout")
                Dim TransPic1 = GetData("TransPic1")


                If Not TransPicLayout Is System.DBNull.Value Then
                    Dim data As Byte() = DirectCast(TransPicLayout, Byte())
                    Dim ms As New MemoryStream(data)
                    PicLayout.Image = Image.FromStream(ms)


                Else : PicLayout.Image = Nothing


                End If


                If Not TransPic1 Is System.DBNull.Value Then
                    Dim data2 As Byte() = DirectCast(TransPic1, Byte())
                    Dim ms2 As New MemoryStream(data2)
                    Pic1.Image = Image.FromStream(ms2)


                Else : Pic1.Image = Nothing


                End If

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 29 يناير 2013 في 17:45

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#6

السلام عليكم ..

بارك الله بك أخي محمد ... و التعديل الذي ذكرته موفق 100 % .

بالنسبة لفتح الصورة .. فهذا هو الكود ... على فرض ان الصورة من نوع jpg  . و على فرض أن Windows photo viewer هو التطبيق الافتراضي لفتح الصور عند الضغط على الصورة .

 Private Sub PictureBox1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.DoubleClick
        If PictureBox1.Image Is Nothing Then Exit Sub
        Dim filePath = Application.StartupPath + "\a.jpg"
        If File.Exists(filePath) Then File.Delete(filePath)
        PictureBox1.Image.Save(filePath)
        Process.Start(filePath)

    End Sub

 

الاخ عبدالرحمن المرشود .. شكرا على الملاحظات التي ذكرتها .. و أنا شخصيا لا أفضل تخزين الصور في قاعدة البيانات ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

بارك الله فيك يا أخي الفاضل حسام كفيت ووفيت

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#8
محمد فؤاد تركي كتب:

بارك الله فيك يا أخي الفاضل حسام كفيت ووفيت

بارك الله بك ....  بالتوفيق ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#9

الاخ حسام لا شكر على واجب

 

وهناك عدة طرق للتعامل مع الصور في قواعد البيانات 

 

وانا مثلك لا افضل تخزينها في قاعدة البيانات لانها تاخذ مساحة كبيرة وتاخر سير البرنامج

واشكرك على الشرح الرائع

 

 

بالتوفيق

بسم الله الذي لا يضر مع اسمه شيء بالارض ولا بالسماء وهو السميع العليم

#10

اذا كنت تستخدم قاعدة بيانات SQLServer فالافضل هو تخزين الصورة بقاعدة البيانات مباشرة واستدعائها من قاعدة البيانات

 

اشارككم الكود وان كنت اعلم يقينا بأن ماقدمتم هو الافضل

 

 

 

Dim getPicAd As New SqlDataAdapter("Select [Book_Picture] from tblBooks Where Book_ID=" & CInt(RowID) & "", CN)


        Dim getPicTab As New DataTable
        'Get the Picture for the Current Record Only
        getPicTab.Clear()
        getPicAd.Fill(getPicTab)


        'if there is a picture then 
        If getPicTab.Rows(0).Item("Book_Picture").ToString <> "" Then


            Dim newMstream As New System.IO.MemoryStream(CType(getPicTab.Rows(0).Item("Book_Picture"), Byte()))


            'Create a new image from the bytes from the memory
            'Dim ImageFromDB As New Bitmap(newMstream)
            Dim img As Image = Image.FromStream(newMstream)
            PictureBox1.Image = img
            img = Nothing
            newMstream = Nothing
        Else
'Show Default Image
            PictureBox1.Image = My.Resources.BookNotAvailable


        End If

 

واقوم باستدعاء الصورة وقت عرض الريكورد فقط لتلافي البطء في تنفيذ جملة الاستعلام عند استدعاء الجدول . 

 

تحياتي 

تم تعديل هذه المشاركة بواسطة omani في 2 فبراير 2013 في 12:29

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#11

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

هذا امر الاستدعاء

 SELECT sName, CAST (dbo.udfReadImage('e:\photo\' + CAST (GovCode AS nvarchar) + '\'+ nCode+'.jpg' ) AS image) as iImage
FROM dbo.Admin

SqlServerProject1.rar

تم تعديل هذه المشاركة بواسطة KARIMSOFT في 2 فبراير 2013 في 14:21

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

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

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

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

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