您的位置:首页 > 数据库 > Oracle

(转载)VB 查询Oracle中blob类型字段,并且把blob中的图片以流的方式显示在Image上

2014-07-26 13:49 567 查看
原文摘自:/article/4066574.html


'模块代码
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" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As Any, ppvObj As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As Any) 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 Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long

Public Type GUID ' 16 bytes (128 bits)
'dwData1 As Long ' 4 bytes
'wData2 As Integer ' 2 bytes
'wData3 As Integer ' 2 bytes
abData4(7) As Byte ' 8 bytes, zero based
End Type

Public Function PictureFromByteStream(B() As Byte) As IPicture
Dim hMem        As Long
Dim lpMem       As Long
Dim LowerBound  As Long
Dim ByteCount   As Long
Dim IID_IPicture As GUID
Dim istm        As stdole.IUnknown

LowerBound = LBound(B)
ByteCount = UBound(B) - LowerBound + 1

hMem = GlobalAlloc(&H2, ByteCount)

If hMem <> 0 Then

lpMem = GlobalLock(hMem)

If lpMem <> 0 Then

MoveMemory ByVal lpMem, B(LowerBound), ByteCount

GlobalUnlock hMem

If CreateStreamOnHGlobal(hMem, 1, istm) = 0 Then

If CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IID_IPicture) = 0 Then

OleLoadPicture ByVal ObjPtr(istm), ByteCount, 0, IID_IPicture, PictureFromByteStream

End If

End If

End If

End If

End Function


Public Sub Combo1_Click()

Dim adoCnn As ADODB.Connection
Dim rstOra As ADODB.Recordset
Dim intI   As Integer

Set adoCnn = New ADODB.Connection
Set rstOra = New ADODB.Recordset

adoCnn.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=dzjc;password=zlkj;Data Source=dzjc_2005;" '读blob字段要用Provider=OraOLEDB.Oracle

adoCnn.CursorLocation = adUseClient
adoCnn.Open

rstOra.CursorLocation = adUseClient

rstOra.ActiveConnection = adoCnn
rstOra.Open "SELECT zp FROM dzjc.dzjc_wfzp WHERE xh = '5'"

'Set Image1.DataSource = rstOra

Set Image1.Picture = PictureFromByteStream(rstOra.Fields("zp").Value)

End Sub
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: