Modules

5.10 Funzioni per inserire o recuperare oggetti blob dal db con Ado oppure con Dao
  Pietro Bonaventi
Private Const BlockSize = 32768
Private Const ERR_INVALID_FIELD_TYPE = vbObjectError + 1000

'********************************************************************
'Funzione Ado per recuperare un oggetto blob e ricostruirlo su disco
'--------------------------------------------------------
'Per lanciare la funzione utilizzare il seguente codice
'la tabella1 contiene un campo blob rs!immagine
'--------------------------------------------------------
'Dim rs As New ADODB.Recordset
'rs.Open "Tabella1", CurrentProject.Connection, adOpenDynamic, adLockBatchOptimistic
'While Not rs.EOF
'   Call getBlobAdo("c:\miaimmagine.jpg", rs!immagine)
'   rs.MoveNext
'Wend
'rs.Close
'Set rs = Nothing
'********************************************************************
Function getBlobAdo(strFilename As String, fld As ADODB.Field) As Long
On Error GoTo Err_Handler
    Dim intFile As Integer, lngCount As Long
    Dim lngFileLength As Long, lngLeftOver As Long, lngNumBlocks As Long
    Dim abytFileData() As Byte
    
    If Not fld.Type = adLongVarBinary Then _
    Err.Raise ERR_INVALID_FIELD_TYPE, "GetBlob", "Il campo non è un oggetto (OLE)."
    
    lngFileLength = fld.ActualSize
    If Not lngFileLength > 0 Then GoTo Exit_Here
    
    lngNumBlocks = Fix(lngFileLength / BlockSize)
    lngLeftOver = lngFileLength Mod BlockSize
    
    intFile = FreeFile
    Open strFilename For Output As intFile
    Close intFile
    
    Open strFilename For Binary Access Write Lock Write As intFile
    
    abytFileData() = fld.GetChunk(lngLeftOver)
    Put #intFile, , abytFileData()
    
    For lngCount = 1 To lngNumBlocks
        abytFileData() = fld.GetChunk(BlockSize)
        Put #intFile, , abytFileData()
    Next lngCount
    
    getBlobAdo = lngFileLength
    
Exit_Here:
    On Error Resume Next
    Close intFile
    Exit Function
    
Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    Resume Exit_Here
End Function

'********************************************************************
'Funzione Ado per scrivere un oggetto blob in tabella
'--------------------------------------------------------
'Per lanciare la funzione utilizzare il seguente codice
'la tabella1 contiene un campo blob rs!immagine
'--------------------------------------------------------
'Dim rs As New ADODB.Recordset
'rs.Open "Tabella1", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
'While Not rs.EOF
'   rs.AddNew
'   Call putBlobAdo("c:\miaimmagine.jpg", rs!immagine)
'   rs.Update
'   rs.MoveNext
'Wend
'rs.Close
'Set rs = Nothing
'********************************************************************
Function putBlobAdo(strFilename As String, fld As ADODB.Field) As Long
On Error GoTo Err_Handler
    Dim intFile As Integer
    Dim lngNumBlocks As Long, lngFileLength As Long
    Dim lngLeftOver As Long, lngCount As Long
    Dim abytFileData() As Byte
    
    If Not Len(dir$(strFilename)) > 0 Then GoTo Exit_Here
    
    If Not fld.Type = adLongVarBinary Then _
    Err.Raise ERR_INVALID_FIELD_TYPE, "GetBlob", "Il campo non è un oggetto (OLE)."
    
    intFile = FreeFile
    Open strFilename For Binary Access Read Lock Read Write As intFile
    
    lngFileLength = LOF(intFile)
    If Not lngFileLength > 0 Then GoTo Exit_Here
    
    lngNumBlocks = Fix(lngFileLength / BlockSize)
    lngLeftOver = lngFileLength Mod BlockSize
    
    'String() gives a Unicode string, need to convert to ANSI
    abytFileData = StrConv(String$(lngLeftOver, vbNullChar), vbFromUnicode)
    Get #intFile, , abytFileData
    fld.AppendChunk abytFileData
    
    abytFileData = StrConv(String$(BlockSize, vbNullChar), vbFromUnicode)
    For lngCount = 1 To lngNumBlocks
        Get intFile, , abytFileData
        fld.AppendChunk abytFileData
    Next lngCount
    
    putBlobAdo = lngFileLength
    
