بازیابی عکس از دیتا بیس در vb6

amirxbest

Member
سلام دوستان عزیز مخصوصا the king جان:
من تو برنامم با ado عکسم رو تو بانک ذخیره میکنم ولی برای بازیابی اونا مشکل دارم میشه راهنمایی کنید.
اگه ممکنه یه نمونه کد بذارید.
ممنون:rose:
 

the_king

مدیرکل انجمن
سلام دوستان عزیز مخصوصا the king جان:
من تو برنامم با ado عکسم رو تو بانک ذخیره میکنم ولی برای بازیابی اونا مشکل دارم میشه راهنمایی کنید.
اگه ممکنه یه نمونه کد بذارید.
ممنون:rose:

وقتی تصویر رو در بانک اطلاعاتی ذخیره می کنید، داده های داخل فایل تصویر بصورت آرایه ای از بایت ها ذخیره میشه :
کد:
    Dim picStream As New Stream
    picStream.Type = adTypeBinary
    picStream.Open
    picStream.LoadFromFile [B][COLOR="Blue"]filename[/COLOR][/B]
    table.AddNew
    table.Fields("FieldName").Value = picStream.Read
    table.Update
    picStream.Close

موقعی که می خواهید این تصویر را از بانک اطلاعاتی بخوانید باید اون بایت ها را به تصویر تبدیل کنید.
می توانید موقتا یک فایل جدید بسازید، بایت ها را داخل بنویسید، فایل را ببندید، تصویر را از طریق این فایل جدید
بخوانید و بعد فایل را حذف کنید، اما اینکار هم کند خواهد بود و هم دردسر ساز. بهتر است که بدون استفاده از
یک فایل مستقیما بایت ها را در حافظه RAM به تصویر StdPicture تبدیل کنید.

برای تبدیل آرایه ای از بایت ها به تصویر StdPicture باید از توابع API ویندوز کمک بگیرید که کد پیچیده ای داره
اما سرعت اجرای بالایی دارد و نیازی به فایل هم نیست. کد های زیر تابع ()BinaryDataToStdPicture را
می سازد که یک آرایه از بایت ها را به یک StdPicture تبدیل می کند :
کد:
Option Explicit

Private Const SIPICTURE As String = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
Private Const GMEM_MOVEABLE As Long = &H2
Private Const GMEM_ZEROINIT As Long = &H40
Private Const NOERROR As Long = 0
Private Const S_OK As Long = 0

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef pclsid As GUID) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, pPStm As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32.dll" (ByVal lpStream As Long, ByVal lSize As Long, ByVal fRunMode As Long, ByRef riid As GUID, ByRef lplpObj As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal length As Long)

Public Function BinaryDataToStdPicture(ByRef binaryData() As Byte) As StdPicture
    Dim hMem As Long
    Dim memPtr As Long
    Dim stm As IUnknown
    Dim stdPicture_GUID As GUID
    Dim length As Long
    Dim pic As IPicture
    length = UBound(binaryData) + 1
    hMem = GlobalAlloc((GMEM_MOVEABLE Or GMEM_ZEROINIT), length)
    If hMem = 0 Then Exit Function
    memPtr = GlobalLock(hMem)
    If memPtr <> 0 Then
        CopyMemory ByVal memPtr, binaryData(0), length
        If GlobalUnlock(hMem) = S_OK Then
            If CreateStreamOnHGlobal(hMem, False, stm) = S_OK Then
                If CLSIDFromString(StrPtr(SIPICTURE), stdPicture_GUID) = NOERROR Then
                    If OleLoadPicture(ByVal ObjPtr(stm), 0&, 0&, stdPicture_GUID, pic) = S_OK Then
                        Set BinaryDataToStdPicture = pic
                    End If
                End If
            End If
        End If
    End If
    GlobalFree hMem
End Function

و از تابع ()BinaryDataToStdPicture که در کد بالا ساخته ایم استفاده کنید :
کد:
    Dim pic As StdPicture
    table.MoveFirst
    Set pic = BinaryDataToStdPicture(table.Fields("PictureData").Value)
    Set Picture1.Picture = pic

یک مثال کامل ضمیمه این پست شده است : Save Picture.zip
 

پیوست ها

  • Save Picture.zip
    65.4 کیلوبایت · بازدیدها: 21

جدیدترین ارسال ها

بالا