源码如下:Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim stm As ADODB.StreamPrivate Sub SavePictureToDB(cn As ADODB.Connection)On Error GoTo EH
    Set stm = New ADODB.Stream
    rs.Open "select sfz,photo from photo", cn, adOpenKeyset, adLockOptimistic
    
    With stm
         .Type = adTypeBinary
         .Open
         .LoadFromFile App.Path &"\4.jpg"
    End With
    With rs
         .AddNew
         .Fields("ImagePath") = Text1.Text
         .Fields("ImageValue") = stm.Read
         .Update
    End With
    rs.Close
    Set rs = Nothing
Exit Sub
EH: MsgBox Err.Description, vbInformation, "Error"
End Sub
在调试过程中 到步骤:
rs.Open "select sfz,photo from photo", cn, adOpenKeyset, adLockOptimistic
    
报错:     数据类型不被支持请大家帮忙,尽量说详细些,我搜索了很多贴子,都没有解决

解决方案 »

  1.   

    同学,你的数据库打开了吗,如果打开了,请试试把adOpenKeyset改为adOpenDynamic,如果不行,小可也只有学习了!
      

  2.   

    同意楼上的,自我认为这跟存图片没有太大关系,先看看SQL语句吧!
      

  3.   

    谢谢大家,这个代码,我在access中执行没问题了,但在oracle 中提示的是   数据类型不支持,我感觉是因为  字段photo 的类型是blob ,我在去掉select 中去掉了图像字段时,就不会报错了
      

  4.   

    blob: oracle不支持 .AddNew 先oracle 
    insert into part values (1,'ORACLE NETWORK',EMPTY_BLOB(),EMPTY_CLOB(),NULL);后用access
    select ...
    .edit我没有试过不知道可不可以阿
    不幸得话
    就换个方法
    Public Sub oWriteToDB(ByRef Fd As OraField, ByVal FileName As String)
        Dim PartDesc As OraClob
        Dim buffer As String
        Dim chunksize As Long
        Dim amount_written As Long
        
        Set PartDesc = Fd.Value
        chunksize = 1000
        buffer = String$(chunksize, 32)
        Open FileName For Binary As #1
        PartDesc.offset = 1
        PartDesc.PollingAmount = LOF(1)
        remainder = LOF(1)
        Get #1, , buffer
        amount_written = PartDesc.Write(buffer, chunksize, ORALOB_FIRST_PIECE)
        While PartDesc.Status = ORALOB_NEED_DATA
            remainder = remainder - chunksize
            If remainder < chunksize Then
                piecetype = ORALOB_LAST_PIECE
                chunksize = remainder
                buffer = String$(chunksize, 32)
            Else
                piecetype = ORALOB_NEXT_PIECE
            End If
            Get #1, , buffer
            amount_written = PartDesc.Write(buffer, chunksize, piecetype)
        Wend
        Close #1
    End Sub
      

  5.   

    请说哪位清楚些好吗,刚刚搞vb,就要做一个急单,这里没有人用vb读写过oracle 的图像字段吗,还是不屑于回答
      

  6.   

    我试过了,你说的情况极有可能是因为游标方式设置及连接方式设置引起的,应把Connection对象及Recrodset对象的游标方式设置为客户端方式:im adoCnn As ADODB.Connection
        Dim rstOra As ADODB.Recordset
        Dim intI   As Integer
        
        On Error GoTo ErrorHandler
        
        Set adoCnn = New ADODB.Connection
        Set rstOra = New ADODB.Recordset
        
        adoCnn.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=test;password=test;Data Source=oraDATA;Persist Security Info=False"
        adoCnn.CursorLocation = adUseClient
        adoCnn.Open
        
        rstOra.CursorLocation = adUseClient    rstOra.ActiveConnection = adoCnn
        rstOra.Open "select picture from Testrecord"注意:Provider=OraOLEDB.Oracle 处及rstOra.CursorLocation = adUseClient处不能用传统的连接方式:Provider=MSDAORA.1
      

  7.   

    另外针对大容量数据读写的情况,建议用AppendChunk及GetChunk的方法来取得数据,如:adoRec("Picture").AppendChunk CVar(strXML)'绑定'读出
    Dim actualSize  As Long
        Dim offSize     As Long
        Dim varReport   As Variant
        Dim varChunk    As VariantactualSize = adoRec("Picture").actualSize
    offSize = 0
        Do While offSize < actualSize
            varChunk = adoRec("Picture").GetChunk(ChunkSize)
            varReport = varReport & varChunk
            offSize = offSize + ChunkSize
            DoEvents
        Loop
      

  8.   

    to lilaclone(阿九--云破月来花弄影); 谢谢按照你说的办法,数据读取已经成功,但是接下来,当运行到生成临时图片文件时,保错:无效图片,   图片aa.bmp打不开,请大虾指教Private Sub Command9_Click()
        Dim adoCnn As ADODB.Connection
        Dim rstOra As ADODB.Recordset
        Dim intI   As Integer
        
        On Error GoTo ErrorHandler
        
        Set adoCnn = New ADODB.Connection
        Set rstOra = New ADODB.Recordset
        
        adoCnn.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=system;password=manager;Data Source=sbzw;Persist Security Info=False"
        adoCnn.CursorLocation = adUseClient
        adoCnn.Open
        
        rstOra.CursorLocation = adUseClient    rstOra.ActiveConnection = adoCnn
        rstOra.Open "select sfz,photo from photo1 where sfz = " + Chr(39) + Text1.Text + Chr(39)
       
        If rstOra.RecordCount > 0 Then
            If Not IsNull(rstOra.Fields("photo")) Then
                   bteContent = rstOra.Fields("photo").GetChunk(rstOra.Fields("photo").ActualSize)               Open "C:\aa.bmp" For Binary Access Write As #1
                   Put #1, , bteContent
                   Close #1
                   ImgPhoto.Picture = LoadPicture("C:\aa.bmp")
                   
            Else
                ImgPhoto.Picture = LoadPicture("")
            End If
        Else
            ImgPhoto.Picture = LoadPicture("")
        End If
    If rstOra.State = adStateClosed Then Set rstOra = NothingExit Sub
    ErrorHandler: MsgBox Err.Description, vbInformation, "Error"End Sub
      

  9.   

    Provider=msdaora;Data Source=MyOracleDB;User Id=UserName;Password=asdasd;"
      

  10.   

    请大家说说,以下两种连接字符串的异同,为什么第一种方法会报错?我怀疑是在win98下驱动不存在?第一种:这种连接方法在win2000中可以连接,可以往数据库中存取图片和文件,但在win98下,报错
    Public Sub InitADODB()
        Set cn = New ADODB.Connection
        cn.CursorLocation = adUseClient
        cn.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=system;password=manager;Data Source=sbzw;Persist Security Info=False"
        cn.Open
    End Sub第二种:这种连接方法在win2000中可以连接,但不能往数据库中存取图片和文件,在win98下,也报错Public Sub InitADODB()
        Set cn = New ADODB.Connection
        cn.CursorLocation = adUseClient
        cn.ConnectionString = "Provider=msdaora;Data Source=sbzw;User Id=system;Password=manager;"
        cn.Open
    End Sub