Exit_Here:
    On Error Resume Next
    Close intFile
    Exit Function
    
Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    Resume Exit_Here

End Function


'********************************************************************
'Funzione Dao per recuperare un oggetto blob e ricostruirlo su disco
'--------------------------------------------------------
'Per lanciare la funzione utilizzare il seguente codice
'la tabella1 contiene un campo blob rs!immagine
'--------------------------------------------------------
'Dim rs As Recordset
'Set rs = CurrentDb.OpenRecordset("tabella1")
'While Not rs.EOF
'   Call getBlobAdo("c:\miaimmagine.jpg", rs!immagine)
'   rs.MoveNext
'Wend
'rs.Close
'Set rs = Nothing
'********************************************************************
Function getBlob(strFilename As String, fld As DAO.Field) As Long
On Error GoTo Err_Handler
    Dim intFile As Integer
    Dim lngNumBlocks As Long, lngFileLength As Long
    Dim lngLeftOver As Long, lngCount As Long
    Dim abytFileData() As Byte
    
    If Not Len(dir$(strFilename)) > 0 Then GoTo Exit_Here
    
    If Not fld.Type = dbLongBinary Then _
    Err.Raise ERR_INVALID_FIELD_TYPE, "GetBlob", "Il campo non è un oggetto (OLE)."
    
    intFile = FreeFile
    Open strFilename For Binary Access Read Lock Read Write As intFile
    
    lngFileLength = LOF(intFile)
    If Not lngFileLength > 0 Then GoTo Exit_Here
    
    lngNumBlocks = Fix(lngFileLength / BlockSize)
    lngLeftOver = lngFileLength Mod BlockSize
    
    'String() gives a Unicode string, need to convert to ANSI
    abytFileData = StrConv(String$(lngLeftOver, vbNullChar), vbFromUnicode)
    Get #intFile, , abytFileData
    fld.AppendChunk abytFileData
    
    abytFileData = StrConv(String$(BlockSize, vbNullChar), vbFromUnicode)
    For lngCount = 1 To lngNumBlocks
        Get intFile, , abytFileData
        fld.AppendChunk abytFileData
    Next lngCount
    
    getBlob = lngFileLength
    
Exit_Here:
    On Error Resume Next
    Close intFile
    Exit Function
    
Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    Resume Exit_Here
End Function

'********************************************************************
'Funzione Dao per scrivere un oggetto blob in tabella
'--------------------------------------------------------
'Per lanciare la funzione utilizzare il seguente codice
'la tabella1 contiene un campo blob rs!immagine
'--------------------------------------------------------
'Dim rs As Recordset
'Set rs = CurrentDb.OpenRecordset("tabella1")
'While Not rs.EOF
'   rs.AddNew
'   Call getBlobAdo("c:\miaimmagine.jpg", rs!immagine)
'   rs.Update
'   rs.MoveNext
'Wend
'rs.Close
'Set rs = Nothing
'********************************************************************
Function putBlob(strFilename As String, fld As DAO.Field) As Long
On Error GoTo Err_Handler
    Dim intFile As Integer, lngCount As Long
    Dim lngFileLength As Long, lngLeftOver As Long, lngNumBlocks As Long
    Dim abytFileData() As Byte
    
    If Not fld.Type = dbLongBinary Then _
    Err.Raise ERR_INVALID_FIELD_TYPE, "GetBlob", "Il campo non è un oggetto (OLE)."
    
    lngFileLength = fld.FieldSize()
    If Not lngFileLength > 0 Then GoTo Exit_Here
    
    lngNumBlocks = Fix(lngFileLength / BlockSize)
    lngLeftOver = lngFileLength Mod BlockSize
    
    intFile = FreeFile
    Open strFilename For Output As intFile
    Close intFile
    
    Open strFilename For Binary Access Write Lock Write As intFile
    
    abytFileData() = fld.GetChunk(0, lngLeftOver)
    Put #intFile, , abytFileData()
    
    For lngCount = 1 To lngNumBlocks
        abytFileData() = fld.GetChunk((lngCount - 1) * BlockSize + lngLeftOver, BlockSize)
        Put #intFile, , abytFileData()
    Next lngCount
    
    putBlob = lngFileLength
    
Exit_Here:
    On Error Resume Next
    Close intFile
    Exit Function
    
Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    Resume Exit_Here
End Function


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.