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

原文摘自:http://heisetoufa.iteye.com/blog/504068
‘模块代码
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

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

时间: 2024-12-10 22:29:10

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

SQL Server中TEXT类型字段值在数据库中追加字符串方法

在数据上我们往往会遇到ntext大文本类型,这种类型如果和 nvarchar类型相加会出现问题,所以有一中方法可以解决这种问题. 使用的sql   函数: TEXTPTR:返回要更新的 text.ntext 或 image 数据的文本指针的值. UPDATETEXT :在适当的位置更改 text.ntext 或 image 列的一部分 WRITETEXT: 来更新和替换整个 text.ntext 或 image 字段 举例: CREATE TABLE [dbo].[aa]( [ID] [int]

mybatis oracle BLOB类型字段保存与读取

一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用来存储大量二进制数据的:CLOB用来存储大量文本数据.BLOB通常用来保存图片.文件等二进制类型的数据. 二.使用mybatis操作blob 1.表结构如下: create table BLOB_FIELD ( ID VARCHAR2(64 BYTE) not null, TAB_NAME VARC

解决Entity Framework中DateTime类型字段异常

今天把一个使用了Entity Framework的程序从MySql迁移到SqlServer时,发现运行时报了一个异常: System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值. 在网上查找了一下,具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServer的datetime有效范围是1753年1月1日到9999年12月31日,如果超出这个范

C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法

原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 本人新手,在.Net中写WebAPI的时候,当接口返回的json数据含有日期时间类型的字段时,总是在日期和时间中夹着一个字母T:微软这么设置可能有其内在的初衷,但是对于我来说,这样的格式不是很方便,前端同学展示出来的时候也总是要记得处理一下显示格式.曾经问过部门内一位老鸟,老鸟的反应告诉我这在微软的框架下做json转换是不可避免的:当初一度放弃了这个问题.后来突然冷静分析了一下,微软不可能做

SQL Server 中BIT类型字段增删查改那点事

话说BIT类型字段之前,先看“诡异”的一幕,执行Update成功,但是查询出来的结果依然是1,而不是Update的2 当别人问起我来的时候,本人当时也是处于懵逼状态的,后面联想具体的业务突然想起来这个字段是bit类型的 如果把这个现象跟BIT类型字段连续起来就不觉得奇怪了. 废话不多,直接上代码看结果就好了. 先建一个测试表 CREATE TABLE TestBIT ( Id INT IDENTITY(1,1), BitColumn BIT ) 按照常规来说,bit类型字段只能存0或者1,所以直

hibernate查询数据表char类型字段只返回一个字符

在oracle或sqlServer下会遇到,查询数据表字段类型为char,如果使用Hibernate原生SQL去执行查询,往往只会返回 一个字符.原因是char在java中只有两个字节. 解决方法 1.改成 select cast(列 as varchar2(列大小)) from 表;或者改为 select trim(列) from 表 2.指定列返回的类型. SQLQuery query = session.createSQLQuery(); query.addScalar(columnAli

mysql 中int类型字段unsigned和signed的探索

转自:http://www.0791quanquan.com/news_keji/topic_816453/ 探索一:正负数问题 拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127. 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的. 因为只支持正数会让存储空间大一倍呢(当然我这种表达可能不准确). 假设我们使用tinyint来存储一些状态值. 0表示删除,1表示待付款,2表示已付款,3....

从sql中image类型字段中导出图片

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data.SqlClient; using System.Data; using System.Drawing.Imaging; using System.Drawing; namespace 获取名字 { class Program { static void Ma

DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法

1 string strSql = 2 "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSGDW,GCDD,GCX,GCY,GCBG,GCQSLC,GCJSLC,GCZXDH,GCZXLC,GCZXLX,GCZXSM,GCYX,GCZBZ,GCBLC,GCBZ,PZFA,BZ,GCSJ,DTABLE,ZGSW,DZJL,DZLD,JCMS,JQBS,FGCH,TLX,CDLB,YHZS,GC