Unidad IV Acceso A Datos
Unidad IV Acceso A Datos
Unidad IV Acceso A Datos
Ing. Wilber
Unidad IV
N control: 11430324
ndice Unidad IV Acceso a datos 1.1. Introduccin 1.2. Creacin de una base de datos y tablas 1.3. Manipulacin de los datos
4.1 Introduccin
objeto ResultSet contiene los datos devueltos por la consulta. A continuacin, puede recorrer en iteracin el objeto ResultSet para obtener acceso a los datos. El ejemplo siguiente proporciona el cdigo Java que se va a leer en una base de datos. Connection c; try { Class.forName (_driver); c = DriverManager.getConnection(url, user, pass); } catch (Exception e) { // Handle exceptions for DriverManager // and Connection creation: } try { Statement stmt = c.createStatement(); ResultSet results = stmt.executeQuery( "SELECT TEXT FROM dba "); while(results.next()) { String s = results.getString("ColumnName"); // Display each ColumnName value in the ResultSet: } stmt.close(); } catch(java.sql.SQLException e) { // Handle exceptions for executeQuery and getString: } Asimismo, para realizar una operacin de escritura en la base de datos, se crea un objeto Statement a partir del objeto Connection. El objetoStatement tiene mtodos para ejecutar consultas SQL y actualizaciones en una base de datos. Las actualizaciones y consultas se encuentran en una cadena que contiene el comando SQL de una operacin de escritura que se utiliz en el mtodo executeUpdate del objeto Statement para devolver un objeto ResultSet.
Una clase SqlConnection. Una consulta, como una clase SqlCommand. Un conjunto de resultados, como una clase DataTable. .NET Framework proporciona DataAdapter, que rene estos tres objetos, de la siguiente forma: El objeto SqlConnection se establece mediante la propiedad de conexin del objeto DataAdapter. La consulta que se ejecutar se especifica con la propiedad SelectCommand de DataAdapter. El objeto DataTable se crea utilizando el mtodo Fill del objeto DataAdapter. El objeto DataTable contiene los datos del conjunto de resultados devueltos por la consulta. Puede recorrer en iteracin el objeto DataTable para tener acceso a las filas de datos usando la coleccin de filas. Para compilar y ejecutar el cdigo, necesita lo que se indica a continuacin; de lo contrario, se produce un error en la lneadatabaseConnection.Open(); y se produce una excepcin. Microsoft Data Access Components (MDAC) versin 2.7 o posterior. Si utiliza Microsoft Windows XP o Windows Server 2003, ya dispone de MDAC 2.7. Sin embargo, si utiliza Microsoft Windows 2000, es posible que tenga que actualizar la versin de MDAC instalada en el equipo. Para obtener ms informacin, vea MDAC Installation. Tener acceso a la base de datos Northwind de SQL Server y privilegios de seguridad integrados para el nombre de usuario actual que ejecuta el cdigo en un servidor SQL Server local con la base de datos de ejemplo Northwind instalada. C# // Sample C# code accessing a sample database // You need: // A database connection // A command to execute // A data adapter that understands SQL databases // A table to hold the result set namespace DataAccess { using System.Data; using System.Data.SqlClient; class DataAccess { //This is your database connection: static string connectionString = "Initial Catalog=northwind;Data Source=(local);Integrated Security=SSPI;"; static SqlConnection cn = new SqlConnection(connectionString); // This is your command to execute: static string sCommand = "SELECT TOP 10 Lastname FROM Employees ORDER BY EmployeeID"; // This is your data adapter that understands SQL databases: static SqlDataAdapter da = new SqlDataAdapter(sCommand, cn);
// This is your table to hold the result set: static DataTable dataTable = new DataTable(); static void Main() { try { cn.Open(); // Fill the data table with select statement's query results: int recordsAffected = da.Fill(dataTable); if (recordsAffected > 0) { foreach (DataRow dr in dataTable.Rows) { System.Console.WriteLine(dr[0]); } } } catch (SqlException e) { string msg = ""; for (int i=0; i < e.Errors.Count; i++) { msg += "Error #" + i + " Message: " + e.Errors[i].Message + "\n"; } System.Console.WriteLine(msg); } finally { if (cn.State != ConnectionState.Closed) { cn.Close(); } } } } }
4.2 Creacin de una base de datos y tablas USE master GO CREATE DATABASE tonysk8shop ON ( NAME = tonysk8shop_data, FILENAME = 'C:\PRACTICAS\tonysk8shop_data.mdf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB ) LOG ON ( NAME = DBPractica_log, FILENAME ='C:\PRACTICAS\tonysk8shop_log.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB) CREATE TABLE dbo.Clientes ( IDCliente int NOT NULL PRIMARY KEY, Nombre varchar(24) NOT NULL, ApellidoP varchar(50) NOT NULL, APellidoM varchar(50) NOT NULL, Calle varchar(75) NOT NULL, Numero int NOT NULL, Colonia varchar(75) NOT NULL, Telefono int NOT NULL, Edad int NOT NULL, Genero varchar(1) NOT NULL, Facebook varchar(70) NOT NULL, ) CREATE TABLE dbo.Compras ( IDCliente int constraint fk_Compras_Cliente foreign key (IDCliente) references dbo.Clientes(IDCliente), ClaveProducto int constraint fk_Productos_Cliente foreign key(ClaveProducto) references dbo.Productos(ClaveProducto), FolioCompra int NOT NULL PRIMARY KEY, Fecha date NOT NULL, Cantidad int NOT NULL, PrecioUNitario money NOT NULL, Total money NOT NULL, ) CREATE TABLE dbo.Productos (
ClaveProducto int NOT NULL PRIMARY KEY, Marca varchar(30) NOT NULL, Medida float NOT NULL, Precio money NOT NULL, Cantidad int NOT NULL, )
4.3.-MANIPULACIN DE LOS DATOS Lenguaje de Manipulacin de Datos (Data Manipulation Language, DML) es un lenguaje proporcionado por el sistema de gestin de base de datos que permite a los usuarios de la misma llevar a cabo las tareas de consulta o manipulacin de los datos, organizados por el modelo de datos adecuado. El lenguaje de manipulacin de datos ms popular hoy da es SQL, usado para recuperar y manipular datos en una base de datos relacional. Otros ejemplos de DML son los usados por bases de datos IMS/DL1, CODASYL u otras. Son DML: Select, Insert, Delete y Update Se clasifican en dos grandes grupos: Lenguajes procedimentales. En este tipo de lenguaje el usuario da instrucciones al sistema para que realice una serie de procedimientos u operaciones en la base de datos para calcular un resultado final. Lenguajes de consulta no procedimentales. En los lenguajes no procedimentales el usuario describe la informacin deseada sin un procedimiento especfico para obtener esa informacin.
INSERT Para introducir datos nuevos en una base de datos vamos a utilizar la orden INSERT de SQL. Con la sintaxis que se muestra a continuacin seremos capaces de introducir datos nuevos en cualquiera de las tablas que componen una determinada BD. En principio, veremos la expresin mnima de la orden, formada por dos clusulas, INTO y VALUES. INSERT INTO nombreTabla VALUES (listaExpresiones) DELETE La sentencia DELETE nos permite borrar las filas contenidas en una tabla. DELETE [FROM] nombreTabla [WHERE condicin] La sentencia UPDATE nos permite modificar la informacin contenida en una tabla. UPDATE
ndice Unidad V Acceso a datos 5.1. Definicin conceptual de componentes, paquetes/libreras 5.2 Uso de libreras proporcionadas por el lenguaje 5.3. Creacin y uso de paquetes/libreras definidas por el usuario 5.4 Concepto de hilo 5.5 Creacin y control de hilos 5.6 Sincronizacin de hilos
Un paquete en Java es lo que su nombre lo indica, un paquete o conjunto de clases, lgicamente, que tienen cosas en comn. Lgicamente un programado puede agruparlas con o sin criterio, pero lo ideal es que se dediquen a funciones especficas. Tambin los paquetes definen una jerarqua de directorios, que permiten igualmente agrupas las clases, cosa de desplegar los archivos mas ordenadamente. LIBRERAS La utilizacin de objetos dinmicos supone dejar pendiente en el montaje de la aplicacin el enlace de dichos objetos. Cuando la aplicacin est en ejecucin, y slo entonces, se produce el enlace (dinmico) con los objetos contenidos en la librera. La creacin de libreras dinmicas corre a cargo del enlazador o montador (en nuestro caso el ld) aunque tambin es posible indicar al compilador las opciones necesarias para el montaje y de ese modo, ser l quien se encargue de pasrselas al montador. Cuando se crea un objeto dinmico es necesario que dicho cdigo objeto sea independiente de la posicin, para conseguir este tipo de cdigo debe especificarse al compilador la opcin -fPIC (Position IndependentCode). Dicho flag debe indicarse tanto en la compilacin como en el montaje de la librera. Para montar los objetos es necesario adems indicar la opcin -shared para que el resultado sea un fichero objeto compartible.
5.2.-USO DE COMPONENTES (VISUALES Y NO VISUALES) PROPORCIONADOS POR EL LENGUAJE Un componente desde el punto de vista de programacin est compuesto por varias secciones y el conjunto de todas ellas dan lugar a la creacin de dicho componente. Por tanto, primero para no perder el norte, vamos a empezar definiendo el convenio que es utilizado para organizar dichas secciones por TinyOs. En general, un componente posee tres grandes secciones que son: Configuration, Implementation, Module. Estas tres secciones han de estar obligatoriamente presentes en cualquier componente aunque puedan estar vacas. El estndar de T i n y O s determina, que las secciones de Configuration e Implementatin han de ir en un fichero que recibir el nombre del componente con la extensin .nc y la tercera seccin de Module deber de ir en otro fichero aparte que recibir el nombre del componente concatenado con un M mayscula (la M da el significado al fichero, es el significado de Module) , este ltimo fichero tambin poseer a extensin .nc. Otra buena costumbre consiste en crear un fichero de header o cabecera con extensin .h que contenga todas las enumeraciones, registros o tipos de datos creados por el usuario de los que
hace uso la aplicacin, y cuando se realiza esto la forma de ligar dicho fichero con los otros dos es utilizando al principio de los otros fichero la directiva include sheader; aunque como mencin especial decir que si nos fijamos mejor en este directiva se puede ver que no se incorpora la extensin .h en la misma. Ahora que ya sabes cuales son las secciones que va a contener cada fichero vamos a empezar a explicar cada una de ellas. Implementatin. Esta seccin se va a encargar de definir las conexiones que hay entre los diferentes componentes que utiliza la aplicacin, esto es debido a que si recordamos un poco, se ha comentado que la programacin de un componente (que se llevar a cabo en la seccin de module) se hace utilizando interfaces y dichas interfaces para poder utilizar las que ha de proporcionar un componente, entonces bsicamente es esta seccin se definen cules son los componentes que proporcionan las interfaces a nuestra aplicacin (por lo general sern componentes primitivos). Una vez que conocemos la finalidad de esta seccin y llegados a este punto, vamos a insertar un concepto nuevo que es la diferencia que existe entre una aplicacin que est ya disponible para ser ejecutada en un sensor y un componente cualquiera. La diferencia es muy poca, y consiste en que una aplicacin es un componente como cualquier cosa en este lenguaje que en su seccin de implementacin hace uso de un componente especial denominado Main.
Los paquetes son grupos de clases relacionadas; ayudan a organizar su cdigo y proporcionan otra capa encapsulamiento. En programacin, los paquetes, con frecuencia son tiles para agrupar las piezas relacionadas de un programa. Un paquete sirve para dos propsitos: primero, suministra un mecanismo por el cual piezas relacionadas de un programa pueden ser organizadas como una unidad. Se debe tener acceso a las clases definidas dentro de un paquete a travs de su nombre de paquete. As, un paquete proporciona la manera de nombrar una coleccin de clases. Segundo, un paquete participa en los mecanismos de control de acceso en java. Las clases definidas dentro de un paquete pueden hacerse privadas a ese paquete y no accesibles por cdigo fuera del paquete. De este modo, el paquete suministra un medio por el cual las clases pueden ser encapsuladas.
DEFINIR UN PAQUETE: Todas las clases en Java pertenecen a algn paquete. Como se mencion anteriormente, cuando no se especifica la declaracin package se usa el paquete predeterminado (o global). Adems, el paquete predeterminado no tiene nombre, lo que lo hace transparente. Aunque el paquete predeterminado es vlido para programas de prueba cortos, es inadecuado para aplicaciones reales. Para crear un paquete, coloque un comando package en la parte superior del archivo fuente de java. Las clases declaradas dentro de ese archivo pertenecern al paquete especificado. Puesto que un paquete define un espacio de nombre, los nombres de las clases que coloque dentro del archivo se convierten en parte de ese espacio del nombre del paquete. La siguiente es la forma general de la declaracin package: packagepkg; Aqu, pkg es el nombre del paquete. Por ejemplo, el siguiente enunciado crea un paquete de nombre Project1. package Project1; Java usa el sistema de archivo para manejar los paquetes con cada paquete almacenado en su propio directorio. Por ejemplo, los archivos .class para las clases que usted declare sean partes de Project1 debe guardarse en un directorio llamado Project1.
5.4 CONCEPTO DE HILO El multihilo soportado en Java gira alrededor del concepto de hilo. La cuestin es, qu es un hilo? De forma sencilla, un hilo es un nico flujo de ejecucin dentro de un proceso. Pero ser mejor comenzar desde el principio y explicar qu es un proceso. Un proceso es un programa ejecutndose dentro de su propio espacio de direcciones. Java es un sistema multiproceso, esto significa que soporta varios procesos corriendo a la vez dentro de sus propios espacios de direcciones. Estamos ms familiarizados con el trmino multitarea, el cual describe un escenario muy similar al multiproceso. Por ejemplo, consideremos la cantidad de aplicaciones que corren a la vez dentro de un mismo entorno grfico. Mientras escribo esto, est corriendo Microsoft Word adems de Internet Explorer, Windows Explorer, CD Player y el Volumen Control. Estas aplicaciones son todos procesos ejecutados dentro de Windows 95. De esta forma, se puede pensar que los procesos son anlogos a las aplicaciones o a programas
aislados, pero cada proceso tiene asignado espacio propio de ejecucin dentro del sistema. Un hilo es una secuencia de cdigo en ejecucin dentro del contexto de un proceso. Los hilos no pueden ejecutarse ellos solos; requieren la supervisin de un proceso padre para correr. Dentro de cada proceso hay varios hilos ejecutndose. Por ejemplo, Word puede tener un hilo en background chequeando automticamente la gramtica de lo que estoy escribiendo, mientras otro hilo puede estar salvando automticamente los cambios del documento en el que estoy trabajando. Como Word, cada aplicacin (proceso) puede correr varios hilos los cuales estn realizando diferentes tareas. Esto significa que los hilos estn siempre asociados con un proceso en particular. Los hilos a menudo son conocidos o llamados procesos ligeros. Un hilo, en efecto, es muy similar a un proceso pero con la diferencia de que un hilo siempre corre dentro del contexto de otro programa. Por el contrario, los procesos mantienen su propio espacio de direcciones y entorno de operaciones. Los hilos dependen de un programa padre en lo que se refiere a recursos de ejecucin. La siguiente figura muestra le relacin entre hilos y procesos.
5.5.-CREACION Y CONTROL DE HILOS En Java, los hilos comparten el mismo espacio de memoria. Incluso comparten gran parte del entorno de ejecucin, de modo que la creacin de nuevos hilos es mucho ms rpida que la creacin de nuevos procesos. La ventaja que proporcionan los hilos es la capacidad de tener ms de un camino de ejecucin en un mismo programa. As, con un nico proceso, ejecutndose una JVM (Java Virtual Machine), habr siempre ms de un hilo, cada uno con su propio camino de ejecucin. En cuanto al proceso de creacin de hilos, son dos los mecanismos que nos permiten llevarlo a cabo en Java: implementando la interfaz Runnable, o extendiendo la clase Thread, esto es,
creando una subclase de esta clase. Lo ms habitual es crear hilos implementando la interfaz Runnable, dado que las interfaces representan una forma de encapsulamiento del trabajo que una clase debe realizar. As, se utilizan para el diseo de requisitos comunes a todas las clases que se tiene previsto implementar. La interfaz define el trabajo, la funcionalidad que debe cubrirse, mientras que la clase o clases que implementan la interfaz realizan dicho trabajo (cumplen esa funcionalidad). Todas las clases o grupos de clases que implementen una cierta interfaz debern seguir las mismas reglas de funcionamiento. El otro mecanismo de creacin de hilos, como ya hemos dicho, consistira en la creacin previa de una subclase de la clase Thread, la cual podramos instanciar despus. Por ejemplo, class MiThread extends Thread { public void run() { ... } } se corresponde con la declaracin de un clase, MiThread, que extiende la clase Thread, sobrecargando el mtodo Thread.run heredado con su propia implementacin. Arranque de un hilo En el contexto de las aplicaciones, sabemos que es main la primera funcin que se invoca tras arrancar, y por tanto, lgicamente, es el lugar ms apropiado para crear y arrancar otros hilos. La lnea de cdigo: t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) ); siendo TestTh una subclase de la clase Thread (o una clase que implemente la interfaz Runnable) crea un nuevo hilo. Los dos argumentos pasados, sin mayor relevancia, satisfarn el prototipo del constructor de la clase y se utilizarn para la inicializacin del objeto. Al tener control directo sobre los hilos, tenemos que arrancarlos explcitamente. Como ya se coment anteriormente, es la funcin miembro start la que nos permite hacerlo. En nuestro ejemplo sera: t1.start(); start, en realidad es un mtodo oculto en el hilo que llama al mtodo run.
5.6.-SINCRONIZACION DE HILOS Cuando dos o ms hilos necesitan acceder de manera simultnea a un recurso de datos compartido necesitan asegurarse de que slo uno de ellos accede al mismo cada vez. Java proporciona un soporte nico, el monitor, es un objeto que se utiliza como cerrojo exclusivo. Solo uno de los hilos puede ser el propietario de un monitor en un instante dado. Los restantes hilos que estuviesen intentando acceder al monitor bloqueado quedan en suspenso hasta que el hilo propietario salga del monitor.
Todos los objetos de Java disponen de un monitor propio implcitamente asociado a ellos. La manera de acceder a un objeto monitor es llamando a un mtodo marcado con la palabra clave synchronized. Durante todo el tiempo en que un hilo permanezca en un mtodo sincronizado, los dems hilos que intenten llamar a un mtodo sincronizado sobre la misma instancia tendrn que esperar. Para salir del monitor y permitir el control del objeto al siguiente hilo en espera, el propietario del monitor slo tiene que volver del mtodo La sentencia synchronized Si se utiliza una clase que no fue diseada para accesos multihilo y, por ello, dispone de mtodos no sincronizados que manipulan el estado interno, puede envolver la llamada al mtodo en un bloque sincronizado. El formato general de la sentencia sincronizada es el siguiente: synchronized(objeto) sentencia; En el ejemplo, objeto es cualquier referencia al objeto, y sentencia suele ser un bloque que incluye una llamada al mtodo de objeto, que solo tendr lugar una vez que el hilo haya entrado con xito en el monitor de objeto. Ahora veremos las formas de sincronizacin con un ejemplo: class Callme { void call (String msg) { * tambin poda haber puesto synchronized antes de void * System.out.print("[" + msg); try Thread.sleep(1000); catch (Exception e); System.out.println("]"); } } class caller implements Runnable { String msg; Callme target; public caller(Callme t, String s) { target = t; msg = s; new Thread(this).start(); } public void run() { synchronized(target) { target.call(msg); } } } class Synch { public static void main(String args[]) { Callme target = new Callme(); new caller(target, "Hola"); new caller(target, "Mundo"); new caller(target, "Sincronizado"); } }
Este programa imprime por pantalla el literal "Hola Mundo Sincronizado", cada palabra en una lnea y entre comillas, se crea una instancia de Callme y tres instancias de caller que cada una de ellas referencia al mismo Callme con lo que necesitamos de una sincronizacin para el acceso a Callme, pues sino se mezclaran las tres llamada al haber una sentencia sleep que retrasa la ejecucin de Callme dando lugar a que antes de que acabe un proceso deje libre el acceso a dicho objeto.