Sunteți pe pagina 1din 4

Usar los campos tipo Image para guardar ficheros.

21 de Agosto de 2001

Esta es una de las cuestiones recurrentes en casi todos los que comienzan con Visual Basic, ya sea usando Access o Sql-SErver o incluso Oracle u otro motor de datos. Cuando hay datos adjuntos siempre surge la duda de que es mejor, si introducir los datos en la Base de datos o si por el contrario, almacenar solamente la ruta del fichero; en fn, no hay como siempre soluciones mgicas. Yo personalmente jams usara ficheros en Bases de datos Access (Estn limitadas a 1Gb) ni en instalaciones en las que el espacio sea un problema. Para los que querais introducir estos datos en la base de datos, aqu os adjunto cdigo fuente de como hacerlo, suerte. Est montado en un proyecto ActiveX, para poder olvidarse del problema y simplemente usar este componente, no obstante el componente es una primera versin y no controla ni un solor error con lo que yo le dara un repasito antes de usarlo, al menos para aadir un control de errores. Ahh!! Si lo haces, please mandame una copia..... y la publico o la uso lo que sea ... Y por ultimo he de confesar que la mayora del cdigo est sableado de la ayuda de los mtodos getchunk y appendchunk que trae visual Basic. (Hay que mirarla ms) EL CDIGO VISUAL BASIC. Option Explicit ' Esta clase est preparada para funcionar sobre sql-server ' Esta clase tratar las peticiones que le llegen ' desde una conexin y guardar los ficheros en una ' tabla con la siguiente estructura '********* TABLA DATOS ADJUNTOS ***********' ' Estructura ' Codigo varchar(10) Ser la clave por la que recuperar ' Descripcion varchar(80) ' BLOB image ' Estado int Se podr usar para propsito general ' desde aplicaciones cliente.

' ' ' '

*************** METODO PRIVADO CompruebaTabla ********************** Esta funcin comprobar que existe la tabla de datos adjuntos y si no es as, la crear en la conexin que nos demande esa informacin, de esta maner la clase ser practicamente autosuficiente.

Private Sub CompruebaTabla(loConexion As Connection) Dim lsSql As String Dim loR As ADODB.Recordset

If Not loConexion Is Nothing Then lsSql = "SELECT Count(*) Cuantos From sysobjects where xtype='U' and name ='_DatosAdjuntos'" Set loR = loConexion.Execute(lsSql) If loR.EOF Then ' no existe la tabla, habr que crearla lsSql = " CREATE TABLE _DatosAdjuntos ( codigo Varchar(10) not null primary key," lsSql = lsSql & " Descripcion varchar(80), BLOB image, Estado int default 0)" loConexion.Execute lsSql Else If loR!Cuantos = 0 Then lsSql = " CREATE TABLE _DatosAdjuntos ( codigo Varchar(10) not null primary key," lsSql = lsSql & " Descripcion varchar(80), BLOB image, Estado int default 0)" loConexion.Execute lsSql End If End If loR.Close Set loR = Nothing End If End Sub ' ' ' ' ' *************** METODO PUBLICO InsertarDatos ********************** ' Este mtodo tomar como entrada el cdigo y la ruta de un fichero e insertar el fichero en la tabla en el registro seleccionado Comprobaremos si el registro ya existe y si es as lo actualizaremos si no lo es, lo insertaremos

Public Sub InsertarDatos(loConexion As Connection, lsCodigo As String, lsDescripcion As String, lsruta As String, lnEstado As Long) Dim lsSql As String Dim loR As New Recordset Dim lnNumero Dim fl As Long, i As Long Dim fragment As Long Dim Chunks Dim varChunk() As Byte If Not loConexion Is Nothing Then ' Comprobamos si existe la tabla CompruebaTabla loConexion ' Abrimos la informacin en el registro que nos interesa.... lsSql = lsSql & " SELECT * FROM _DatosAdjuntos " lsSql = lsSql & " WHERE Codigo = '" & lsCodigo & "'" loR.Open lsSql, loConexion, adOpenKeyset, adLockOptimistic ', adCmdTable If loR.EOF Then loR.AddNew loR!Codigo = Left(lsCodigo, 10) End If loR!Descripcion = Left(lsDescripcion, 80) loR!Estado = lnEstado ' Abrimos el fichero para poder subirlo lnNumero = FreeFile Open lsruta For Binary Access Read As lnNumero

' El fichero hay que partirlo en trozos.... fl = LOF(lnNumero) ' Longitud de los datos en el archivo If fl = 0 Then Close lnNumero: Exit Sub Chunks = fl \ 16384 fragment = fl Mod 16384 ' limpiamos el campo por si acaso... loR!BLOB.AppendChunk Null ReDim varChunk(fragment) ' Tomo un trozo del tamao necesario Get lnNumero, , varChunk() loR!BLOB.AppendChunk varChunk() ReDim varChunk(16384) ' y ahora los trozos que quedan todos igualitos ... For i = 1 To Chunks Get lnNumero, , varChunk() loR!BLOB.AppendChunk varChunk() Next i Close lnNumero ' Cerramos el fichero, actualizamos y listo..... loR.Update loR.Close End If End Sub ' ' ' ' *************** METODO PUBLICO RecogerDatos ********************** ' Este mtodo busca en la tabla si existe el elemento solicitado y si es as lo deja depositado en la direccin pasada como ruta en parametros adems devuelve la descripcin y el estado ......

Public Sub RecogerDatos(loConexion As Connection, lsCodigo As String, lsDescripcion As String, lsruta As String, lnEstado As Long) Dim lsSql As String Dim loR As New Recordset Dim lnNumero, lnFichero Dim fl As Long, i As Long Dim fragment As Long Dim Chunks Dim varChunk() As Byte If Not loConexion Is Nothing Then ' Comprobamos si existe la tabla CompruebaTabla loConexion ' Abrimos la informacin en el registro que nos interesa.... lsSql = " SELECT * FROM _DatosAdjuntos " lsSql = lsSql & " WHERE Codigo = '" & lsCodigo & "'" Set loR.ActiveConnection = loConexion loR.Open lsSql, , adOpenKeyset, adLockOptimistic ', adCmdTable If Not loR.EOF Then ' Si no existiese el registro no hay nada que devolver.... lsDescripcion = loR!Descripcion lnEstado = loR!Estado ' Ahora dejemos el fichero en la ruta solicitada .... If Dir(lsruta, vbArchive) = "" Then ' aseguramos que en la ruta no hay nada lnFichero = FreeFile fl = loR!BLOB.ActualSize If fl = 0 Then Exit Sub Open lsruta For Binary Access Write As lnFichero

Chunks = fl \ 16384 fragment = fl Mod 16384 ReDim varChunk(fragment) varChunk() = loR!BLOB.GetChunk(fragment) Put lnFichero, , varChunk() For i = 1 To Chunks ReDim varChunk(16384) varChunk() = loR!BLOB.GetChunk(16384) Put lnFichero, , varChunk() Next i Close lnFichero End If End If loR.Close End If End Sub

Claro que si lo prefieres te puedes bajar todo el cdigo de AQU

S-ar putea să vă placă și