DESARROLLO WEB EN ENTORNO SERVIDOR CAPÍTULO 6: Utilización de técnicas de acceso a datos Marcos López Sanz Juan Manuel Vara Mesa Jenifer Verde Marín Diana Marcela Sánchez Fúquene Jesús Javier Jiménez Hernández Valeria de Castro Martínez
Conectar con una base de datos PHP: o MySQL 4.1 y posteriores: $conector=mysqli_connect($host, $user, $password [,dbname]); o MySQL 4.0 y anteriores: $conector=mysql_connect($host, $user, $password); mysql_select_db($dbname); 2
Conectar con una base de datos JSP: o MySQL: <%@page import= java.sql.* %> <% Connection conexion=null; Statement st=null; %> Class.forName( org.gjt.mm.mysql.driver ); conexion=drivermanager.getconnection( jdbc:mysql://localhost/ directorios..., nombre_usuario, contraseña ); 3
Conectar con una base de datos JSP: o SQL Server: Class.forName( com.microsoft.sqlserver.jdbc.sqlserverdriver ); Connection conexion=drivermanager.getconnection( dbc:sqlserver://localhost;databasename=ruta_bd, nombre_usuario, contraseña ); o MS Access: Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); Connection conexion=drivermanager.getconnection ("jdbc:odbc:driver={microsoft Access Driver (*.mdb)};dbq=ruta_bd"); 4
Conectar con una base de datos JSP: o Oracle: Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conexion = DriverManager.getConnection("jdbc:oracle:thin:@miservidor: puerto:esquema","usuario","contraseña"); 5
Conectar con una base de datos ASP: o MySQL: <% %> Dim conn Set conexion=server.createobject( ADODB.connection ) conexion.open Driver={MySQL}; Server=nombre_servidor; Port=puerto; Database=Nombre_db; Uid=Nombre_usuario; Pwd=contraseña o SQL Server: conexion.open Driver={SQL Server}; Server=nombre_servidor; Database=Nombre_db; Uid=Nombre_usuario; Pwd=contraseña 6
Conectar con una base de datos ASP: o Oracle: conexion.open Provider=MSDAORA.1;Password=contaseña;User ID=nombre_usuario;Data Source=data.world o MS Access: conexion.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= nombre_bd 7
Ejecutar sentencias de base de datos PHP: o MySQL 4.1 y posteriores: $result=mysqli_query($conector,$sentencia[,$modo_resultado]); o MySQL 4.0 y anteriores: $result=mysql_query($sentencia[,$conector]); 8
Ejecutar sentencias de base de datos JSP: st=conexion.createstatement(); ResultSet rs= st.executequery(sentencia); int n=st.executeupdate(sentencia); ASP: Set rs = conexion.execute(sentencia) 9
Sentencias de definición de datos (DDL) Crear una BD: CREATE DATABASE nombre_db Borrar una BD: DROP DATABASE nombre_db Crear una tabla: CREATE TABLE nombre_tabla( nombre_columna1 tipo1, nombre_columna2 tipo2,... nombre_columnan tipon) 10
Sentencias de definición de datos (DDL) Borrar una tabla: DROP TABLE nombre_tabla Borrar contenido de una tabla: TRUNCATE TABLE nombre_tabla Modificar una tabla: ALTER TABLE nombre_tabla opciones 11
Sentencias de definición de datos (DDL) Las opciones que se pueden añadir: o Añadir una columna a una tabla: ADD COLUMN nombre_columna tipo o Eliminar una columna de una tabla: DROP COLUMN nombre_columna o Modificar el tipo de una columna: ALTER COLUMN nombre_column tipo_nuevo 12
Sentencias de definición de datos (DDL) Añadir una restricción: o NOT NULL (campo obligatorio y que no puede contener un valor nulo): CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon ) 13
Sentencias de definición de datos (DDL) o UNIQUE (campo cuyo valor debe ser único): MySQL: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon, UNIQUE(nombre_columna1) ) SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL UNIQUE, nombre_columna2 tipo2,... nombre_columnan tipon ) 14
Sentencias de definición de datos (DDL) MySQL/SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( ) nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon, CONSTRAINT nombre_restricción UNIQUE(nombre_columna1,...) Otras: 1. ALTER TABLE nombre_tabla ADD UNIQUE(nombre_columna1) 2. ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_restricción UNIQUE(nombre_columna1,...) 15
Sentencias de definición de datos (DDL) o PRIMARY KEY(clave primaria de una tabla): MySQL: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon, PRIMARY KEY(nombre_columna1) ) SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT PRIMARY KEY, nombre_columna2 tipo2,... nombre_columnan tipon ) 16
Sentencias de definición de datos (DDL) MySQL/SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( ) nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon, CONSTRAINT nombre_restricción PRIMARY KEY (nombre_columna1,...) Otras: 1. ALTER TABLE nombre_tabla ADD PRIMARY KEY (nombre_columna1) 2. ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_restricción PRIMARY KEY (nombre_columna1,...) 17
Sentencias de definición de datos (DDL) o FOREIGN KEY(clave ajena de una tabla): MySQL: CREATE TABLE nombre_tabla( nombre_columna1 tipo1, nombre_columna2 tipo2,... nombre_columnan tipon, FOREIGN KEY(nombre_columna) REFERENCES nombre_tabla2(pk_tabla2) ) SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( nombre_columna1 tipo1, nombre_columna2 tipo2 FOREIGN KEY REFERENCES nombre_tabla2(pk_tabla2),... nombre_columnan tipon ) 18
Sentencias de definición de datos (DDL) MySQL/SQL Server/Oracle/MS Access: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL, nombre_columna2 tipo2,... nombre_columnan tipon, CONSTRAINT nombre_restricción FOREIGN KEY (nombre_columna) REFERENCES nombre_tabla2(pk_tabla2,...)) Otras: 1. ALTER TABLE nombre_tabla1 ADD FOREIGN KEY(nombre_columna)REFERENCES nombre_tabla2(pk_tabla2) 2. ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_restricción FOREIGN KEY(nombre_columna)REFERENCES nombre_tabla2(pk_tabla2,...) 19
Sentencias de definición de datos (DDL) o DEFAULT (campo con valor por defecto): CREATE TABLE nombre_tabla( nombre_columna1 tipo1, nombre_columna2 tipo2 DEFAULT valor,... nombre_columnan tipon ) Otras: MySQL: ALTER TABLE nombre_tabla ALTER nombre_columna SET DEFAULT valor SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla ALTER COLUMN nombre_columna SET DEFAULT valor 20
Sentencias de definición de datos (DDL) o CHECK (establece la condición que debe cumplir un campo): MySQL: CREATE TABLE nombre_tabla( nombre_columna1 tipo1, ) nombre_columna2 tipo2,... nombre_columnan tipon, CHECK(condición) 21
Sentencias de definición de datos (DDL) SQL Server: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 CHECK(condición), nombre_columna2 tipo2,... nombre_columnan tipon ) MySQL/SQL Server/Oracle/MS Access: ) CREATE TABLE nombre_tabla( nombre_columna1 tipo1, nombre_columna2 tipo2,... nombre_columnan tipon, CONSTRAINT nombre_restricción CHECK(condición1 AND...) 22
Sentencias de definición de datos (DDL) Otras: 1.ALTER TABLE nombre_tabla ADD CHECK(condición) 2.ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_restricción CHECK(condición1 AND ) o AUTO_INCREMENT (crear índice que se autoincrementa): MySQL: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 NOT NULL AUTO_INCREMENT, nombre_columna2 tipo2,... nombre_columnan tipon, PRIMARY KEY(nombre_columna1) ) 23
Sentencias de definición de datos (DDL) SQL Server: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 PRIMARY KEY IDENTITY, nombre_columna2 tipo2,... nombre_columnan tipon, ) MS Access: CREATE TABLE nombre_tabla( nombre_columna1 tipo1 PRIMARY KEY AUTOINCREMENT, nombre_columna2 tipo2,... nombre_columnan tipon, ) 24
Sentencias de definición de datos (DDL) Oracle: CREATE SEQUENCE nombre_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 INSERT INTO nombre_tabla (nombre_columna1,...)values (nombre_secuencia.nextval,valor2,...) 25
Sentencias de definición de datos (DDL) Eliminar una restricción: o UNIQUE: MySQL: ALTER TABLE nombre_tabla DROP INDEX nombre_columna SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_columna o PRIMARY KEY: MySQL: ALTER TABLE nombre_tabla DROP PRIMARY KEY SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_columna 26
Sentencias de definición de datos (DDL) o FOREIGN KEY: MySQL: ALTER TABLE nombre_tabla DROP FOREIGN KEY nombre_columna SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_columna o DEFAULT: MySQL: ALTER TABLE nombre_tabla ALTER nombre_columna DROP DEFAULT SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla ALTER COLUMN nombre_columna DROP DEFAULT 27
Sentencias de definición de datos (DDL) o CHECK: SQL Server/Oracle/MS Access: ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_restricción Crear una vista: CREATE VIEW nombre_vista AS SELECT nombre_columna1,... FROM nombre_tabla WHERE condición Eliminar una vista: DROP VIEW nombre_vista 28
Sentencias de definición de datos (DDL) Crear un índice en una tabla: 1. CREATE INDEX nombre_índice ON TABLE nombre_tabla(nombre_columna) 2. CREATE UNIQUE INDEX nombre_índice ON TABLE nombre_tabla(nombre_columna) Eliminar un índice en una tabla: o MS Access: DROP INDEX nombre_índice ON nombre_tabla o SQL Server: DROP INDEX nombre_tabla.nombre_índice o DB2/Oracle: DROP INDEX nombre_índice o MySQL: ALTER TABLE nombre_tabla DROP INDEX nombre_índice 29
Sentencias de control de datos (DCL) Añadir permisos: GRANT privilegio1,... [(nombre_columna,...)] ON nombre_objeto TO {nombre_usuario PUBLIC nombre_rol} Eliminar permisos: REVOKE privilegio1,... [(nombre_columna,...)] ON nombre_objeto FROM {nombre_usuario/s PUBLIC nombre_rol/es} 30
Sentencias de manipulación de datos (DML) Insertar datos en una tabla: 1. INSERT INTO nombre_tabla VALUES(valor1, valor2,...) 2. INSERT INTO nombre_tabla (nombre_columna1,nombre_columna2,...) VALUES(valor1, valor2,...) Borrar datos de una tabla: DELETE FROM nombre_tabla WHERE nombre_columna operador valor Borrar todos los datos de una tabla: 1. DELETE FROM nombre_tabla 2. DELETE * FROM nombre_tabla 31
Sentencias de manipulación de datos (DML) Actualizar campos de una tabla: UPDATE nombre_tabla SET nombre_columna1=valor1, nombre_columna2=valor2,... WHERE nombre_columna operador valor Consultas: o SELECT FROM: consulta el valor de determinadas columnas de una tabla. 1. SELECT nombre_columna1,... FROM nombre_tabla 2. SELECT * FROM nombre_tabla 32
Sentencias de manipulación de datos (DML) o DISTINCT: consulta sólo los valores de las columnas especificadas de una tabla, cuyo valor no se repite. SELECT DISTINCT nombre_columna1,... FROM nombre_tabla o WHERE: consulta los campos de una columna que cumplan cierta condición. SELECT nombre_columna1,... FROM nombre_tabla WHERE nombre_columna operador valor o ORDER BY: consulta los campos especificados de una tabla devolviendo el resultado ordenado. SELECT nombre_columna1,... FROM nombre_tabla ORDER BY nombre_columna1,... [ASC DESC] 33
Sentencias de manipulación de datos (DML) o UNION: une el resultado de realizar varias consultas de selección. SELECT nombre_columna1,... FROM nombre_tabla1 UNION SELECT nombre_columna1,... FROM nombre_tabla2 o INNER JOIN: devuelve las filas cuando al menos existe una coincidencia en ambas tablas. SELECT nombre_columna1,... FROM nombre_tabla1 INNER JOIN nombre_tabla2 ON nombre_tabla1.nombre_columna= nombre_tabla2.nombre_columna 34
Sentencias de manipulación de datos (DML) o LEFT JOIN: devuelve todas las filas de la tabla de la izquierda (nombre_tabla1), e incluso cuando no coincide con la tabla de la derecha (nombre_tabla2). No se mostrarán las columnas de la derecha que no coincidan con las de la izquierda. SELECT nombre_columna1,... FROM nombre_tabla1 LEFT JOIN nombre_tabla2 ON nombre_tabla1.nombre_columna= nombre_tabla2.nombre_columna 35
Sentencias de manipulación de datos (DML) o RIGHT JOIN: devuelve todas las filas de la tabla de la derecha (nombre_tabla2), e incluso cuando no coincide con la tabla de la izquierda (nombre_tabla1). No se mostrarán las columnas de la izquierda que no coincidan con las de la derecha. SELECT nombre_columna1,... FROM nombre_tabla1 RIGHT JOIN nombre_tabla2 ON nombre_tabla1.nombre_columna= nombre_tabla2.nombre_columna 36
Sentencias de manipulación de datos (DML) o FULL JOIN: devuelve todas las filas de las dos tablas. SELECT nombre_columna1,... FROM nombre_tabla1 FULL JOIN nombre_tabla2 ON nombre_tabla1.nombre_columna= nombre_tabla2.nombre_columna o SELECT INTO: se utiliza para crear copias de seguridad (backup) de las tablas. SELECT nombre_columna1,... INTO nombre_tabla_copia [IN nombre_bd_externa] FROM nombre_tabla_original 37
Sentencias de manipulación de datos (DML) o BETWEEN: se utilizan en la condición de las consultas de selección con la cláusula WHERE para seleccionar sólo aquellos campos que estén dentro de un rango de valores. SELECT nombre_columna1,... FROM nombre_tabla WHERE nombre_columna BETWEEN valor1 AND valor2 o IN: el operador IN se utiliza en la condición de las consultas de selección con la cláusula WHERE. Este operador hace que la consulta devuelva el resultado, sólo si la columna especificada en la condición toma un valor de los múltiples valores especificados con el operador IN. SELECT nombre_columna1,... FROM nombre_tabla WHERE nombre_columna IN (valor1, valor2,...) 38
Sentencias de manipulación de datos (DML) o TOP: especifica el número de filas que debe devolver una consulta. SQL Server/MS Access: SELECT TOP número [PERCENT] nombre_columna1,... FROM nombre_tabla MySQL: SELECT nombre_columna1,... FROM nombre_tabla LIMIT número Oracle: SELECT nombre_columna1,... FROM nombre_tabla WHERE ROWNUM <= número 39
Sentencias de manipulación de datos (DML) o ALIAS: son nombres abreviados que se le pueden asignar a columnas o tablas para utilizarlos dentro de la misma consulta. SELECT nombre_columna...from nombre_tabla AS alias_tabla SELECT nombre_columna AS alias_columna FROM nombre_tabla o LIKE: este operador se utiliza para buscar determinados patrones en las columnas especificadas en una tabla. SELECT nombre_columna1,... FROM nombre_tabla WHERE nombre_columna LIKE patrón 40
Sentencias de manipulación de datos (DML) o PATRONES: se utilizan para sustituir uno o más caracteres cuando realizamos búsquedas dentro de la base de datos. Es decir, que se utilizan cuando queremos que una consulta nos devuelva sólo ciertas filas en las que el valor que toma un campo de una columna cumpla una cierta estructura. 41
Sentencias de manipulación de datos (DML) Patrón Descripción Ejemplo % _ [lista_caracteres] Sustituye a cero o más caracteres. Sustituye sólo a un carácter. Sólo un carácter de los que estén en la lista. Campos que empiecen por es: es%. Campos que empiecen por ho tengan un carácter y después a. Lo cumpliría la cadena hola ho_a. %[nl]% lo cumplirían cadenas como mano o palo. [^lista_caracteres] o [ lista_caracteres] Sólo un carácter de los que no estén en la lista. %[^nl]% o %[!nl]% lo cumplen cadenas como paso. 42
Utilización del conjunto resultado Una vez ejecutadas las sentencias en la base de necesitamos obtener la información resultante. En JSP la información se almacena en una estructura llamada ResultSet: o Almacena todos los registros o filas resultantes de la ejecución de una sentencia SQL. o Proporciona acceso a los datos de dichos registros a partir de una serie de métodos: getdouble(), getfloat(), getstring(), getint(), next(), etc. o Contiene un puntero que señala al registro actual y que lo utiliza para acceder al resto de registros que almacena. 43
Utilización del conjunto resultado En PHP existen métodos para recorrer la estructura que devuelve la ejecución de una sentencia SQL. Destacar los siguientes: mysql_fetch_row(), mysql_fetch_array(), mysql_result() y my mysql_free_result(). 44
Utilización del conjunto resultado En ASP la información se almacena en una estructura llamada RecordSet: o Se comporta igual que la estructura ResultSet de JSP. o Métodos más utilizados son: EOF, MoveNext, MoveFirst, MovePrevious y MoveLast. 45
Cerrar conexión de la base de datos ASP: conexion.close() Set rs=nothing Set conexion=nothing JSP: rs.close(); st.close(); conexion.close(); PHP: o o mysql_free_result($result); mysql_close($conector); 46
Transacciones Son un conjunto de instrucciones que se ejecutan de manera atómica, es decir como si fuera una sola instrucción o sentencia SQL. Deben cumplir las siguientes propiedades del test ACID: o Atomicidad: el grupo de sentencias debe comportarse como un todo o ninguno. Si alguna de ellas no se pudiera ejecutar se debería poder deshacer o revertir. o Consistencia: la base de datos debe quedarse en un estado consistente y coherente al finalizar la transacción. 47
Transacciones o Aislamiento: los datos modificados durante una transacción no deben ser visibles para otros usuarios hasta que esta no finalice y se hayan realizado todos los cambios de manera definitiva. o Permanencia: los efectos de una transacción se almacenarán de forma permanente. 48
Transacciones Existen dos formas de finalizar una transacción: o Commit: finaliza la transacción de forma exitosa y hace permanentes los cambios realizados. o Rollback: aborta la transacción porque algunas de las instrucciones que la componen se ha ejecutado y ha fallado. Esta instrucción deshace todos los cambios temporales que se pudieran haber hecho en la base de datos. 49
Transacciones MS Access: BEGIN TRANSACTION Sentencia1_SQL Sentencia2_SQL... ROLLBACK [WORK TRANSACTION] COMMIT [WORK TRANSACTION] SQL Server: BEGIN TRAN TRANSACTION [nombre_transacción] Sentencia1_SQL Sentencia2_SQL... ROLLBACK TRAN TRANSACTION [nombre_transacción punto_recuperación] [WORK] COMMIT TRAN TRANSACTION [nombre_transacción] [WORK] 50
Transacciones Oracle: Sentencia1_SQL Sentencia2_SQL... ROLLBACK [WORK] [TO SAVEPOINT nombre TO punto_recuperación] COMMIT [WORK] MySQL: START {TRANSACTION BEGIN [WORK]} Sentencia1_SQL Sentencia2_SQL... ROLLBACK [WORK][TO SAVEPOINT nombre TO punto_recuperación] COMMIT [WORK] 51
Transacciones Definir puntos de recuperación: o SQL Server: SAVE TRAN TRANSACTION punto_recuperación o Oracle/MySQL: SAVEPOINT nombre Borrar puntos de recuperación en MySQL: RELASE SAVEPOINT punto_recuperación 52
Serialización/ Niveles de aislamiento Problemas: o Lectura sucia: esta situación se da cuando una transacción T1 modifica los datos que lee T2, y luego se hace un rollback de T1.Por lo tanto T2 ha leído unos datos que no existen. o Lectura no repetible: en una transacción T1 queremos leer dos veces los mismos datos, pero entre ambas lecturas T2 elimina algunos datos. Esto provoca que tengamos resultados distintos en cada una de las lecturas, ya que en la segunda lectura nos faltarán datos con respecto a la lectura anterior. 53
Serialización/ Niveles de aislamiento o Lectura fantasma: Es parecida a la anterior, ya que en una transacción T1 queremos leer dos veces los mismos datos, pero entre ambas lecturas T2 en vez de eliminar añade algunos datos. Esto provoca que al leer por segunda vez nos encontremos tuplas que anteriormente no existían. 54
Serialización/ Niveles de aislamiento Solución: niveles de aislamiento. o Serializable. Si aplicamos el nivel serializable podremos ver la base de datos antes o después de la ejecución de una transacción, pero nunca mientras se está realizando. Por lo tanto da la sensación de que las instrucciones se ejecutan una detrás de otra. Esto sólo es aplicable al usuario que lo elige, es decir que otro usuario puede tener definido otro nivel de aislamiento. Este es el nivel que viene por defecto en las base de datos. o Read commited. Este nivel evita la lectura sucia permitiendo sólo la lectura de los datos que han sido confirmados mediante la realización de un commit de otra transacción. 55
Serialización/ Niveles de aislamiento o Repeatable read. Este nivel en cambio evita la lectura no repetible. Es igual que Read commited añadiéndole la restricción de que todo lo que veamos en una lectura inicial de una transacción debemos poder verlo en lecturas posteriores. o Read uncommited. Si una transacción se ejecuta con este nivel de aislamiento puede ver las modificaciones realizadas por otra transacción, sean actualizaciones, borrados o inserciones a pesar de no haber hecho un commit. 56
Serialización/ Niveles de aislamiento Nivel Lectura Sucia Lectura No Repetible Lectura Fantasma Serializable NO NO NO Repeteable Read NO NO SI Read Commited NO SI SI Read Uncommited SI SI SI Snapshot NO NO NO 57
Serialización/ Niveles de aislamiento MySQL: SET [SESSION GLOBAL] TRANSACTION ISOLATION LEVEL READ UNCOMMITED READ COMMITED SERIALIZABLE REPETEABLE READ SQL Server: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED READ COMMITED SERIALIZABLE REPETEABLE READ SNAPSHOT Oracle: SET TRANSACTION ISOLATION LEVEL {READ COMMITED SERIALIZABLE} 58
Otros orígenes de datos Se pueden trabajar con ficheros: CSV, XML y fichero de texto. Los ficheros CSV son documentos de formato abierto para representar datos en forma de tabla y que pueden ser procesados en Excel. En estos ficheros separan las filas por saltos de línea y las columnas por un separador (en general suele utilizarse, ). Los ficheros XML se utilizan hoy en día para el intercambio de información estructurada y está basado en un lenguaje de etiquetas. 59
Otros orígenes de datos Funciones en PHP para trabajar con ficheros: o fopen: abre un fichero. o fclose: cierra un fichero. o fread: lee un fichero. o fwrite: escribe en un fichero. o feof: indica el final del fichero. o fgetcsv: lee un fichero CSV. o fputcsv: escribe un fichero CSV. 60
Otros orígenes de datos Trabajar en ASP con ficheros: 1. Crear el objeto File System: Set fs=server.createobject("scripting.filesystemobject") 2. Utilizar las funciones disponibles: OpenTextFile(), CreateTextFile(), Close(), Read(), Write(), etc. 61
Otros orígenes de datos Trabajar en JSP con ficheros: o Para trabajar con ficheros de texto hay que crear un fichero si este no existe (File), un objeto PrintWriter para escribir en él y/o un objeto BufferedReader si lo que queremos es leer la información que este contiene. o Para trabajar con ficheros CSV hay que crear un objeto CsvWriter para escribir en ellos y CsvReader para leerlos. 62
Otros orígenes de datos o Existen también métodos para facilitar el trabajo con ficheros en JSP. Otro tipo de ficheros son los XML para trabajar con ellos se convierte este en un objeto DOM que permita recorrer la estructura en forma de árbol. Existen métodos para trabajar con objetos DOM. 63