• Viernes 8 de Noviembre de 2024, 07:40

Autor Tema:  Problema al almacenar / leer ficheros en BBDD  (Leído 1321 veces)

pacevedo

  • Nuevo Miembro
  • *
  • Mensajes: 12
  • Nacionalidad: es
    • Ver Perfil
Problema al almacenar / leer ficheros en BBDD
« en: Jueves 23 de Julio de 2009, 15:59 »
0
Hola,
Tengo el siguiente problema.
Mediante las funciones que a continuación describo, almaceno y leo desde BBDD archivos (sobre un campo image de SQLServer)
Siempre ha funcionado bien, pero ahora me he dado cuenta que con archivos de Office2007 (docx, xlsx, etc) da problemas de apertura.
He descubierto que en BBDD se están almacenando bytes de mas.
¿Alguien ha tenido este problema y lo ha podido solucionar?
Dejo aquí las funciones para su revisión:

Public Function GuardarBinario(ByRef rs As Recordset, Campo As String, archivo As String, Optional BorraArchivo As Boolean) As Integer
    ' Función que Almacena en Base de datos un archivo binario
    ' Recibe como parámetros una referencia a un recorset, el campo dónde se almacena
    ' el archivo que hay que almacenar y si se desea borrar el fichero físico una vez almacenado
    ' La función devuelve 0 si almacenó correctamente el archivo o 1 si hubo un error
   
    Dim LongitudFichero, i As Long
    Dim Porcion As Long
    Dim Bloque
    Dim varChunk() As Byte
   
    lnNumero = FreeFile
    Open archivo For Binary Access Read As lnNumero
                                        ' El fichero hay que partirlo en trozos....
    LongitudFichero = LOF(lnNumero)                  ' Longitud de los datos en el archivo
    nconst = 102400
   
    If LongitudFichero > 0 Then
        Bloque = LongitudFichero  nconst
        Porcion = LongitudFichero Mod nconst
        rs(Campo).AppendChunk Null      ' limpiamos el campo por si acaso...
       
        ReDim varChunk(Porcion)
        Get lnNumero, , varChunk()      ' Tomo un trozo del tamaño necesario
        rs(Campo).AppendChunk varChunk()
        ReDim varChunk(nconst)
        For i = 1 To Bloque             ' y ahora los trozos que quedan
            Get lnNumero, , varChunk()
            rs(Campo).AppendChunk varChunk()
        Next i
        GuardarBinario = 0
    Else
        GuardarBinario = 1
    End If
    Close lnNumero
    If BorraArchivo = True Then
        Kill archivo
    End If
End Function

Public Sub LeerBinario(ByRef rs As Recordset, Campo As String, archivo As String)
    ' Procedimiento que guarda en disco un archivo binario leido de Base de datos

    Dim fl, i As Long
    Dim fragment As Long
    Dim Chunks
    Dim varChunk() As Byte
   
    lnFichero = FreeFile
    fl = rs(Campo).ActualSize
    If fl > 0 Then
        Open Environ("TEMP") + "" + archivo For Binary Access Write As lnFichero
        Chunks = fl  102400
        fragment = fl Mod 102400
        ReDim varChunk(fragment)
        varChunk() = rs(Campo).GetChunk(fragment)
        Put lnFichero, , varChunk()
        For i = 1 To Chunks
            ReDim varChunk(102400)
            varChunk() = rs(Campo).GetChunk(102400)
            Put lnFichero, , varChunk()
        Next i
        Close lnFichero
    End If
End Sub