archivos y base de datos en c#

Upload: hector-silva-millan

Post on 06-Apr-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 Archivos y Base de Datos en C#

    1/26

    Material preparado por Rodrigo Sandoval U en Mayo 2004

    PONTIFICIA UNIVERSIDAD CATLICA DE CHILEESCUELA DE INGENIERADEPARTAMENTO DE CIENCIA DE LA COMPUTACIN

    IIC 1102 INTRODUCCIN A LA PROGRAMACINProfesor: Rodrigo Sandoval U.

    Captulo IX Archivos en C# y Bases de Datos

    1 LECTURA Y ESCRITURA DE ARCHIVOS DE TEXTO.....................................................................................1

    1.1 STREAMS ...............................................................................................................................................................11.1.1 Lectura de Archivos ......................................................................................................................................1

    1.2 USING SYSTEM.IO .................................................................................................................................................21.3 CONTROL DE ERRORES ..........................................................................................................................................21.4 LECTURA: STREAMREADER...................................................................................................................................2

    1.4.1 Constructores de StreamReader....................................................................................................................21.4.2 Lectura con StreamReader............................................................................................................................3 1.4.3 Ejemplo: Lectura de un Archivo de Texto, mostrando contenido en pantalla ..............................................31.4.4 Ejemplo: Procesamiento de Operaciones Matemticas en Archivo .............................................................4

    1.5 ESCRITURA: STREAMWRITER ................................................................................................................................61.5.1 Constructores de StreamWriter.....................................................................................................................61.5.2 Escritura con StreamWriter ..........................................................................................................................61.5.3 Ejemplo: Lectura y Escritura de un Archivo.................................................................................................7

    2 BASES DE DATOS...................................................................................................................................................10

    2.1 CONCEPTOS BSICOS DE BASES DE DATOS .........................................................................................................102.1.1 Base de Datos..............................................................................................................................................10 2.1.2 Sistema de Administracin de Base de Datos .............................................................................................102.1.3 Elementos relacionados a una Base de Datos.............................................................................................10 2.1.4 EJEMPLO.....................................................................................................................................................0

    2.2 MODELOS DE BASES DE DATOS ...........................................................................................................................122.2.1 Esquema de Archivos ..................................................................................................................................12 2.2.2 Modelo Jerrquico ......................................................................................................................................12 2.2.3 Modelo Relacional ......................................................................................................................................13 2.2.4 Modelo Distribuido .....................................................................................................................................15 2.2.5 Modelo de BD Orientado a Objeto .............................................................................................................15 2.2.6 BD Multidimensional ..................................................................................................................................15

    2.3 PROGRAMACIN DE BASES DE DATOS CON C# ....................................................................................................162.3.1 Ejemplo: Programa de Registro de Alumnos..............................................................................................16

  • 8/3/2019 Archivos y Base de Datos en C#

    2/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 1

    1 Lectura y Escritura de Archivos de TextoEn todos los programas, la manera de almacenar y recuperar informacin que perdure en el tiempo se basa

    en el uso de memoria secundaria, compuesta esencialmente por discos (diskettes, discos duros, CD, DVD,etc.) y ocasionalmente cintas. En cualquiera de estos medios, la unidad de almacenamiento de informacinse denomina archivo.

    Al igual que prcticamente todos los lenguajes de programacin, C# ofrece el acceso a leer y escribirarchivos en disco, por medio de estructuras especialmente definidas. En el caso de este lenguaje Orientado aObjeto, las estructuras consisten en clases de caractersticas y mtodos particulares, que resuelven laproblemtica general de acceso a los archivos, permitiendo desarrollar programas que los utilicen comofuente de informacin y medio de almacenamiento de informacin de largo plazo.

    1.1 Streams

    Un stream es como se denomina a un objeto utilizado para transferir datos. Estos datos pueden sertransferidos en dos posibles direcciones:

    - Si los datos son transferidos desde una fuente externa al programa, entonces se habla de leerdesde el stream.

    - Si los datos son transferidos desde el programa a alguna fuente externa, entonces se habla deescribir al stream.

    Frecuentemente, la fuente externa ser un archivo, pero eso no necesariamente es el caso, por lo que elconcepto es utilizado ampliamente con fuentes de informacin externas de diversos tipos. Algunas otrasposibilidades fuera de los archivos incluyen:

    - Leer o escribir datos a una red utilizando algn protocolo de red, donde la intencin es que estosdatos sean recibidos o enviados por otro computador.

    - Lectura o escritura a un rea de memoria.

    - La Consola- La Impresora

    - Otros ...

    Algunas clases que C# provee para resolver este acceso a fuentes diversas incluyen las clases de tipoReadery Writer.

    1.1.1 Lectura de Archivos

    Las clases ms relacionadas con la escritura y lectura de archivos (File Input/Output o File I/O) son:

    - FileStream, cuyo propsito es lectura y escritura de datos binarios (no de texto legible), a cualquierarchivo de tipo binario, aunque se puede utilizar para acceder a cualquier tipo de archivo, inclusive

    los de texto.- StreamReader y StreamWriter, las cuales estn diseadas para lectura y escritura de archivos de

    texto. Estas clases se asumen como de un nivel ms alto que FileStream.

    Una observacin acerca de la declaracin de nombres/rutas de archivos en C#. Usualmente, la ruta de unarchivo contiene el carcter \, que en C# se utiliza como caracter de control para smbolos especiales (comoel cambio de lnea: \n). Sin embargo, entendiendo que no es el mismo sentido el que se le quiere dar en lainterpretacin de rutas de archivos (por ej: C:\Mis documentos\Programas\ejemplo.cs), se utiliza unasintaxis particular, anteponiendo el smbolo @ antes del string con la ruta del archivo. Es decir:

    string rutaarchivo = @C:\Temp\archivo.txt;

  • 8/3/2019 Archivos y Base de Datos en C#

    3/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 2

    Esta declaracin evita la interpretacin de los dos caracteres \ como smbolos especiales y el string quedacorrectamente inicializado.

    1.2 Using System.IOPara el uso de estas clases, es necesario referenciar el uso del namespace System.IO, ya que System nocontiene los elementos para el manejo de archivos. Por ello, los programas con acceso a archivos debenincluir la lnea:

    using System.IO;

    1.3 Control de Errores

    Si bien en una serie de instrucciones de ejecucin en lenguaje C# se pueden producir errores importantes,particularmente cuando hay input del usuario que debera tener cierta forma o valores, o en clculosmatemticos (especficamente evitando divisiones por cero), es factible en C# tener cierto control sobre elcomportamiento del programa ante dichas situaciones.

    Esencialmente, el bloque try-catch persigue precisamente tener cierto control sobre lo que el programa haren caso de producirse un error.

    public int division(int n1, int n2) {

    int resultado = 0;

    try {

    resultado = n1/n2;

    }

    catch(Exception e) {

    Console.WriteLine("Error en la divisin de {0}/{1}\n\n{2}",n1, n2,

    e.ToString());

    }

    }

    1.4 Lectura: StreamReader

    La ventaja de esta clase es que hace una operacin sobre archivos que resulta muy natural al momento deutilizarla.

    1.4.1 Constructores de StreamReader

    El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para lectura:

    StreamReader sr = new StreamReader(@C:\Temp\archivo.txt);

    Sin embargo, reconociendo que hoy existen diferentes formatos (codificaciones) de archivos de texto y nosolamente el tradicional formato ASCII, es factible establecer cul es la codificacin especial que este archivo

    de texto plano puede tener. Los formatos posibles son: ASCII, Unicode, UTF7, UTF8, BigEndianUnicode.El constructor ad-hoc es:

    StreamReader sr = new StreamReader(@C:\Temp\file.txt, Encoding.UTF8Encoding);

    En trminos prcticos, nos ser necesario recurrir a este tipo de codificaciones, ya que usualmente setrabajar con codificacin ASCII.

    El constructor deja abierto el stream para poder recuperar la informacin del archivo desde la instancia deStreamReader declarada. Para cerrar un stream o archivo, se invoca el mtodo Close():

    sr.Close();

  • 8/3/2019 Archivos y Base de Datos en C#

    4/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 3

    1.4.2 Lectura con StreamReader

    Son bsicamente tres los mtodos propios de StreamReader que permiten efectuar lectura desde el stream(archivo) declarado.

    1.4.2.1 ReadLine()

    Al igual que el conocido Console.ReadLine(), este mtodo lee una lnea completa de un archivo de textohasta el cambio de lnea ms prximo. Al igual que su equivalente de consola, StreamReader.ReadLine() noincluye en el string el carcter de cambio de lnea.

    string linea = sr.ReadLine()

    1.4.2.2 ReadToEnd()

    Este mtodo, por su parte, se encarga de acumular la informacin que hay desde la lectura anterior (quepudo haberse hecho con ReadLine(), por ejemplo) hasta el final del archivo, todo en el mismo string.

    string linea = sr.ReadToEnd()

    1.4.2.3 Read ()

    Finalmente, el mtodo simple Read() se encarga de leer un caracter a la vez, lo que permite procesarsmbolo por smbolo el contenido del archivo. Convenientemente, este mtodo reconoce el cambio de lnea yse lo salta como si no existiese. Cuando se encuentra con el fin de archivo, retorna un valor 1, considerandoque su retorno es siempre un int (y no un char).

    int SigCaracter = sr.Read();

    Este mismo mtodo ofrece una declaracin alternativa (sobrecarga), donde es posible leer una cantidadespecfica de caracteres y almacenarlos en un arreglo de enteros.

    char[] CharArray = new char[100];

    int[] nChars = sr.Read(CharArray, 0, 100);nChars es un arreglo con los enteros retornados por el mtodo, y ser menor si es que la cantidad decaracteres que quedan en el archivo es menor de 100.

    1.4.3 Ejemplo: Lectura de un Archivo de Texto, mostrando contenido en pantalla

    /////////////////////////////////////////////////////////////////////////////////

    // Ejemplo de Lectura de Archivos

    /////////////////////////////////////////////////////////////////////////////////

    using System;

    using System.IO;

    class Archivo {

    StreamReader sr;

    bool abierto = false;

    // Constructor: Recibe el nombre del archivo y lo abre (con control errores)

    public Archivo(string filename) {

    try {

    sr = new StreamReader(filename);

    abierto = true;

    }

    catch(Exception e) {

    Console.WriteLine("Error en la apertura de \"{0}\": {1}",

    filename, e.ToString());

    }

  • 8/3/2019 Archivos y Base de Datos en C#

    5/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 4

    }

    public void Mostrar() {

    string linea;

    if(!abierto) return; // Si no se pudo abrir, no hay nada que leer

    linea = sr.ReadLine();

    while(linea != null) { // Lee lneas mientras haya (mientras sean !=null)

    Console.WriteLine(linea);

    linea = sr.ReadLine();

    }

    sr.Close(); abierto = false;

    }

    }

    class MainApp {

    static void Main() {string nombre;

    Console.Write("Nombre del archivo: ");

    nombre = Console.ReadLine();

    Archivo archivo = new Archivo(nombre);

    archivo.Mostrar();

    Console.ReadLine();

    }

    }

    1.4.4 Ejemplo: Procesamiento de Operaciones Matemticas en Archivo

    /////////////////////////////////////////////////////////////////////////////////

    // Ejemplo de Lectura de Archivos: Calculadora de Archivo

    // ======================================================

    // Este ejemplo muestra cmo se procesa el contenido de un archivo, que indica

    // operaciones matemticas bsicas: * / + -

    /////////////////////////////////////////////////////////////////////////////////

    using System;

    using System.IO;

    class Calculadora {

    StreamReader sr;

    bool abierto = false;

    // Constructor: Recibe el nombre del archivo y lo intenta abrir.

    // Si no puede abrirse para lectura, "abierto" queda como false

    public Calculadora(string filename) {

    try {

    sr = new StreamReader(filename);

    abierto = true;

    }

    catch(Exception e) {

    Console.WriteLine("Error en la apertura de \"{0}\": {1}",

    filename,e.ToString());

    }

    }

  • 8/3/2019 Archivos y Base de Datos en C#

    6/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 5

    // Operacion: Recibe la operacin y dos nmeros en forma de string.// Retorna el resultado (int) de la operacin entre ambos nmeros.

    int Operacion(string op, string n1, string n2) {

    switch(op) {

    case "+": return( int.Parse(n1) + int.Parse(n2));case "-": return( int.Parse(n1) - int.Parse(n2));

    case "*": return( int.Parse(n1) * int.Parse(n2));

    case "/": return( int.Parse(n1) / int.Parse(n2));

    }

    return(0);

    }

    // Procesar: lee lneas del archivo abierto, procesando el contenido en forma de operaciones.

    // Observaciones: al finalizar se cierra el stream. No se valida el formato de c/lnea.

    public void Procesar() {

    string linea;

    string[] elementos;

    if(!abierto) return; // Si no se pudo abrir, no hay nada que leer

    linea = sr.ReadLine();

    while(linea != null) {

    // Para poder usar Split(), las operaciones y los operandos deben

    // venir separados por espacios.

    elementos = linea.Split();

    Console.WriteLine("{0} = {1}", linea,

    Operacion(elementos[1], elementos[0], elementos[2]));

    linea = sr.ReadLine();

    }

    sr.Close(); abierto = false;

    }

    }

    class MainApp {

    static void Main() {

    string nombre;

    Console.Write("Nombre del archivo: ");

    nombre = Console.ReadLine();

    Calculadora c = new Calculadora(nombre);

    c.Procesar();

    Console.ReadLine();

    }

    }

    Ejemplo de Ejecucin:

    Tomando el siguiente archivo de operaciones calculos.txt:

    4 + 45 * 6

    8 - 2

    6 / 3

    Resulta el siguiente output:

    Nombre del archivo: calculos.txt

    4 + 4 = 8

    5 * 6 = 30

    8 - 2 = 6

    6 / 3 = 2

  • 8/3/2019 Archivos y Base de Datos en C#

    7/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 6

    1.5 Escritura: StreamWriter

    Esta clase funciona prcticamente de la misma manera que StreamReader, excepto que su propsito esnicamente para escribir dentro de un archivo (u otro stream). Es relevante distinguir que en este caso, elproceso de apertura para escritura considera que:

    - Si el archivo no existe lo crea vaco para comenzar a escribir.

    - Si el archivo ya existe, lo deja vaco para comenzar a escribir.

    - Si el archivo ya existe, es posible abrirlo en forma Append (agregar) para escribir al final.

    1.5.1 Constructores de StreamWriter

    El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para escritura.

    StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt);

    Este constructor asume por defecto el formato UTF8 de archivos planos, ya que es el manejado por .NET.

    Sin embargo, existe el constructor equivalente que permite abrir un archivo especificando otra codificacin dearchivo plano, por ejemplo ASCII.

    StreamWriter sw = new StreamWriter (@C:\doc\file.txt, Encoding.ASCII);

    Un tercer constructor utiliza como segundo parmetro un boolean que indica si el archivo debe ser abiertopara Agregar, es decir, en un modo Append.

    StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt, true);

    De la misma manera que en el caso de la lectura, para cerrar un stream o archivo, se invoca el mtodoClose:

    sw.Close();

    1.5.2 Escritura con StreamWriter

    Son bsicamente dos los mtodos propios de StreamWriter que permiten escribir hacia el stream (archivo)declarado y son los mismos que se usan para escribir en la consola: Write() y WriteLine().

    1.5.2.1 WriteLine()

    Totalmente equivalente a Console.WriteLine(), se utiliza la misma idea, y el mismo formato, sabiendo que seestar escribiendo el texto no a la consola, sino que al stream abierto con el constructor.

    string linea = Texto de prueba;

    sw.WriteLine(linea);

    sw.WriteLine(Los valores posibles son: {0} y {1}, 3, 5);

    1.5.2.2 Write ()

    Tambin presente, el mtodo simple Write(), permite escribir texto en el stream, de la misma forma que suequivalente mtodo de la clase Console. En este caso se reconocen las siguientes alternativas de uso:

    Imprimir un string

    string linea = Texto de prueba;

    sw.Write(linea);

  • 8/3/2019 Archivos y Base de Datos en C#

    8/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 7

    Imprimir un caracter

    char caracter = T;

    sw.Write(caracter);Imprimir un arreglo de caracteres

    char[] caracteres = new char[100];

    for(int i=0; i

  • 8/3/2019 Archivos y Base de Datos en C#

    9/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 8

    nombrearchivo2,e.ToString());}

    }

    }

    // Operacion: Recibe la operacin y dos nmeros en forma de string.

    // Retorna el resultado (int) de la operacin entre ambos nmeros.

    int Operacion(string op, string n1, string n2) {

    switch(op) {

    case "+": return( int.Parse(n1) + int.Parse(n2));

    case "-": return( int.Parse(n1) - int.Parse(n2));

    case "*": return( int.Parse(n1) * int.Parse(n2));

    case "/": return( int.Parse(n1) / int.Parse(n2));

    }

    return(0);

    }

    // Procesar: lee el archivo abierto, lnea por lnea,

    // procesando el contenido en forma de operaciones y escribiendo// el resultado en un segundo archivo.

    // Observaciones: Al finalizar se cierran los dos streams.

    // No se valida el formato de c/lnea.

    public void Procesar() {

    string linea, linea2;

    string[] elementos;

    // Si no se pudo abrir, no se podr leer ni escribir

    if(!abierto1 || !abierto2) return;

    Console.WriteLine("Procesando ...");

    linea = sr.ReadLine();

    while(linea != null) {

    elementos = linea.Split();

    // ahora graba los resultados en el segundo archivolinea2 = linea + " = " +

    Operacion(elementos[1], elementos[0], elementos[2]).ToString();

    sw.WriteLine(linea2);

    linea = sr.ReadLine();

    }

    sr.Close(); abierto1 = false;

    sw.Close(); abierto2 = false;

    Console.WriteLine("Listo");

    }

    }

    class MainApp {

    static void Main() {string nombre;

    Console.Write("Nombre del archivo: ");

    nombre = Console.ReadLine();

    Calculadora c = new Calculadora(nombre);

    c.Procesar();

    Console.ReadLine();

    }

    }

    Al abrir el archivo calculos.txt, se crea el archivo calculos.out.txt con el siguiente contenido:

  • 8/3/2019 Archivos y Base de Datos en C#

    10/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 9

    4 + 4 = 8

    5 * 6 = 30

    8 - 2 = 6

    6 / 3 = 2

  • 8/3/2019 Archivos y Base de Datos en C#

    11/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 10

    2 Bases de DatosUno de los grandes objetivos de la computacin es la capacidad de procesar datos: muchos datos, en forma

    rpida, eficiente, y segura (confiable). Esto no era posible con mtodos manuales tradicionales. Hoy en daexisten muchas aplicaciones computacionales, pero para este contexto se vuelven muy importantes aquellasque trabajan directamente con la administracin de datos.

    2.1 Conceptos Bsicos de Bases de Datos

    Para la realidad computacional de nuestros das, es necesario definir dos elementos puntuales que existenen todo gran o pequeo sistema que maneje cantidades de datos: la Base de Datos (BD) y el SistemaAdministrador de Base de Datos (DBMS).

    2.1.1 Base de Datos

    Se puede definir como Una coleccin estructurada y organizada de datos y de otros objetos que

    permiten trabajar con esos datos. Si se habla de bolsn de datos, no se incluye un concepto de ordeno estructuracin. Una base de datos tiene una estructura claramente definida, sin importar el nivel decomplejidad de esta estructura. Tradicionalmente, los datos se manejan en estructuras uniformes, que sepueden comparar con planillas de datos. Es decir, una base de datos contiene varias planillas de datosdiversos, que pueden a su vez estar relacionados o no.

    2.1.2 Sistema de Administracin de Base de Datos

    Se puede definir como Un elemento capaz de manejar los datos contenidos en una Base de Datos atravs de operaciones claramente establecidas. Si la Base de Datos contiene los objetos quecorresponden a los datos y otras estructuras adicionales, el DBMS (Data Base Manager System) se encargade accesar esos datos, utilizando operaciones bsicas como: agregar, eliminar, modificar, buscar.

    Un DBMS es un grupo de programas que se encargan de administrar estas operaciones y todos loselementos que facilitan su ejecucin.

    2.1.3 Elementos relacionados a una Base de Datos

    Al trabajar con los datos de una BD, se deben mantener elementos que apoyan el acceso adecuado a lasestructuras de datos. Se distinguen:

    Planillas de datos: tablas que contienen filas, cada una representa un objeto de un tipo comnpara las filas de la tabla, que a su vez se compone de varios atributos o propiedades que seordenan en las columnas de la planilla.

    Registro: una fila de una tabla. Representa un objeto de un tipo definido y se compone deatributos.

    Campos: son precisamente la definicin de estos atributos de la tabla o planilla.

    Llave Primaria: es una parte de los campos de un registro que permite distinguirlo en forma nicadel resto de registros adicionales.

    Indices: al igual que el ndice de un libro, un ndice de una BD, que se asocia a una sola tabla,referencia la posicin de un registro dentro de una tabla, de acuerdo a un orden predefinido.

    Vistas: son ngulos de la BD. Al igual que una persona puede ver un auto desde el exterior, locual constituye la vista externa del vehculo, existe otra vista interior, y por su parte el objetovehculo posee muchas propiedades o atributos que no son visibles en algunas vistas.

  • 8/3/2019 Archivos y Base de Datos en C#

    12/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 0

    2.1.4 EJEMPLO

    En una Compra-Venta de autos usados se manejan los datos de los vehculos existentes en el momento.Para poder utilizar informacin adecuada, se entiende que un auto es un objeto de tipo vehculo, y como talposee ciertas caractersticas determinables: Marca y Modelo, Patente, Nmero de Puertas, Cilindraje, Color.Aplicando los conceptos mencionados de Bases de Datos:

    Planilla de Datos o Tabla

    Marca y Modelo Patente N Puertas Cilindraje Color

    Suzuki Samurai HK-2367 3 1200 Azul

    Subaru Impreza JG-2304 4 1800 Blanco

    Chevrolet Cavalier LM-3948 4 1600 Rojo

    Toyota Corolla TF-3404 4 1800 Gris

    Toyota Corolla HK-2376 4 1600 Verde

    Chevrolet Cavalier BC-2340 4 1600 Rojo

    Llave Primaria

    La llave primaria se obtiene al seleccionar una combinacin de campos cuyos valores combinados no serepitan para ms de un registro. En este caso, podemos ver que el N de puertas es repetido, al igual que elcolor y el cilindraje. La marca y el modelo tambin se repiten, pero claramente ningn auto posee la mismapatente de otro. Entonces la Patente es la candidata ideal para ser una llave Primaria.

    Indice

    Puede ser relevante ordenar la lista de autos por orden alfabtico de la Marca+Modelo. Es decir, el ndicesera el que se ve a continuacin:

    Chevrolet Cavalier BC-2340

    Chevrolet Cavalier LM-3948

    Subaru Impreza JG-2304

    Suzuki Samurai HK-2367

    Toyota Corolla HK-2376

    Toyota Corolla TF-3404

    Campos

    Registro

  • 8/3/2019 Archivos y Base de Datos en C#

    13/26

  • 8/3/2019 Archivos y Base de Datos en C#

    14/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 13

    N Curso T tulo Descr ipcin

    CURSO

    REQUISITON Cu rso T tulo

    DICTARDa Hora Sala

    NombreN Profesor

    PROFESOR ALUMNO

    N Alumno Nombr e N ota

    Este modelo muestra una realidad de una universidad, donde se dictan cursos de distinto tipo que tienenprerrequisitos, profesor (o profesores) que dicta(n) el curso, y alumnos que lo toman. Se distinguen algunoselementos como N Alumno como identificador de alumno. Un ejemplo puntual de este modelo podra darsecon los siguientes datos:

    AN-21 Computacin II Computacin orientada a....

    AN-11 Computacin I

    Mircoles 19:00 N7

    2 3 Prez1023 Alv arez 5, 8

    1293 Ba rrios 5, 4

    987 Cabrera 6,2

    El primer sistema que existi con esta esquema fue el IMS (Information Managment System) desarrollado en1960. Este fue el precursor que fue aprovechado en la NASA en la dcada de los 60, en particular en elproyecto Apollo. Luego apareci System 2000 desarrollado por Intel.

    Una de las grandes ventajas de este sistema fue la posibilidad de estructurar datos en una forma mscompleta que el esquema de archivos simples. An as, se vi en aprietos al momento de representarsituaciones donde la naturaleza de los datos implicaba una doble jerarqua, o al momento de consultar sobredatos particulares.

    2.2.3 Modelo Relacional

    Fruto del trabajo de E.F. Codd, y sus publicaciones de la dcada de los 70, naci el System R queimplementaba un modelo bautizado como Relacional. La gran caracterstica de este modelo es que las tablas

    que manejaba representaban entidades, que en la realidad tenan ciertos vnculos entre ellas. Estos vnculosson conocidos como relaciones.

    2.2.3.1 Tipos de Relaciones

    Al identificar dos o ms entidades que estn vinculadas, se distingue una relacin. Esta puede tener distintacardinalidad, lo que se refiere a las repeticiones que se encuentran del vnculo. Supongamos lasentidades del ejemplo de cursos en una universidad: curso, profesor, alumno. Cada curso puede ser dictadopor uno o ms profesores, asisten varios alumnos a ese curso, los cules, a su vez asisten a otros cursos.

  • 8/3/2019 Archivos y Base de Datos en C#

    15/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 14

    2.2.3.2 Relacin 1 a 1

    Cuando dos entidades se relacionan en forma nica. Por ejemplo, si se diera como restriccin que cadacurso es dictado por un solo profesor, entonces Profesor es 1 a 1 a Curso.

    2.2.3.3 Relacin 1 a N

    Cuando dos entidades se relacionan de modo que una se relaciona varias veces con la otra. Por ejemplo,cada curso debe dictarse en una nica sala (1), pero en una sala se dictan varios cursos (a distintas horasobviamente), entonces Curso es 1 a N a Sala.

    2.2.3.4 Relacin N a N

    Cuando dos entidades se relacionan en forma abierta, es decir muchos de un tipo se relacionan conmuchos del otro. Por ejemplo, los alumnos toman varios cursos y a su vez cada curso integra a variosalumnos, entonces Alumno es N a N a Curso.

    Este modelo de BD se desarroll fuertemente en los 80 y sigue siendo hasta hoy muy utilizado en forma

    comercial y universal.Otro de los grandes aportes desde el punto de vista de la ciencia que se hizo con este modelo es el lgebrarelacional, donde en una manera formal se pueden establecer las relaciones entre las distintas entidades ycules son las caractersticas de estas relaciones.

    2.2.3.5 Formas Normales

    Para asegurar consistencia de los datos, integridad, y evitar redundancia y otras anomalas que algunosesquemas de datos proveen, en el modelo relacional es posible disear un esquema de tablas y relacionesque para un caso puntual pueda asegurar de mejor manera esa integridad y consistencia.

    Esta definicin se hace a travs de Formas Normales, las cules definen ciertas reglas que deben cumplir losregistros de cada tabla para asegurar estas caractersticas.

    Existen las formas Normales: 1NF, 2NF, 3NF y BCNF. Cada una de estas establece ciertas caractersticasque permiten mejorar la consistencia de datos, y la integridad.

    Por ejemplo, en el ejemplo de los Cursos de la Universidad, es posible definir un esquema de datos quemaneje todos los datos de una manera muy rudimentaria. De esa manera se tendra una tabla como lasiguiente:

    N Curso Ttulo Descripcin Nombre Prof. Sala Da Hora Alumno Nota

    AN-21 C. II Compu.... Prez N7 Mie 19:00 Alvarez 5,6

    AN-21 C. II Compu.... Prez N7 Mie 19:00 Barrios 5,8

    AN-21 C. II Compu.... Prez N7 Mie 19:00 Cabrera 6,2

    Despus de aplicar ciertas reglas los datos podran guardarse en varias tablas. En el esquema rudimentariorecin mostrado, se pueden producir los siguientes problemas:

    - Redundancia: el curso, su profesor y la sala se repiten para cada alumno del curso.

  • 8/3/2019 Archivos y Base de Datos en C#

    16/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 15

    - Inconsistencia: es posible que en el primer registro diga AN-21 con Prez como profesor, pero en el 2.Registro puede decir AN-21, con Snchez como profesor. No hay cmo saber cul es el correcto.

    - Problemas de insercin. Si agrego un nuevo alumno debo repetir todos los datos.

    - Problemas de eliminacin. Si elimino todos los registros de los alumnos (es decir, este curso no tuvoalumnos), entonces se pierde la informacin del profesor que haba sido designado.

    En el esquema relacional adecuado, aplicando algn nivel de formas normales se pueden evitar todos estosproblemas definiendo tablas separadas, usualmente distinguiendo entidades distintas, y relaciones mscomplejas (N a N).

    2.2.4 Modelo Distribuido

    A veces aplicable a varias de las estructuras existentes, la idea del modelo distribuido es repartir los datos endistintas tablas que estn ubicadas en distintas posiciones en una red de computadores. Este esquema se

    hace necesario cuando la administracin compartida y global de la informacin consume demasiadosrecursos: canal de comunicacin de red, espacio en discos de los computadores, etc. Lo que se busca coneste esquema es repartir los datos de manera que el trfico de datos por la red se vea disminuido, a la vezque se permite que cada unidad que solicita datos a esta BD distribuida, pueda obtenerlos adecuadamente.

    2.2.5 Modelo de BD Orientado a Objeto

    Buscando mejorar el rendimiento de un DBMS ante eventuales bsquedas complejas de informacin de laBD, se diseo la BD OO (Orientada a Objetos). En ella, cada entidad se distingue como un obejto que tienePropiedades, Atributos (Campos) y Operaciones definidas que accesan esta informacin.

    2.2.6 BD Multidimensional

    Con el creciente desarrollo de las aplicaciones computacionales orientadas a dar informacin de alto nivel, esdecir, informacin que ha pasado por varias etapas de proceso desde el detalle de los datos, se handesarrollados esquemas que son capaces de contestar complejas preguntas que requieren de valores a unalto nivel de agregacin de los datos originales. Cuando se habla de la gestin de una empresa, hoy en dase habla de obtener informacin desde los datos originales que permitan tomar decisiones de acuerdo alcomportamiento del negocio reflejado por los datos analizados en diversas dimensiones.

    En palabras ms simples, cuando se requieren analizar los datos de ventas de productos de una fbrica,tanto por lnea de producto, o distribucin geogrfica, o travs del tiempo, es necesario tener parte de losdatos ya digeridos. Si se intenta hacer sumas de detalles de facturas emitidas para obtener la informacin,segn un esquema relacional, la respuesta demorar largo tiempo en llegar, dependiendo de la cantidad dedatos existentes.

    Una BD multidimensional utiliza un esquema en que los datos han sido procesados (sumados, recalculadostotales, etc.) hasta cierto nivel y se organizan de acuerdo a las dimensiones relevantes del negocio. Estopermite contestare con buena eficiencia complejas preguntas, como tendencias, etc., pero imposibilita poderanalizar una factura en particular (datos a gran nivel de detalle).

  • 8/3/2019 Archivos y Base de Datos en C#

    17/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 16

    2.3 Programacin de Bases de Datos con C#

    Si bien hoy existen numerosas tecnolgicas maduramente desarrolladas para administrar datos en Bases de

    Datos, incluyendo lenguajes de manejo especializados, como es el SQL, es factible hacer programas queincluyan el manejo simple de informacin en archivos de datos de formato definido y acotado.

    En la gran mayora de estos programas, se define lo que se conoce como una capa lgica, que se conformade clases que representan los datos almacenados en las diferentes tablas (o archivos), de modo que el restodel programa slo conoce la forma lgica de estas clases, y desconoce el formato de las tablas o archivos.

    2.3.1 Ejemplo: Programa de Registro de Alumnos

    Definicin del Problema

    En este ejemplo, se considera un almacenamiento de datos en archivos para poder hacer el registro dealumnos en cursos para semestres especficos. Pensando en un modelo estilo Relacional, se determinan lassiguientes entidades de informacin relevantes:

    - El alumno, detallado con nombre, apellido, N alumno (nico), fecha nacimiento (forma ddmmaaaa), yedad.

    - El curso dictado, identificado por su sigla (nica), su descripcin, y la cantidad de crditos.

    - La inscripcin, que relaciona un alumno (identificado por su N) con un curso (identificado por su sigla),asociado a un semestre en particular (de la forma aaaan, donde aaaa es el ao y n el semestre).

    En este caso particular, se requiere permitir las siguientes operaciones:

    - Ingresar un nuevo alumno

    - Ingresar un nuevo curso

    - Inscribir un alumno en un curso, en un semestre particular- Mostrar todos los cursos

    - Mostrar todos los alumnos

    - Mostrar todas las inscripciones realizadas

    - Leer los datos de los archivos correspondientes

    - Guardar los datos de los archivos correspondientes.

    Elementos Involucrados: la lista de alumnos, la lista de cursos, y la lista de inscripciones.

    Conceptualizacin de la Solucin

    Para este programa se requiere implementar las entidades: Lista de Alumnos, Lista de Cursos, Inscripciones.Las clases necesarias para implementar estas entidades son las siguientes:

    - Alumno y ListaAlumnos

    - Curso y ListaCursos

    - Inscripcin y ListaInscripciones

    Clase Alumno: contiene los datos bsicos de cada alumno y propiedades que permiten acceder a ellos

    Clase ListaAlumnos: maneja un conjunto de alumnos, permitiendo cargar y guardar datos de y hacia unarchivo de texto con un formato especfico y adecuado. Adicionalmente permite operaciones como: AgregarAlumnos, Mostrar los Alumnos registrados, Buscar un Alumno en particular.

  • 8/3/2019 Archivos y Base de Datos en C#

    18/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 17

    Las clases Curso, ListaCurso, Inscripcion, y ListaInscripciones ofrecen elementos equivalentes, cada una ensu propio contexto de informacin a manejar.

    Adicionalmente, en la clase principal ofrece mtodos para la manipulacin general de los datos, como son:

    - Men de opciones

    - Creacin de un nuevo Alumno, preguntando sus datos

    - Creacin de un nuevo Curso, preguntando sus datos

    - Registro de una nueva inscripcin, preguntando y validando el curso y el alumno correspondiente.

    Algoritmo Principal

    1. Crear las instancias de las listas de datos Leer los archivos con datos

    2. Repetir mientras la opcin seleccionada no sea Salir

    a. Mostrar Men de Opcionesb. Preguntar opcin

    c. Si la opcin no es Salir

    i. Ejecutar Opcin

    3. Grabar datos en archivos desde las listas

    Limitaciones

    El programa no hace todas las validaciones de datos ingresados por el usuario, pero particularmente requierelo siguiente:

    - Las descripciones de cursos deben ser un nico string sin espacios entre medio.

    - Los nombres y apellidos no pueden ser compuestos (o al menos, no separados por espacios)

    - Slo se maneja un nmero limitado de alumnos, un nmero limitado de cursos, y un nmero limitado deinscripciones

    - Si bien se valida la existencia de los archivos antes de leerlos, se muestra un mensaje en pantalladerivado del registro de error de la plataforma .NET.

    Cdigo Fuente de la Solucin

    /////////////////////////////////////////////////////////////////////////////////

    // Ejemplo de Manejo de Datos en Archivos - Inscripcin de Alumnos en Cursos// =========================================================================

    /////////////////////////////////////////////////////////////////////////////////

    using System;

    using System.IO; // Namespace de clases StreamReader y StreamWriter, para archivos

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------

    // Clase Curso: representa un curso con sus atributos bsicos

    //------------------------------------------------------------------------

    class Curso {

    string sigla, descripcion;

    int creditos;

  • 8/3/2019 Archivos y Base de Datos en C#

    19/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 18

    public Curso(string s, string d, int c) {sigla = s.ToUpper(); descripcion = d.ToUpper(); creditos = c;

    }

    public string Sigla { get { return(sigla); } }public string Descripcion { get { return(descripcion); } }

    public int Creditos { get { return(creditos); } }

    }

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------

    // Clase ListaCursos: representa un conjunto de cursos

    //------------------------------------------------------------------------

    class ListaCursos {

    Curso[] cursos; // Almacena la lista de cursos

    int cantidad = 0;

    const int MAX = 20; // Limitacin: 20 cursos mx

    string archivo = "cursos.dat";

    // ------------------------------------------------------------------

    // Constructor: dimensiona la lista de alumnos en MAX

    public ListaCursos() { cursos = new Curso[MAX]; } // Limitacin: 20 cursos mx

    // ------------------------------------------------------------------

    // Constructor: dimensiona la lista de cursos en MAX

    // y carga los datos de archivo identificado por su nombre

    public ListaCursos(string filename) {

    StreamReader fr;

    cursos = new Curso[MAX];

    archivo = filename;

    try {

    fr = new StreamReader(archivo);

    } catch(Exception e) { //OJO: esta lnea indicar warning: no se usa e

    // No se pudo abrir: se creaStreamWriter sw = new StreamWriter(archivo);

    sw.Close();

    return;

    }

    string linea;

    linea = fr.ReadLine();

    while(linea != null) {

    string[] datos = linea.Split();

    // Formato del archivo tiene: creditos sigla descripcin

    Agregar(datos[1].ToUpper(), datos[2].ToUpper(), int.Parse(datos[0]));

    linea = fr.ReadLine();

    }

    fr.Close();

    }

    // ----------------------------------------------------------------------------

    // Guardar(): guarda datos en estructura al archivo identificado por su nombre

    public bool Guardar() {

    StreamWriter fw;

    try {

    fw = new StreamWriter(archivo);

    } catch(Exception e) {

    Console.WriteLine("Error en la apertura de \"{0}\": {1}",

    archivo,e.ToString());

    return (false);

    }

    for(int i=0; i

  • 8/3/2019 Archivos y Base de Datos en C#

    20/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 19

    cursos[i].Creditos, cursos[i].Sigla, cursos[i].Descripcion);

    fw.Close();

    return (true);

    }

    // ------------------------------------------------------------------

    // Agregar(): agrega un curso dado a la lista

    // Parmetros: Curso c, el curso a agregar

    public void Agregar(Curso c) { if(cantidad

  • 8/3/2019 Archivos y Base de Datos en C#

    21/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 20

    public string FechaNac { get { return(fechanac); } }public int Numero { get { return(numero); } }

    }

    //------------------------------------------------------------------------

    //------------------------------------------------------------------------

    // Clase ListaAlumnos: representa un conjunto de alumnos

    //------------------------------------------------------------------------

    class ListaAlumnos {

    Alumno[] alumnos; // Almacena la lista de alumnos

    int cantidad = 0;

    const int MAX = 20; // Limitacin: 20 alumnos mx

    string archivo = "alumnos.dat";

    // ------------------------------------------------------------------

    // Constructor: dimensiona la lista de alumnos en MAX

    public ListaAlumnos(){ alumnos = new Alumno[MAX]; } // Limitacin: 20 alumnos mx

    // ------------------------------------------------------------------// Constructor: dimensiona la lista de alumnos en MAX

    // y carga los datos de archivo identificado por su nombre

    public ListaAlumnos(string filename) {

    StreamReader fr;

    alumnos = new Alumno[MAX];

    archivo = filename;

    try {

    fr = new StreamReader(archivo);

    } catch(Exception e) { //OJO: esta lnea indicar warning: no se usa e

    // No se pudo abrir: se crea

    StreamWriter sw = new StreamWriter(archivo);

    sw.Close();

    return;

    }

    string linea;linea = fr.ReadLine();

    while(linea != null) {

    string[] datos = linea.Split();

    // Formato del archivo tiene: num fecha nombre apellido

    Agregar(int.Parse(datos[0]), datos[2], datos[3], datos[1]);

    linea = fr.ReadLine();

    }

    fr.Close();

    }

    // --------------------------------------------------------------------------------

    // Guardar(): guarda datos en la estructura al archivo identificado por su nombre

    public bool Guardar() {

    StreamWriter fw;

    try {fw = new StreamWriter(archivo);

    } catch(Exception e) {

    Console.WriteLine("Error en la apertura de \"{0}\": {1}",

    archivo,e.ToString());

    return (false);

    }

    for(int i=0; i

  • 8/3/2019 Archivos y Base de Datos en C#

    22/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 21

    }

    // ------------------------------------------------------------------

    // Agregar(): agrega un alumno dado a la lista

    // Parmetros: Alumno a, el alumno a agregarpublic void Agregar(Alumno a) { if(cantidad

  • 8/3/2019 Archivos y Base de Datos en C#

    23/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 22

    //------------------------------------------------------------------------//------------------------------------------------------------------------

    // Clase ListaInscripciones: representa un conjunto de inscripciones

    //------------------------------------------------------------------------

    class ListaInscripciones {Inscripcion[] inscripciones; // Almacena la lista de inscripciones

    int cantidad = 0;

    const int MAX = 60; // Limitacin: 60 inscripciones mx

    string archivo = "inscripciones.dat";

    // ------------------------------------------------------------------

    // Constructor: dimensiona la lista de inscripciones en MAX

    public ListaInscripciones() { inscripciones = new Inscripcion[MAX]; }

    // ------------------------------------------------------------------

    // Constructor: dimensiona la lista de inscripciones en MAX

    // y carga los datos de archivo identificado por su nombre

    public ListaInscripciones(string filename) {

    StreamReader fr;

    inscripciones = new Inscripcion[MAX];archivo = filename;

    try {

    fr = new StreamReader(archivo);

    } catch(Exception e) { //OJO: esta lnea indicar warning: no se usa e

    // No se pudo abrir: se crea

    StreamWriter sw = new StreamWriter(archivo);

    sw.Close();

    return;

    }

    string linea;

    linea = fr.ReadLine();

    while(linea != null) {

    string[] datos = linea.Split();

    // Formato del archivo tiene: sigla numero semestre

    Agregar(datos[0].ToUpper(), int.Parse(datos[1]), int.Parse(datos[2]));linea = fr.ReadLine();

    }

    fr.Close();

    }

    // -------------------------------------------------------------------------------

    // Guardar(): guarda datos en la estructura al archivo identificado por su nombre

    public bool Guardar() {

    StreamWriter fw;

    try {

    fw = new StreamWriter(archivo);

    } catch(Exception e) {

    Console.WriteLine("Error en la apertura de \"{0}\": {1}",

    archivo,e.ToString());

    return (false);}

    for(int i=0; i

  • 8/3/2019 Archivos y Base de Datos en C#

    24/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 23

    public void Agregar(Inscripcion i) {if(cantidad

  • 8/3/2019 Archivos y Base de Datos en C#

    25/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 24

    do {Console.Write("Fecha Nac (ddmmaaaa): ");

    fechanac = Console.ReadLine();

    } while (!ValidarFecha(fechanac));

    Console.Write("Numero: "); numero = int.Parse(Console.ReadLine());

    return(new Alumno(numero, nombre, apellido, fechanac));

    }

    static Curso NuevoCurso() {

    string sigla, descripcion;

    int creditos;

    Console.WriteLine("Datos del nuevo curso");

    Console.Write("Sigla: "); sigla = Console.ReadLine();

    Console.Write("Descripcin: "); descripcion = Console.ReadLine();

    Console.Write("Crditos: "); creditos = int.Parse(Console.ReadLine());

    return(new Curso(sigla, descripcion, creditos));

    }

    // --------------------------------------------------------------------------

    // NuevaInscripcion(): Crea una nueva inscripcin relacionando un alumno existente

    // con un curso que tambin debe ser existente.

    // Observaciones: Se le pide al usuario slo el N del alumno y la sigla del curso,

    // validando que ambos existan.

    static Inscripcion NuevaInscripcion(ListaAlumnos la, ListaCursos lc) {

    string sigla;

    int numero, semestre;

    Alumno a; Curso c;

    // Muestra listas en pantalla para ayudar al usuario a indicar datos.

    la.Mostrar(); lc.Mostrar();

    Console.WriteLine("Inscripcin de Curso:");

    do {Console.Write("N Alumno: ");

    numero = int.Parse(Console.ReadLine());

    } while( la.Buscar(numero)

  • 8/3/2019 Archivos y Base de Datos en C#

    26/26

    intro. Prog. Orientada a Objeto Archivos y B. de Datos Rodrigo Sandoval U.

    IIC 1102 Pgina: 25

    "Inscribir en Curso", "Mostrar Alumnos",

    "Mostrar Cursos", "Mostrar Inscripciones","Salir" };

    int opcion = 0;

    const string archivocursos = "cursos.dat";

    const string archivoalumnos = "alumnos.dat";

    const string archivoinscripciones = "inscripciones.dat";

    ListaCursos lc = new ListaCursos(archivocursos);

    ListaAlumnos la = new ListaAlumnos(archivoalumnos);

    ListaInscripciones li = new ListaInscripciones(archivoinscripciones);

    do {

    opcion = Menu(opciones);

    switch(opcion) {

    case 1: la.Agregar(NuevoAlumno()); break;

    case 2: lc.Agregar(NuevoCurso()); break;

    case 3: li.Agregar(NuevaInscripcion(la,lc));break;case 4: la.Mostrar(); break;

    case 5: lc.Mostrar(); break;

    case 6: li.Mostrar(la,lc); break;

    }

    } while(opcion!=7);

    lc.Guardar();

    la.Guardar();

    li.Guardar();

    }

    }

    Instrucciones de compilacin.

    Para compilar este ejemplo, se debe copiar el cdigo en un archivo .cs y compilarlo individualmente. En esteproceso aparecern 3 warnings relacionados los bloques try-catch de los constructores de las listas definidas,en especfico, indicando que la variable e no es utilizada. Se puede modificar ese bloque para utilizarlacomo parte de un mensaje adecuado, pero no es necesario en estricto rigor.

    Instrucciones de ejecucin.

    Para ejecutar correctamente este ejemplo, los archivos alumnos.dat, cursos.dat, e inscripciones.dat deebenestar ubicados en la misma carpeta del ejecutable, o bien no existir, y sern creados en dicha ubicacin.