Cómo insertar y extraer documentos de una tabla Oracle (con un campo RAW/BLOB). Para ello utilizaremos Visual Basic 6 y OLEDB.
Oracle incorpora un tipo de datos llamado BLOB que permite almacenar documentos de cualquier tipo (imágenes, excel, word, access, comprimidos, vídeos, música, etc). En principio admite cualquier tipo de documento y de cualquier tamaño. Para más información puedes visitar este artículo: Tipos de datos en Oracle. Aún sigue manteniendo el tipo de datos LONG RAW que está obsoleto, sustituido por BLOB. Las instrucciones que os mostramos a continuación admiten ambos tipos de datos: BLOB y LOB RAW.
Para poder insertar documentos en un campo BLOB de Oracle con Visual Basic necesitaremos una librería (dll) llamada SAFileMgr Module (SAFileMgr.dll), esta librería está disponible de forma gratuita en la web www.softartisans.com. Tras descargar este fichero, deberemos copiarlo a la carpeta del sistema (normalmente C:/Windows/System32) y registrarlo con el comando:
regsvr32 C:/Windows/System32/SAFileMgr.dll
De la siguiente forma: copiaremos el fichero SAFileMgr.dll a la carpeta System32 de Windows. Pulsaremos en el botón «Inicio», luego en «Ejecutar»:
Introduciremos el comando:
%systemroot%/system32/SAFileMgr.dll
y pulsaremos «Aceptar»:
Si el registro es correcto nos mostrará este mensaje:
Con el texto:
RegSvr32
DllRegisterServer en C:/Windows/System32/SAFileMgr.dll se realizó con éxito.
Aceptar
Tras copiar y registrar el fichero SAFileMgr.dll, también necesitaremos disponer de una base de datos Oracle activa (Instalar Oracle Database 10g en Windows XP), con una base de datos (Cómo crear una base de datos en Oracle 9 utilizando el asistente que incorpora) y una tabla con la siguiente estructura:
1 2 3 4 |
CREATE TABLE documentos ( titulo VARCHAR2 (100), rutadocumento VARCHAR2 (255), documento BLOB); |
Podremos cambiar el nombre de la tabla y el nombre de los campos, también podremos utilizar una tabla existente. Ejecutando el script SQL anterior en la BD de Oracle creará la tabla «documentos» para realizar las pruebas oportunas. Para ejecutar el script podemos utilizar esta aplicación: AjpdSoft Administración Bases de Datos.
Tras tener la tabla creada con el campo BLOB, procederemos a abrir Visual Basic y a crear un nuevo proyecto para insertar y extraer documentos en Oracle. En la ventana de «Nuevo proyecto» seleccionaremos «EXE estándar» y pulsaremos «Abrir»:
Para que la aplicación funcione correctamente deberemos agregar las referencias necesarias. Para ello pulsaremos en el menú «Proyecto » – «Referencias» de Visual Basic:
Seleccionaremos la referencia FileMgr 1.1:
Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero .dll copiado y registrado anteriormente:
C:/Windows/System32/SAFileMgr.dll
Seleccionaremos también Microsoft ActiveX Data Objects 2.6 Library:
Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero ubicado en:
C:/Archivos de programa/Archivos comunes/system/ado/msado26.tlb
A continuación, añadiremos al formulario todos los componentes que estimemos necesarios para realizar la aplicación (TextBox, Frame, Label, CommandButton, etc). En nuestro caso hemos optado por este diseño:
Os mostramos el código de cada uno de los botones del formulario:
- Para el botón «Insertar documento«:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Private Sub btInsertarDocumento_Click() Dim Conn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim FileMgr As New FileManager Dim SQL As String On Error GoTo cError ' Conxión mediante OLEDB Conn.Provider = "OraOLEDB.Oracle" Conn.Open txtServicio.Text, _ txtUsuario.Text, txtContrasena.Text ' Ejecutamos una consulta SQL sobre la tabla ' para activar el recordset SQL = "Select * from " + txtTabla.Text + " where 1=2" Rs.Open SQL, Conn, 2, 3 ' Añadimos un nuevo registro con los datos indicados Rs.AddNew Rs(txtCampoTitulo.Text).Value = txtDocumentoTitulo.Text Rs(txtCampoRutaDocumento.Text).Value = txtDocumento.Text ' Insertarmos el documento en el campo BLOB/RAW FileMgr.ExportToBlob txtDocumento.Text, Rs(txtCampoBLOB.Text) Rs.Update Rs.Close Conn.Close Set Conn = Nothing MsgBox "Documento insertado correctamente en " + _ "la base de datos: " + vbCrLf + vbCrLf + _ txtDocumento.Text, vbOKOnly + vbInformation cSalir: Exit Sub cError: MsgBox Err.Description GoTo cSalir End Sub |
- Para el botón «Ejecutar«:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Private Sub btEjecutar_Click() Dim Conn As New ADODB.Connection Dim Rs As New ADODB.Recordset On Error GoTo cError ' Conexión a Oracle mediatne OLEDB Conn.Provider = "OraOLEDB.Oracle" Conn.Open txtServicio.Text, _ txtUsuario.Text, txtContrasena.Text ' Ejecutamos consulta SQL introducida por el usuario Rs.Open txtSQL.Text, Conn, 0, 1 txtExtraerTitulo.Text = Rs(txtCampoTitulo.Text) txtDestino.Text = Rs(txtCampoRutaDocumento.Text) Rs.Close Conn.Close Set Conn = Nothing MsgBox "Consulta SQL ejecutada correctamente.", _ vbOKOnly + vbInformation cSalir: Exit Sub cError: MsgBox Err.Description GoTo cSalir End Sub |
- Para el botón «Ejecutar«:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Private Sub btExtraer_Click() Dim Conn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim FileMgr As New FileManager Dim continuar As Boolean On Error GoTo cError ' Conexión a Oracle mediatne OLEDB Conn.Provider = "OraOLEDB.Oracle" Conn.Open txtServicio.Text, _ txtUsuario.Text, txtContrasena.Text ' Ejecutamos consulta SQL introducida por el usuario Rs.Open txtSQL.Text, Conn, 0, 1 ' Comprobamos si existe ya un fichero destino ' con el mismo nombre continuar = False If Dir(txtDestino.Text) <> "" Then continuar = MsgBox("Ya existe un documento " + _ "con este nombre ¿desea reemplazarlo?", _ vbYesNo + vbQuestion) = vbYes Else continuar = True End If ' Extraemos el documento del primer ' registro de la consulta SQL ' en el destino especificado por el usuario If continuar Then FileMgr.ImportFromBlob Rs(txtCampoBLOB.Text), txtDestino.Text MsgBox "Fichero extraído correctamente en: " _ + vbCrLf + vbCrLf + _ txtDestino.Text, vbOKOnly + vbInformation End If Rs.Close Conn.Close Set Conn = Nothing cSalir: Exit Sub cError: MsgBox Err.Description GoTo cSalir End Sub |
Algunas capturas de pantalla de la aplicación en funcionamiento:
- Tras añadir los datos de conexión, seleccionar un documento a insertar y pulsar el botón «Insertar documento»:
- Tras añadir la consulta SQL para descargar un documento de la BD y pulsar el botón «Ejecutar»:
- Tras seleccionar el destino, la consulta SQL y pulsar el botón «Extraer documento»:
Para realizar este artículo hemos utilizado:
- Microsoft Visual Basic 6.
- Oracle 9i.
- AjpdSoft Administración Bases de Datos.
- SAFileMgr Module (www.softartisans.com).