blob要用到oracle的包dbms_lob才能存取啊!

解决方案 »

  1.   

    (二)在vb中的处理
    在vb中处理大对象,一般可以用OO4O(oracle objects for ole)来处理大对象。这里介绍一种不用0040处理大对象blob的方法。
    下面这段程序可以将一个文件(文本文件,doc文件,图象文件等)保存到数据库中,并可以将其从数据库读出 
    需要两个commandbutton 
    cmd1 名称 cmdsave caption 保存 
    cmd2 名称 cmdread caption 读取 
    一个cmddialog控件 
    同时需要创建一张表t_demo(字段id 类型 number,;字段text 类型 blob;)
    exmple 3.
    Option Explicit
    Dim rn As ADODB.Connection
    Public Function CreateDataSource(DataSource As String, UserID As String, Password As String) As Boolean
    On Error GoTo DbConErr:
    Set rn = New ADODB.Connection
    With rn
    .ConnectionString = "Provider=OraOledb.Oracle.1;" & _
    "password=" & Password & ";" & _
    "User ID =" & UserID & ";" & _
    "Data Source=" & DataSource & ";" & _
    "Locale Identifier=2052"
    .Open
    End With
    CreateDataSource = True
    Exit Function
    DbConErr:
    CreateDataSource = False
    End FunctionPrivate Sub cmdRead_Click()
    Dim rs As New ADODB.Recordset
    rs.ActiveConnection = rn
    rs.LockType = adLockOptimistic
    rs.CursorLocation = adUseClient
    rs.Source = "select * from t_demo"
    rs.Open
    ComDlgDir.DialogTitle = "保存文件"
    ComDlgDir.Filter = "*.*"
    ComDlgDir.ShowSave
    Call BlobToFile(rs.Fields("text"), ComDlgDir.filename)
    Set rs = Nothing
    Exit Sub
    Set rs = Nothing
    End SubPrivate Sub cmdsave_Click()
    Dim rs As New ADODB.Recordset
    rs.ActiveConnection = rn
    rs.LockType = adLockOptimistic
    rs.CursorLocation = adUseClient
    rs.Source = "select * from t_demo"
    rs.Open
    rs.AddNew 
    ComDlgDir.DialogTitle = "选取文件"
    ComDlgDir.ShowOpen 
    rs.Fields("id").Value = 1
    If ComDlgDir.filename <> "" Then
    Call FileToBlob(rs.Fields("text"), ComDlgDir.filename)
    rs.Update
    End If 
    Set rs = Nothing
    Exit Sub
    Set rs = Nothing 
    End SubPrivate Sub Form_Load()
    If Not CreateDataSource("sid", "systemp", "manager") Then
    MsgBox "Connection failure!"
    End If
    End Subfld As ADODB.Field, filename As String, Optional ChunkSize As Long = 8192)
    Dim fnum As Integer, bytesleft As Long, bytes As Long
    Dim tmp() As Byte
    If (fld.Attributes And adFldLong) = 0 Then
    Err.Raise 1001, , "field doesn't support the GetChunk method."
    End If
    If Dir$(filename) = "" Then Err.Raise 53, , "File not found"
    fnum = FreeFile 
    Open filename For Binary As fnum
    bytesleft = LOF(fnum)
    Do While bytesleft
    bytes = bytesleft
    If bytes > ChunkSize Then bytes = ChunkSize
    ReDim tmp(1 To bytes) As Byte
    Get fnum, , tmp
    fld.AppendChunk tmp
    bytesleft = bytesleft - bytes
    Loop
    Close #fnum
    End SubSub BlobToFile(fld As ADODB.Field, filename As String, Optional ChunkSize As Long = 8192)
    Dim fnum As Integer, bytesleft As Long, bytes As Long
    Dim tmp() As Byte
    If (fld.Attributes And adFldLong) = 0 Then
    Err.Raise 1001, , "field doesn't support the GetChunk method."
    End If
    If Dir$(filename) <> "" Then Kill filename
    fnum = FreeFile
    Open filename For Binary As fnum
    bytesleft = fld.ActualSize
    Do While bytesleft
    bytes = bytesleft
    If bytes > ChunkSize Then bytes = ChunkSize
    tmp = fld.GetChunk(bytes)
    Put #fnum, , tmp
    bytesleft = bytesleft - bytes
    Loop
    Close #fnum
    End Sub
      

  2.   

    关于用ado方式读、写blob字段,参见:
    http://www.csdn.net/expert/topic/580/580137.xml?temp=3.103274E-02
      

  3.   

    但是
    select * from blob_table会出现有“数据类型不一致”!的错误,该怎么办
      

  4.   

    UP
    我做后台,前台的同事用的VB.net,他说在VB.net中不能用6.0下可以用的AppendChunk()和GetChunk()等函数,所以想请教各位在VB.net下如何用OO¥O处理BLOB对象?