Vous êtes sur la page 1sur 132

Microsoft C# - Archivo de datos

CAPTULO 1
ARCHIVOS DE DATOS DE
ACCESO DIRECTO CON C#

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 1

Microsoft C# - Archivo de datos

ARCHIVOS DE DATOS

El almacenamiento en variables, objetos, arreglos o colecciones de datos es temporal; los


datos se pierden cuando una variable local queda fuera del alcance o cuando la aplicacin
llega a su trmino. {Las computadoras utilizan archivos de datos para la retencin a largo
plazo de grandes cantidades de datos, incluso hasta despus de que terminan las
aplicaciones que crean esos datos. Se denominan datos persistentes a aquellos que duran
ms all de la duracin de la ejecucin de la aplicacin. Las computadoras almacenan
archivos en dispositivos de almacenamiento secundario como disco duros, USB, discos
pticos y cintas magnticas, entre otros.
El procesamiento de archivos es una de las herramientas ms importantes que debe
tener un lenguaje de programacin para soportar las aplicaciones comerciales que
generalmente procesan grandes cantidades de datos persistentes. C# posee pose
poderosas caractersticas de procesamiento de archivos de datos, las cuales permiten a
una aplicacin leer y escribir datos en memoria interna y/o memoria externa o en
archivos a travs de la red. Entre las operaciones que se pueden realizar con archivos de
datos tenemos:
Agregar registros de datos (Alta)
Eliminar registros de datos (Baja)
Acceder a registros, siguiendo algn mtodo (secuencial, directo, secuencial indexado,
etc)
Consultar la informacin almacenada en los registros de datos (Consulta)
Modificar la informacin de los registros de datos (Modificacin)

ORGANIZACIN DE LOS ARCHIVOS DE DATOS


Los archivos de datos se organizan de la siguiente forma:
Campo

Es el agrupamiento de caracteres o nmeros para formar una palabra o una


cifra completa, como el cdigo o nombre de un producto.
Registro
Es un grupo de campos relacionados considerados como una unidad.
Archivo/tabla Es un grupo de registros relacionados del mismo tipo.
Base de datos Es un
grupo de archivos/tablas relacionados que almacenan la
informacin de una organizacin.
ORGANIZACIN SECUENCIAL
Es el mtodo para almacenar registros de datos, en el cual los registros se deben
recuperar en el mismo orden en que se almacenaron.
ORGANIZACIN DIRECTA O ALEATORIA
Es el mtodo para almacenar registros de datos en un archivo de modo que se pueda
acceder a ellos en cualquier secuencia sin importar su orden fsico real en los medios de
almacenamiento.
ORGANIZACIN SECUENCIAL INDEXADA
El mtodo utiliza un ndice de campo clave para buscar y localizar fsicamente un registro,
como pueden localizarse los temas clave en un libro. Utiliza un arreglo de ndices en la
memoria RAM donde se almacena en forma ordenada el campo clave y la direccin fsica
de los registros. Despus de operaciones de mantenimiento este arreglo de ndices puede
ser grabado en forma separada en el medio magntico para luego ser utilizado en la
prxima sesin previa carga de los ndices en la memoria RAM. Un ndice es una tabla o
lista que contiene las claves de registros con las posiciones fsicas en archivo de acceso
indexado.

JERARQUA DE DATOS
Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 2

Microsoft C# - Archivo de datos

La jerarqua se refiera a la organizacin de los datos para su almacenamiento en medios


de almacenamiento externo. La mxima jerarqua es la base de datos. Luego tenemos los
archivos de datos que se conocen tambin como tablas, los registros, los campos, los
bytes y los bits. El campo es considerado como la unidad mnima de informacin. Para
visualizar la jerarqua de datos se presenta la Figura 1.1.

Figura 1.1: Jerarqua de datos


Archivo de
producto

Base de datos

Archivo/tabla

Registro

idProducto Nombre del idMarca stockMinimo stock precio de Precio de Fecha de


producto
compra Venta
Alta
1
Camisa
1
20
25
40.00
65.00
02/04/2016
2
Polo
2
25
20
30.00
40.00
02/02/2016
idProducto Nombre del idMarca stockMinimo stock precio de Precio de Fecha de
producto
compra Venta
Alta
1
Camisa
1
20
25
40.00
65.00
02/04/2016

Campo

Nombre del
producto
Camisa

Byte

10000011

Bit

Archivo de
Marca

Letra C en ASCII

1
ARCHIVOS DE ACCESO
DIRECTO O ALEATORIO EN C# (BINARIOS)

Todos los lenguajes de programacin tienen alguna forma de interactuar con los sistemas
de archivos de datos y C# no es la excepcin. Si se est desarrollando una aplicacin C#
para uso interno, probablemente ser necesario el acceso directo a archivos. Antes de
realizar acciones sobre un archivo, necesitamos un poco de informacin sobre ese
archivo. A menudo, no se desea leer un archivo de principio a fin; sino acceder al archivo
como una base de datos, donde se salta de un registro a otro; cada uno en diferentes
partes del archivo. C# proporciona una clase RandomAccessFile para este tipo de archivo
de entrada/salida.
FLUJOS
La comunicacin entre una aplicacin y el origen o el destino de cierta informacin se
realiza mediante un flujo de informacin (stream), que no es ms que un objeto que hace
de intermediario entre la aplicacin y el origen o el destino de datos de la informacin. De
esta forma la aplicacin leer o escribir en el flujo sin importarle desde donde vienen los
datos o donde se va.
El espacio de nombres System.IO de la Biblioteca.Net contiene una coleccin de clases
que soportan estos algoritmos para leer y escribir datos. La clase System.IO permite leer
y escribir caracteres en secuencias o en grupos contiguos de datos, mediante el uso de
codificacin especfica para convertir caracteres a bytes y viceversa. La clase FileStream
subclase de Stream permite escribir y leer datos de un archivo byte a byte;
analgicamente, las clases StreamWriter y StreamReader subclases de TextWriter y

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 3

Microsoft C# - Archivo de datos

textReader permiten escribir y leer caracteres. Las clases BinaryWriter y BinaryReader


permiten escribir y leer datos de cualquier tipo primitivos en binario y cadena de
caracteres.
FLUJO DE BYTES
Los datos pueden ser escritos o ledos de un archivo byte a byte utilizando un flujo de la
clase FileStream
FileStream
Un flujo de la clase FileStream permite leer y escribir bytes en un archivo. Esta clase
adems de los mtodos que hereda de la clase Stream, proporciona el constructor
siguiente:
FileStream(string nombre, FileMode , FileAccess acceso)
El constructor abre el flujo de entrada y salida (para leer y escribir) vinculando con el
archivo especificado por el nombre y especificando el tipo de acceso (leer, escribir o leer
y escribir). El parmetro nombre es una cadena de caracteres que especifica la ruta
donde se guarda o se guardar el archivo. El parmetro modo, del tipo enumerado
FileMode, puede tomar diferentes tipos de valores. En la tabla 1.1 se muestra los tipos de
valores que puede tomar el parmetro FileMode.
Tabla 1.1: Tipo de valores del parmetro FileMode
CreateNew
Create
Open
OpenOrCrea
te
Truncate
Append
Read
ReadWrite
Write

Crear un nuevo archivo. Si el archivo existe se lanzar una excepcin del


tipo IOException
Crea un nuevo archivo. Si el archivo existe ser sobreescrito
Abre un archivo existente
Abre un archivo si existe; si no, se crea un nuevo archivo
Abre un archivo existente. Una vez abierto, el archivo ser truncado a cero
bytes de longitud
Abre un archivo para aadir datos al final del mismo si existe o crea uno
nuevo sino existe
Permite abrir un archivo para operaciones de lectura
Permite abrir un archivo para operaciones de lectura / escritura
Permite abrir un archivo para operaciones de escritura

FLUJOS DE DATOS PRIMITIVOS


Muchas aplicaciones requieren escribir en un archivo datos de tipos primitivos (bool,
double, float, long, int, short, etc) no como cadena de caracteres, sino en formato binario
para posteriormente recuperarlos como tal. Para estos casos el espacio de nombres
System.IO proporciona las clases BinaryReader y BinaryWriter, las cuales permiten leer y
escribir datos de cualquier tipo primitivo en formato binario y cadena de caracteres en
formato UTF-8. Un flujo BinaryReader slo puede leer datos almacenados en un archivo a
travs de un flujo BinaryWriter.
BinaryWriter
Un flujo de la clase BinaryWriter permite a una aplicacin escribir datos de cualquier tipo
primitivo. Se puede crear un flujo de esta clase utilizando el siguiente constructor:
BinaryWriter(Stream flujo)
Este constructor abre un flujo de salida (para escribir) hacia el archivo vinculado con otro
flujo existente de la clase Stream o de sus derivadas. Ejemplo:
public static Boolean escribirRegistro(Producto oProducto, int posicion)
{ try

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 4

Microsoft C# - Archivo de datos

{ String archivo = Properties.Settings.Default.nombreDeArchivoProducto;


int
longitudDeRegistro
=
Properties.Settings.Default.longitudDeRegistroProducto;
FileStream oFileStream = new FileStream(archivo, FileMode.OpenOrCreate,
FileAccess.ReadWrite);
BinaryWriter oBinaryWriter = new BinaryWriter(oFileStream);
oBinaryWriter.BaseStream.Seek(posicion
*
longitudDeRegistro,
SeekOrigin.Begin);
oBinaryWriter.Write(oProducto.idProducto);
oBinaryWriter.Write(oProducto.nombreDelProducto);
oBinaryWriter.Write(oProducto.idMarca);
oBinaryWriter.Write(oProducto.stockMinimo);
oBinaryWriter.Write(oProducto.stock);
oBinaryWriter.Write(oProducto.precioDeCompra);
oBinaryWriter.Write(oProducto.precioDeVenta);
oBinaryWriter.Write(oProducto.fechaDeAlta);
oBinaryWriter.Close();
oFileStream.Close();
return true;
}
catch (Exception e)
{ MessageBox.Show("No se pudo grabar el registro ... error de tipo " + e);
return false;
}
}
Los mtodos ms utilizados de esta clase se resumen en la Tabla 1.2:
Tabla 1.2: Resumen del Mtodo Write
Write (byte)
Write (byte[])
Write (char)
Write (char[])
Write (short)
Write (int)
Write (long)
Write
(Decimal)
Write (float)
Write
(double)
Write (string)
BaseStream()
Close
Flush
Seek

Escribe
Escribe
Escribe
Escribe
Escribe
Escribe
Escribe

un valor de tipo byte


una cadena como una secuencia de bytes
un valor de tipo char
una cadena como una secuencia de caracteres
un valor de tipo short
un valor de tipo int
un valor de tipo long

Escribe un valor de tipo Decimal


Escribe un valor de tipo float
Escribe un valor de tipo double
Escribe una cadena de caracteres en formato UTF-8; el primer byte o los
dos primeros bytes especifican el nmero de bytes de datos escritos a
continuacin
Obtiene el flujo subyacente (fs en la figura anterior)
Cierra el flujo y libera los recursos adquiridos
Limpia el buffer asociado con el flujo
Establece movimiento del puntero de Lectura/Escritura en el flujo

BinaryReader
Un flujo de la clase BinaryReader, permite a una aplicacin leer datos de cualquier archivo
datos de tipo primitivos escritos por un flujo de la clase BinaryWriter. Se puede crear un
flujo de esta clase utilizando el siguiente constructor:
BinaryReader(Stream flujo)

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 5

Microsoft C# - Archivo de datos

Este constructor abre un flujo de entrada (para leer) desde el archivo vinculando con otro
flujo existente de la clase Stream o de sus derivadas. Ejemplo:
public static Producto leerRegistro(Producto oProducto, int posicion)
{ string archivo = Properties.Settings.Default.nombreDeArchivoProducto;
int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistroProducto;
FileStream oFileStream = new FileStream(archivo, FileMode.Open, FileAccess.Read);
BinaryReader oBinaryReader = new BinaryReader(oFileStream);
oBinaryReader.BaseStream.Seek(posicion * longitudDeRegistro, SeekOrigin.Begin);
oProducto = new Producto( oBinaryReader.ReadInt32(),
oBinaryReader.ReadString(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadDouble(),
oBinaryReader.ReadDouble(),
oBinaryReader.ReadString()
);
oBinaryReader.Close();
oFileStream.Close();
return oProducto;
}
Los mtodos ms utilizados de la clase BinaryReader se resumen en la Tabla 1.3.
PROPIEDADES Y MTODO PARA ACCESO ALEATORIO
La clase FileStream, que se deriva directamente de Stream, implementa las propiedades
Position y Length y el mtodo Seek que combinados entre s facilitan el acceso aleatorio a
un archivo.
Position : Devuelve la posicin actual en bytes del puntero de lectura/escritura en un
archivo
Length
: Devuelve la longitud del archivo en bytes
Seek
: Mueve el puntero de lectura/escritura a una nueva localizacin desplazada
desp bytes de la posicin pos del archivo
La posicin pos es un valor de tipo SeekOrigin que define las siguientes constantes:
Begin : Hace referencia a la primera posicin en el archivo
Current : Hace referencia a la posicin actual del puntero de lectura/escritura
End
: Hace referencia a la ltima posicin en el archivo.
Tabla 1.3: Resumen de la clase BinaryReader
ReadByte
ReadBytes
ReadChar
ReadChars
ReadInt16
ReadInt32
ReadInt64
ReadDecimal
ReadSingle
ReadDouble
ReadString
BaseStream
Close

Devuelve un valor de tipo byte


Devuelve un valor de tipo byte[ ]
Devuelve un valor de tipo char
Devuelve un valor de tipo char[ ]
Devuelve en valor de tipo short
Devuelve un valor de tipo int
Devuelve un valor de tipo long
Devuelve un valor de tipo decimal
Devuelve una valor de tipo float
Devuelve un valor de tipo double
Devuelve una cadena de caracteres en formato UTF-8; el primer o dos
primeros bytes especifican el nmero de bytes de datos que sern
ledos a continuacin
Obtiene el flujo subyacente
Cierra el flujo y libera los recursos adquiridos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 6

Microsoft C# - Archivo de datos


PeekChar

Obtiene el siguiente carcter sin extraerlo

A continuacin se presenta un ejemplo de una aplicacin que administra un archivo de


acceso aleatorio que tiene las siguientes caractersticas:
a)Presenta un formulario para un Sistema de Mantenimiento ABCM de productos.
b)La letra ABCM significan Altas, Bajas, Consultas y Modificacin respectivamente.
c) La estructura de la clase Alumno es la siguiente:
public int
idProducto
public string
nombreDelProducto
public int
idMarca
public int
stockMinimo
public int
stock
public double precioDeCompra
public double precioDeVenta
public string fechaDeAlta
d) La longitud del registro es 150 bytes.
e) Utiliza una clase de acceso a datos (DAO) que permite interactuar la aplicacin con el
archivo de datos almacenado externamente.
f) Utiliza un clase denominada ABCMAction para almacenar las constantes de las
operaciones posibles.
g) La Figura 1.2 visualiza el diagrama de clases de clase de la aplicacin ejemplo.
h) En la Figura 1.3, Figura 1.4, Figura 1.5, Figura 1.6, Figura 1.7, Figura 1.8 y Figura 1.9 se
visualizan los formularios de la aplicacin ejemplo.
i) La Figura 1.10 visualiza la aplicacin en el Explorador de Soluciones.
J) La Figura 1.11 visualiza las propiedades seteadas para la aplicacin.
k) La Figura 1.12 presenta el cdigo de la aplicacin ABCMAction
l) La Figura 1.13 presenta el cdigo de la aplicacin Programa principal.
m)La Figura 1.14 presenta el cdigo de la aplicacin Clase Alumno.
n) La Figura 1.15 presenta el cdigo de la aplicacin Clase Alumno DAO.
o) La Figura 1.16 presenta Cdigo de la aplicacin Clase FormularioABCM
Figura 5.2: Diagrama de clases

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 7

Microsoft C# - Archivo de datos

Figura 1.3: Formulario Sistema de Mantenimiento ABCM de alumnos No action

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 8

Microsoft C# - Archivo de datos

Figura 5.4: Formulario Sistema de Mantenimiento ABCM de alumnos Action InsertarBuscar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 9

Microsoft C# - Archivo de datos

Figura 1.5: Formulario Sistema de Mantenimiento ABCM de alumnos Action InsertarGuardar

Figura 5.6: Formulario Sistema de Mantenimiento ABCM de alumnos Action ModificarGuardar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 10

Microsoft C# - Archivo de datos

Figura 5.7: Formulario Sistema de Mantenimiento ABCM de alumnos Action ModificarConfirmar

Figura 5.8: Formulario Sistema de Mantenimiento ABCM de alumnos Consultar registro

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 11

Microsoft C# - Archivo de datos

Figura 5.9: Formulario Sistema de Mantenimiento ABCM de alumnos Eliminar - Confirmar

Figura 5.10: Aplicacin en el Explorador de soluciones

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 12

Microsoft C# - Archivo de datos

Figura 5.11: Propiedades seteadas para la aplicacin

Figura 5.12: Cdigo de la aplicacin ABCMAction


namespace ABCMyDAO
{ public class ABCMAction
{ public static int NO_ACTION
= 1;
public static int ACTION_BUSCAR
= 2;
public static int ACTION_INSERTAR
= 3;
public static int ACTION_MODIFICAR = 4;
public static int ACTION_CANCELAR
= 5;
public static int ACTION_ELIMINAR
= 6;
public static int ACTION_CONSULTA = 7;
}
}
Figura 5.13: Cdigo de la aplicacin Programa principal
using System;
using System.Windows.Forms;
namespace ABCMyDAO
{ static class Program
{[STAThread]
static void Main()
{ Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormularioAlumnoABCM());
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 13

Microsoft C# - Archivo de datos

}
}
Figura 5.14: Cdigo de la aplicacin Clase Alumno
namespace ProyectoProducto
{ public class Producto
{ public int
idProducto
{ get; set; }
public string nombreDelProducto { get; set; }
public int
idMarca
{ get; set; }
public int
stockMinimo
{ get; set; }
public int
stock
{ get; set; }
public double precioDeCompra { get; set; }
public double precioDeVenta
{ get; set; }
public string fechaDeAlta
{ get; set; }
public Producto()
{ idProducto
= 0;
nombreDelProducto = "";
stockMinimo
= 0;
stock
= 0;
precioDeCompra = 0;
precioDeVenta
= 0;
fechaDeAlta
= "";
}
public Producto(int idProducto)
{ this.idProducto = idProducto;
}
public Producto( int
idProducto,
string nombreDelProducto,
int
idMarca,
int
stockMinimo,
int
stock,
double precioDeCompra,
double precioDeVenta,
string fechaDeAlta
)
{ this.idProducto
= idProducto;
this.nombreDelProducto = nombreDelProducto;
this.idMarca
= idMarca;
this.stockMinimo
= stockMinimo;
this.stock
= stock;
this.precioDeCompra
= precioDeCompra;
this.precioDeVenta
= precioDeVenta;
this.fechaDeAlta
= fechaDeAlta;
}
public override string ToString()
{ return nombreDelProducto;
}
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 14

Microsoft C# - Archivo de datos

Figura 5.15: Cdigo de la aplicacin Clase Alumno DAO


using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace ProyectoProducto
{
public class ProductoDAO
{ public static Boolean
insertarRegistro(Producto oProducto)
{
int posicion = numeroDeRegistros();
if (escribirRegistro(oProducto, posicion))
{
return true;
}
else
{
return false;
}
}
public static Producto
consultarRegistro(Producto oProducto )
{
int posicion = buscarRegistro(oProducto.idProducto);
if (posicion != -99)
{
oProducto = leerRegistro(oProducto, posicion);
return oProducto;
}
else
{
return null;
}
}
public static Boolean
modificarRegistro(Producto oProducto)
{ int posicion = buscarRegistro(oProducto.idProducto);
if (posicion != -99)
{ if (escribirRegistro(oProducto, posicion))
{ return true;
}
else
{ return false;
}
}
else
{ return false;
}
}
public static Boolean
eliminarRegistro(Producto oProducto)
{ int posicion = buscarRegistro(oProducto.idProducto);
if (posicion != -99)
{ oProducto = leerRegistro(oProducto, posicion);
oProducto.idProducto = 0;
if (escribirRegistro(oProducto, posicion))

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 15

Microsoft C# - Archivo de datos

{ return true;
}
else
{ return false;
}
}
else
{ return false;
}
}
public static int
buscarRegistro(int busqueda)
{ Producto oProducto = new Producto();
int encontrado = 0; int posicion = 0;
while (posicion < numeroDeRegistros() && (encontrado == 0))
{ oProducto = leerRegistro(oProducto, posicion);
if (busqueda == oProducto.idProducto)
{ encontrado = 1;
}
else
{ posicion = posicion + 1;
}
}
if (encontrado == 1)
{ return posicion;
}
else
{ return -99;
}
}
public static Producto leerRegistro(Producto oProducto, int posicion)
{ string archivo
= Properties.Settings.Default.nombreDeArchivoProducto;
int
longitudDeRegistro =
Properties.Settings.Default.longitudDeRegistroProducto;
FileStream oFileStream = new FileStream(archivo, FileMode.Open,
FileAccess.Read);
BinaryReader oBinaryReader = new BinaryReader(oFileStream);
oBinaryReader.BaseStream.Seek(posicion * longitudDeRegistro, SeekOrigin.Begin);
oProducto = new Producto( oBinaryReader.ReadInt32(),
oBinaryReader.ReadString(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadInt32(),
oBinaryReader.ReadDouble(),
oBinaryReader.ReadDouble(),
oBinaryReader.ReadString()
);
oBinaryReader.Close();
oFileStream.Close();
return oProducto;
}
public static Boolean escribirRegistro(Producto oProducto, int posicion)
{ try

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 16

Microsoft C# - Archivo de datos

{ String archivo = Properties.Settings.Default.nombreDeArchivoProducto;


int longitudDeRegistro =
Properties.Settings.Default.longitudDeRegistroProducto;
FileStream oFileStream = new FileStream(archivo, FileMode.OpenOrCreate,
FileAccess.ReadWrite);
BinaryWriter oBinaryWriter = new BinaryWriter(oFileStream);
oBinaryWriter.BaseStream.Seek(posicion * longitudDeRegistro,
SeekOrigin.Begin);
oBinaryWriter.Write(oProducto.idProducto);
oBinaryWriter.Write(oProducto.nombreDelProducto);
oBinaryWriter.Write(oProducto.idMarca);
oBinaryWriter.Write(oProducto.stockMinimo);
oBinaryWriter.Write(oProducto.stock);
oBinaryWriter.Write(oProducto.precioDeCompra);
oBinaryWriter.Write(oProducto.precioDeVenta);
oBinaryWriter.Write(oProducto.fechaDeAlta);
oBinaryWriter.Close();
oFileStream.Close();
return true;
}
catch (Exception e)
{ MessageBox.Show("No se pudo grabar el registro ... error de tipo " + e);
return false;
}
}
public static List<Producto> obtenerDatosEnList()
{ Producto oProducto
= new Producto();
List<Producto> oListProducto = new List<Producto>();
for (int posicion = 0; posicion < numeroDeRegistros(); posicion = posicion + 1)
{ oProducto = leerRegistro(oProducto, posicion);
if (oProducto.idProducto != 0)
{ oListProducto.Add(oProducto);
}
}
return oListProducto;
}
public static int
numeroDeRegistros()
{ string nombreDelArchivo = Properties.Settings.Default.nombreDeArchivoProducto;
int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistroProducto;
FileStream oFileStream = new FileStream(nombreDelArchivo,
FileMode.OpenOrCreate, FileAccess.Read);
int numeroDeRegistros = (int)(Math.Ceiling((double) oFileStream.Length /
(double) longitudDeRegistro));
oFileStream.Close();
return numeroDeRegistros;
}
}
}
Figura 5.16: Cdigo de la aplicacin Clase FormularioABCM

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 17

Microsoft C# - Archivo de datos

using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace ProyectoProducto
{
public partial class FormularioProductoABCM : Form
{
private int action = ABCMAction.NO_ACTION;
public FormularioProductoABCM()
{
InitializeComponent();
formatearTabla();
controladorDeEventosBotonesABCM();
actualizarDataGridViewProducto();
}
public void formatearTabla()
{
dataGridViewProducto.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewProducto.AllowUserToAddRows = false;
}
public void limpiarCuadrosDeTexto()
{
textBoxNombreDelProducto.Text = "";
textBoxIdMarca.Text = "";
textBoxStockMinimo.Text = "";
textBoxStock.Text = "";
textBoxPrecioDeCompra.Text = "";
textBoxPrecioDeVenta.Text = "";
dateTimePickerFechaDeAlta.Text = "";
}
public void ponerProducto(Producto oProducto)
{
textBoxIdProducto.Text = oProducto.idProducto + "";
textBoxNombreDelProducto.Text = oProducto.nombreDelProducto;
textBoxIdMarca.Text = oProducto.idMarca + "";
textBoxStockMinimo.Text = oProducto.stockMinimo + "";
textBoxStock.Text = oProducto.stock + "";
textBoxPrecioDeCompra.Text = oProducto.precioDeCompra + "";
textBoxPrecioDeVenta.Text = oProducto.precioDeVenta + "";
dateTimePickerFechaDeAlta.Text = oProducto.fechaDeAlta;
}
public Producto recuperarProducto(Producto oProducto)
{
oProducto.idProducto = int.Parse(textBoxIdProducto.Text);
oProducto.nombreDelProducto = textBoxNombreDelProducto.Text;
oProducto.idMarca = int.Parse(textBoxIdMarca.Text);
oProducto.stockMinimo = int.Parse(textBoxStockMinimo.Text);
oProducto.stock = int.Parse(textBoxStock.Text);
oProducto.precioDeCompra = double.Parse(textBoxPrecioDeCompra.Text);
oProducto.precioDeVenta = double.Parse(textBoxPrecioDeVenta.Text);
oProducto.fechaDeAlta = dateTimePickerFechaDeAlta.Text;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 18

Microsoft C# - Archivo de datos

return oProducto;
}
public void actualizarDataGridViewProducto()
{
limpiarDataGridViewProducto();
List<Producto> oListProducto = ProductoDAO.obtenerDatosEnList();
for (int posicion = 0; posicion < oListProducto.Count; posicion = posicion + 1)
{
dataGridViewProducto.Rows.Add(oListProducto[posicion].idProducto,
oListProducto[posicion], oListProducto[posicion].idMarca,
oListProducto[posicion].stockMinimo, oListProducto[posicion].stock,
oListProducto[posicion].precioDeCompra, oListProducto[posicion].precioDeVenta,
oListProducto[posicion].fechaDeAlta);
}
}
private void habilitarBotonesABCM(Boolean cBuscar, Boolean cNuevo, Boolean
cGuardar, Boolean cEditar, Boolean cEliminar, Boolean cConsultar, Boolean cCancelar,
Boolean cSalir)
{
buttonBuscar.Enabled = cBuscar;
buttonNuevo.Enabled = cNuevo;
buttonGuardar.Enabled = cGuardar;
buttonModificar.Enabled = cEditar;
buttonEliminar.Enabled = cEliminar;
buttonConsultar.Enabled = cConsultar;
buttonCancelar.Enabled = cCancelar;
buttonSalir.Enabled = cSalir;
}
private void habilitarCajasDeTexto(Boolean activaDesactiva)
{
textBoxNombreDelProducto.Enabled = activaDesactiva;
textBoxIdMarca.Enabled = activaDesactiva;
textBoxStockMinimo.Enabled = activaDesactiva;
textBoxStock.Enabled = activaDesactiva;
textBoxPrecioDeCompra.Enabled = activaDesactiva;
textBoxPrecioDeVenta.Enabled = activaDesactiva;
dateTimePickerFechaDeAlta.Enabled = activaDesactiva;
}
private void limpiarCajasDeTexto()
{
textBoxNombreDelProducto.Text = "";
textBoxIdMarca.Text = "";
textBoxStockMinimo.Text = "";
textBoxStock.Text = "";
textBoxPrecioDeCompra.Text = "";
textBoxPrecioDeVenta.Text = "";
dateTimePickerFechaDeAlta.Text = "";
}
private void buttonBuscar_Click(object sender, EventArgs e)
{
if (action == ABCMAction.ACTION_BUSCAR)

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 19

Microsoft C# - Archivo de datos

{
Producto oProducto = new Producto();
oProducto.idProducto = int.Parse(textBoxIdProducto.Text);
oProducto = ProductoDAO.consultarRegistro(oProducto);
if (oProducto != null)
{
MessageBox.Show("Registro existente !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
else
{
action = ABCMAction.ACTION_INSERTAR;
textBoxIdProducto.Enabled = false;
habilitarCajasDeTexto(true);
controladorDeEventosBotonesABCM();
textBoxNombreDelProducto.Focus();
}
}
else
{
if (action == ABCMAction.ACTION_CONSULTA)
{
Producto oProducto = new Producto();
oProducto.idProducto = int.Parse(textBoxIdProducto.Text);
oProducto = ProductoDAO.consultarRegistro(oProducto);
if (oProducto != null)
{
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
ponerProducto(oProducto);
}
else
{
MessageBox.Show("No se encuentra !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}
}
private void buttonNuevo_Click(object sender, EventArgs e)
{
dataGridViewProducto.Enabled = false;
textBoxIdProducto.Text = "";
limpiarCajasDeTexto();
action = ABCMAction.ACTION_BUSCAR;
controladorDeEventosBotonesABCM();
textBoxIdProducto.Enabled = true;
textBoxIdProducto.Focus();
}
private void buttonGuardar_Click(object sender, EventArgs e)
{
if (action == ABCMAction.ACTION_INSERTAR)

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 20

Microsoft C# - Archivo de datos

{
if (MessageBox.Show("Desea guardarlo?", "Confirme el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Producto oProducto = new Producto();
oProducto = recuperarProducto(oProducto);
if (ProductoDAO.insertarRegistro(oProducto))
{
MessageBox.Show("Operacin exitosa ... !!!");
}
else
{
MessageBox.Show("No se pudo guardar el registro ... !!!");
}
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewProducto();
buttonNuevo.Focus();
}
else
{
limpiarCajasDeTexto();
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewProducto();
}
}
else
{
if (action == ABCMAction.ACTION_MODIFICAR)
{
if (MessageBox.Show("Est seguro de guardar los datos?", "Confirme el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Producto oProducto = new Producto();
oProducto = recuperarProducto(oProducto);
if (ProductoDAO.modificarRegistro(oProducto))
{
MessageBox.Show("Operacin exitosa ... !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewProducto();
actualizarDataGridViewProducto();
}
else
{
MessageBox.Show("No se pudo guardar el registro ...!!!");
}
}
else
{
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 21

Microsoft C# - Archivo de datos

}
private void buttonModificar_Click(object sender, EventArgs e)
{
if (dataGridViewProducto.RowCount >= 1)
{
int filaSeleccionada = dataGridViewProducto.CurrentRow.Index;
if (filaSeleccionada != -1 && (textBoxIdProducto.Text.Length) > 0)
{
textBoxNombreDelProducto.Focus();
action = ABCMAction.ACTION_MODIFICAR;
controladorDeEventosBotonesABCM();
}
else
{
MessageBox.Show("No se ha seleccionado un registro ...!!!");
}
}
else
{
MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonEliminar_Click(object sender, EventArgs e)
{
if (dataGridViewProducto.RowCount >= 1)
{
int filaSeleccionada = dataGridViewProducto.CurrentRow.Index;
if (filaSeleccionada != -1 && (textBoxIdProducto.Text.Length) > 0)
{
if (MessageBox.Show("Est seguro de eliminar los datos?", "Confirme la
eliminacin", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Producto oProducto = new Producto();
oProducto = recuperarProducto(oProducto);
oProducto = ProductoDAO.consultarRegistro(oProducto);
if (oProducto != null)
{
if (ProductoDAO.eliminarRegistro(oProducto))
{
MessageBox.Show("Se elimin el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewProducto();
}
else
{
MessageBox.Show("No se pudo eliminar el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{
MessageBox.Show("No se pudo eliminar el registro ...!!!");

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 22

Microsoft C# - Archivo de datos

action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{
MessageBox.Show("Se tiene que seleccionar un registro ...!!!");
}
}
else
{
MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonCancelar_Click(object sender, EventArgs e)
{
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
buttonNuevo.Focus();
}
private void buttonSalir_Click(object sender, EventArgs e)
{
Dispose();
}
private void limpiarDataGridViewProducto()
{
dataGridViewProducto.Rows.Clear();
}
private void controladorDeEventosBotonesABCM()
{
if (action == ABCMAction.NO_ACTION)
{
textBoxIdProducto.Text = "";
limpiarCajasDeTexto();
textBoxIdProducto.Enabled = false;
habilitarCajasDeTexto(false);
habilitarBotonesABCM(false, true, false, true, true, true, false, true);
dataGridViewProducto.Enabled = true;
buttonNuevo.Focus();
}
else
{
if (action == ABCMAction.ACTION_BUSCAR)
{
habilitarCajasDeTexto(false);

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 23

Microsoft C# - Archivo de datos

limpiarCajasDeTexto();
habilitarBotonesABCM(true, false, false, false, false, false, true, false);
}
else
{
if (action == ABCMAction.ACTION_INSERTAR)
{
limpiarCajasDeTexto();
textBoxIdProducto.Enabled = false;
habilitarBotonesABCM(false, false, true, false, false, false, true, false);
}
else
{
if (action == ABCMAction.ACTION_MODIFICAR)
{
habilitarCajasDeTexto(true);
habilitarBotonesABCM(false, false, true, false, false, false, true, false);
textBoxIdProducto.Enabled = false;
}
else
{
if (action == ABCMAction.ACTION_ELIMINAR)
{
actualizarDataGridViewProducto();
}
else
{
if (action == ABCMAction.ACTION_CONSULTA)
{
habilitarCajasDeTexto(false);
habilitarBotonesABCM(true, false, false, false, false, false, true, false);
textBoxIdProducto.Enabled = true;
}
}
}
}
}
}
}
private void buttonConsultar_Click(object sender, EventArgs e)
{
dataGridViewProducto.ClearSelection();
limpiarCajasDeTexto();
textBoxIdProducto.Text = "";
textBoxIdProducto.Enabled = true;
textBoxIdProducto.Focus();
action = ABCMAction.ACTION_CONSULTA;
controladorDeEventosBotonesABCM();
}
private void textBoxIdProducto_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(Keys.Enter))
{

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 24

Microsoft C# - Archivo de datos

int numero = 0;
if (int.TryParse(textBoxIdProducto.Text, out numero) != true)
{
MessageBox.Show("Error de entrada de datos");
}
else
{
buttonBuscar.Focus();
}
}
}
private void dataGridViewProducto_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down)
{
int filaSeleccionada = dataGridViewProducto.CurrentRow.Index + 1;
if (filaSeleccionada >= dataGridViewProducto.RowCount)
{
filaSeleccionada = filaSeleccionada - 1;
}
else
{
Producto oProductoSeleccionado =
(Producto)dataGridViewProducto.Rows[filaSeleccionada].Cells[1].Value;
ponerProducto(oProductoSeleccionado);
}
}
if (e.KeyCode == Keys.Up)
{
int filaSeleccionada = dataGridViewProducto.CurrentRow.Index - 1;
if (filaSeleccionada <= -1)
{
filaSeleccionada = filaSeleccionada + 1;
}
else
{
Producto oProductoSeleccionado =
(Producto)dataGridViewProducto.Rows[filaSeleccionada].Cells[1].Value;
ponerProducto(oProductoSeleccionado);
}
}
}
private void dataGridViewProducto_MouseClick(object sender, MouseEventArgs e)
{
if (e.Clicks == 1 && dataGridViewProducto.RowCount >= 1)
{
int filaSeleccionada = dataGridViewProducto.CurrentRow.Index;
if (filaSeleccionada != -1)
{
Producto oProductoSeleccionado =
(Producto)dataGridViewProducto.Rows[filaSeleccionada].Cells[1].Value;
ponerProducto(oProductoSeleccionado);
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 25

Microsoft C# - Archivo de datos

}
}
private void FormularioProductoABCM_FormClosing(object sender,
FormClosingEventArgs e)
{
DialogResult dialogo = MessageBox.Show("Desea cerrar el formulario?", "Cuidado",
MessageBoxButtons.YesNo);
if (dialogo == DialogResult.No)
{
e.Cancel = true;
}
else
{
if (dialogo == DialogResult.No)
{
e.Cancel = false;
}
}
}
}
}

El cdigo de la aplicacin se presenta en el Cd que acompaa el libro con el


nombre de FormularioABCM - Archivo de datos Propiedades.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 26

Microsoft C# - Archivo de datos

CAPTULO 6
ARCHIVOS DE DATOS CON REPORTES
CON C#

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 27

Microsoft C# - Archivo de datos

ARCHIVOS DE DATOS Y REPORTES CON CRYSTAL REPORT


Crystal Reports es una aplicacin de inteligencia empresarial utilizada para disear y
generar informes desde una amplia gama de fuentes de datos (archivo de datos y bases
de datos). Varias aplicaciones, como Microsoft Visual Studio, incluyen una
versinOEM de Crystal Reports como una herramienta de propsito general para
informes/reportes. Crystal Reports se convirti en el escritor de informes estndar
cuando Microsoft lo liber con Visual Basic.
Para el desarrollo de ejemplo se utilizar la aplicacin desarrollada en el Captuo 3 Sistema de mantenimiento ABCM de alumnos por lo que no se la describir en forma
repetida. Se debe construir sistema de men principal (FormSistemaDeMenu) con las
opciones Alumnos y Reporte. La Figura 5.1 y la Figura 5.2 muestra el Formulario que
contiene el sistema de men principal con las opciones Formulario ABCM y Reporte de
alumnos. El cdigo del Formulario FormSistema de men se visualiza en la Figura 5.3.
Figura 6.1: Sistema de Men Principal Opcin Formulario ABCM

Figura 6.2: Sistema de Men Principal Opcin Reporte de alumnos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 28

Microsoft C# - Archivo de datos

Figura 6.3: Cdigo del Formulario Sistema de Men

La Figura 6.4 muestra la aplicacin en el explorador de aplicaciones. Note algunos objetos


nuevos como DataSetAlumno.xsd y CrystalReporte.rpt que son un DataSet (Conjunto de
datos) y un reporte diseado utilizando Crystal Report.
Figura 6.4: Aplicacin en el explorador de soluciones

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 29

Microsoft C# - Archivo de datos

La Figura 6.5 muestra la configuracin de proyecto, la cual tiene que ser personalizada
utilizando como versin de .NET Framework destino el .NET Framework 4

Para crear el DataSetAlumno (Conjunto de datos alumno) se debe seguir el siguiente


procedimiento:
Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar- NuevoElemento.
En la Figura 6.5 nuestra lo indicado.
Figura 6.5: Agregar nuevo elemento

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 30

Microsoft C# - Archivo de datos

Seleccione Datos Conjunto de datos. Escriba DataSetAlumno como nombre del


Conjunto de datos. En la Figura 6.6 nuestra lo indicado.
Figura 6.6: Seleccin de datos Conjunto de datos

Verifique que se muestra el diseador de DataSet. La Figura 6.7 muestra el diseador


de DataSet.
Figura 6.7: Diseador de DataSet

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 31

Microsoft C# - Archivo de datos

En el rea de diseo de DataSet haga clic derecho y seleccione del men conceptual
Agregar Tabla de datos. En la Figura 6.8 nuestra lo indicado.
Figura 6.8: Seleccin Agregar Tabla de datos

En el rea de diseo de DataSet seleccione el DataTable y haga clic derecho y


seleccione del men conceptual Agregar Columna. En la Figura 6.9 nuestra lo
indicado.
Figura 6.9: Seleccin Agregar Columna

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 32

Microsoft C# - Archivo de datos

Verifique que el diseador de DataSet se visualice como en la Figura 6.10, en la cual se


se observa que se ha creado un DataTable con dos columnas (DataComun1 y
DataColumn2)
Figura 6.10: DataTable1

Para crear un reporte utilizando Crystal report se debe seguir el siguiente procedimiento:
Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar- NuevoElemento.
En la Figura 6.11 nuestra lo indicado.
Figura 6.11: Agregar nuevo elemento

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 33

Microsoft C# - Archivo de datos

Seleccione Reporting Crystal Reports. Escriba CrystalReporte


Reporte. En la Figura 6.12 nuestra lo indicado.

como nombre del

Figura 6.12: Seleccin Reporting Crystal Reports

Seleccione Estndar y haga clic en el botn de comando Aceptar. En la Figura 6.13


nuestra lo indicado.
Figura 6.13: Seleccin Estndar Botn de comando Aceptar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 34

Microsoft C# - Archivo de datos

Seleccione en datos del proyecto ADO.NET DataSets - ABCMyDAO.DataSetAlumno DataTable1. Luego haga clic en el botn de comando
lo indicado.

. En la Figura 6.14 nuestra

Figura 6.14: Datos del proyecto ADO.NET DataSets-ABCMyDAO.DataSetAlumnoDataTable1

Verifique que la ventana del asistente para la creacin de informes estndar se


visualice como en la Figura 6.15. Luego haga clic en el botn de comando siguiente.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 35

Microsoft C# - Archivo de datos

Figura 6.15: Asistente para la creacin de informes estndar

Seleccione todos los campos del DataTable1 haciendo clic en el botn de comando
. La Figura 6.16. muestra el asistente en la seleccin de campos a mostrar.
Figura 6.16: Seleccin de campos a mostrar

Verifique que la ventana del asistente para la creacin de informes estndar se


visualice como en la Figura 6.17. Luego haga clic en el botn de comando Finalizar.
Figura 6.17: Asistente para la creacin de informes estndar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 36

Microsoft C# - Archivo de datos

Verifique que la ventana del reporte se visualice como en la Figura 6.18.


Figura 6.18: Ventana de reporte

Para crear un formulario para desplegar el reporte se debe seguir el siguiente


procedimiento:
Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar- NuevoElemento.
En la Figura 6.19 nuestra lo indicado.
Figura 6.19: Agregar nuevo elemento

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 37

Microsoft C# - Archivo de datos

.
Seleccione Windows Forms Windows Forms. Escriba FormularioReporte como nombre
del Formulario. En la Figura 6.20 nuestra lo indicado.
Figura 6.20: Seleccin Windows Forms- Windows Forms

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 38

Microsoft C# - Archivo de datos

Del cuadro de herramientas arrastre el control CrystalReportViewer. En la Figura 6.21


nuestra lo indicado.
Figura 6.21: Seleccin de control CrystalReportViewer al FormularioReporte

Verifique que el FormularioReporte se visualice como en la Figura 6.22. y el icono


sealado por la fecha. Este icono activa el men conceptual Tareas del
CrystalReportViewer
Figura 6.22: Ventana FormularioReporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 39

Microsoft C# - Archivo de datos

Del men conceptual Tareas del CrystalReportViewer seleccione Elegir un informe en


Crystal tal como se presenta en la Figura 6.23.
Figura 6.23 Men conceptual tareas de CrystaReportViewer

En elegir un informe de Crystal cristalReportViewer1 seleccione Crystalreport1.rpt tal


como se presenta en la Figura 6.24.
Figura 6.24: Men conceptual tareas de CrystalreportViewer con seleccin de reporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 40

Microsoft C# - Archivo de datos

Verifique que el FormularioReporte.cs se presente como en la Figura 6.25


Figura 6.25: Ventana FormularioReporte

Pulse F7 ingrese el cdigo del FormularioReporte el cual se presenta en la Figura 6.26.


Figura 6.26: Cdigo del FormularioReporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 41

Microsoft C# - Archivo de datos

Haga docle clic en el objeto app.config del Explorador de soluciones. En la Figura 6.27.
se visualiza el objeto app.Config.
Figura 6.27: Objeto app.Config en el explorador de soluciones

Agregue el siguiente cdigo en el objeto app.config. En la Figura 6.28. el cdigo a


agregarse en el objeto app.Config.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 42

Microsoft C# - Archivo de datos

Figura 6.28: Cdigo a agregar en el Objeto app.Config

Ejecute el proyecto y verifique que el reporte se visualice como en la Figura 6.29.


Figura 6.29: Ejecucin del reporte

El cdigo de la aplicacin se presenta en el Cd que acompaa el libro con el


nombre de FormularioABCM-ArchivoDeDatos_y_ReporteConCrystal.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 43

Microsoft C# - Archivo de datos

CAPTULO 7
ARCHIVOS DE DATOS DE
ACCESO SECUENCIAL CON C#

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 44

Microsoft C# - Archivo de datos

ARCHIVOS DE DATOS DE ACCESO SECUENCIAL

Como ya se ha dicho en el captulo anterior, el almacenamiento en variables, arreglos o


colecciones es temporal; los datos se pierden cuando una variable local queda fuera del
alcance del mtodo o cuando la aplicacin termina. La organizacin secuencial es una
alternativa a la organizacin directa. La organizacin secuencial es el mtodo en el cual
los registros se deben acceder (leer) en el mismo orden en que se almacenaron, por lo
que su acceso se realiza utilizando el proceso secuencial. Para su manejo eficiente se
puede combinar la organizacin secuencial con el uso de arreglos de objetos. Esto
permitira almacenar los datos en archivos de datos y para el mantenimiento los datos se
cargaran en la memoria. Al terminar la ejecucin de la aplicacin los datos actualizados
se regrabaran en el archivo secuencial utilizando la organizacin secuencial.
FLUJOS
Los ejemplos posteriores utilizarn archivos de texto y por lo que la comunicacin entre
una aplicacin y el origen o el destino del archivo se realizar de forma similar a los
archivos binarios. Esto es, mediante el uso de flujos de informacin (stream), que no es
ms que un objeto que hace de intermediario entre la aplicacin y el origen o el destino
de datos. De esta forma la aplicacin leer o escribir en el flujo sin importarle desde
donde vienen o van los datos. Los archivos de texto utilizan el espacio de nombres
System.IO de la biblioteca .Net que contiene una coleccin de clases que soportan la
lectura y escritura en archivos. La clase FileStream subclase de Stream permite escribir y
leer datos de un archivo byte a byte; analgicamente, las clases StreamWriter y
StreamReader subclases de TextWriter y TextReader permiten escribir y leer caracteres o
texto.
FLUJO DE BYTES EN ARCHIVO DE TEXTO
Los datos pueden ser escritos o ledos de un archivo byte a byte utilizando un flujo de la
clase FileStream
FileStream
Un flujo de la clase FileStream permite leer y escribir bytes en un archivo. Esta clase
adems de los mtodos que hereda de la clase Stream, proporciona el constructor
siguiente:
FileStream(string nombre, FileMode , FileAccess acceso)
El constructor abre el flujo de entrada y salida (para leer y escribir) vinculando con el
archivo especificado por el nombre y especificando el tipo de acceso (leer, escribir o leer
y escribir). El parmetro nombre es una cadena de caracteres que especifica la ruta
donde se guarda o se guardar el archivo. El parmetro modo, del tipo enumerado
FileMode, puede tomar diferentes tipos de valores. En la tabla 5.1 se muestra los tipos de
valores que puede tomar el parmetro FileMode.
Tabla 5.1: Tipo de valores del parmetro FileMode
CreateNew
Create
Open
OpenOrCrea
te
Truncate
Append
Read
ReadWrite
Write

Crear un nuevo archivo. Si el archivo existe se lanzar una excepcin del


tipo IOException
Crea un nuevo archivo. Si el archivo existe ser sobreescrito
Abre un archivo existente
Abre un archivo si existe; si no, se crea un nuevo archivo
Abre un archivo existente. Una vez abierto, el archivo ser truncado a cero
bytes de longitud
Abre un archivo para aadir datos al final del mismo si existe o crea uno
nuevo sino existe
Permite abrir un archivo para operaciones de lectura
Permite abrir un archivo para operaciones de lectura / escritura
Permite abrir un archivo para operaciones de escritura

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 45

Microsoft C# - Archivo de datos

FLUJOS DE CARACTERES
Los datos pueden ser escritos y ledos de un archivo carcter por carcter den forma
portable (UTF-8: UCS Transformation Format, formato 8 de bits en el que cada carcter
Unicode emplea 1 o ms bytes) utilizando flujos de las clases StreamWriter y
StreamReader, subclases de TextWriter y textReader respectivamente.
StreamWriter
Un flujo de la clase StreamWriter permite escribir caracteres en un archivo. Esta clase,
adems de los mtodos que hereda de la clase TextWriter, proporciona los siguientes
constructores:
StreamWriter(string flujo)
Este constructor abre un flujo de salida (para escribir) hacia el archivo vinculado con otro
flujo existente de la clase Stream o de sus derivadas. El flujo de la clase StreamWriter
acta como un filtro; los datos enviados al destino son transformados en formato portable
UTF-8 y viceversa si son recuperados a travs de un flujo de la clase StreamReader, los
cual hace que la aplicacin lea o escriba datos a travs del filtro.
StreamWriter posee mtodos como Write, Writeline y Flush. Write permite escribir
cualquier tipo de datos primitivos, arreglo de caracteres, objetos String con o sin formato
en forma de cadena. Estos datos escritos (grabados) se caracterizan porque ocupan
bastante espacio en el disco. Writeline hace lo mismo, pero aade los caracteres \r\n.
Flush limpia el buffer de salida volcando los datos en el archivo vinculado al flujo.
Adems, en la utilizacin de Write o WriteLine se puede utilizar una salida formateada.
Esto se puede realizar a travs de String.Format, que convierte el valor de un objeto en
una representacin de cadena basada en un formato personalizado (plantilla) que se
encribe entre llaves ("{}"). La sintaxis de un plantilla de formato es la siguiente:
String cadena = String.Format("{indice1,longitud1}{indice2, longitud2, },
objeto1,objeto2, );
cadena
ndiceN

: Objeto de tipo string que se grabar utilizando Write o WriteLine.


: Posicin del objeto que inicia en cero en la lista de argumentos que se van
a dar formato.
longitudN : Nmero mnimo de caracteres de la representacin de cadena del parmetro.
Si su valor es positivo, el objeto se alinear a la derecha; si es negativo el
objeto se alinear a la izquierda.
objetoN
: Variable numrica o variable de cadena.
A continuacin se presenta un ejemplo de utilizacin de flujo de caracteres para escritura:
public
void
grabarArchivoDeTexto(SaveFileDialog
oSaveFileDialog,
Alumno[]
oArregloAlumno)
{ FileStream oFileStream=new FileStream(oSaveFileDialog.FileName, FileMode.Create,
FileAccess.Write);
StreamWriter oStreamWriter = new StreamWriter(oFileStream);
try
{ for (int i = 0; i<FormularioSistemaDeMenu.numeroDeAlumno; i=i+1)
{ String output = String.Format("{0,-5} {1,-25} {2,-5} {3,-5} {4,-5} {5,5}",
oArregloAlumno[i].alumno_id.ToString(),
oArregloAlumno[i].apellidoNombre,
oArregloAlumno[i].evaluacionParcial1.ToString(),
oArregloAlumno[i].evaluacionParcial2.ToString(),

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 46

Microsoft C# - Archivo de datos

oArregloAlumno[i].promedioDeTrabajo.ToString(),
oArregloAlumno[i].promedioFinal.ToString()
);
oStreamWriter.WriteLine(output);
}
}
...
}
StreamReader
Un flujo de la clase StreamReader, permite a una aplicacin leer caracteres desde
cualquier archivo datos grabados en formato texto. Se puede crear un flujo de esta clase
utilizando el siguiente constructor:
StreamReader(Stream flujo)
Este constructor abre un flujo de entrada (para leer) desde el archivo vinculando con otro
flujo existente de la clase Stream o de sus derivadas. La funcionalidad de esta clase est
soportada por varios mtodos entre los que cabe destacar Read, ReadLine, Peek y
DiscardBufferedData. Read permite leer un carcter o un conjunto de caracteres. Readline
permite leer una lnea. Una lnea est definida como una secuencia de caracteres
seguidos por \r, \n , o bien por \r \n. Peek permite obtener el siguiente carcter a
leer pero sin extraerlo del buffer asociado con el flujo. DiscardBufferedData permite
eliminar los caracteres que actualmente hay en el buffer asociado con el flujo. Ejemplo:
public Alumno[] CargarArchivoDeTexto(OpenFileDialog oOpenFileDialog,
oArregloAlumno)
{ int tamaoDelRegistro=51; int numeroDeRegistros;
FileStream
FileAccess.Read);

oFileStream=new

FileStream(oOpenFileDialog.FileName,

Alumno[]

FileMode.Open,

StreamReader oStreamReader = new StreamReader(oFileStream);


FileInfo oFileInfo = new FileInfo(oOpenFileDialog.FileName);
int tamaoDelArchivo = (int) oFileInfo.Length;
numeroDeRegistros=tamaoDelArchivo/tamaoDelRegistro;
try
{ String linea;
int i=0;
while (i<numeroDeRegistros)
{ linea=oStreamReader.ReadLine();
Alumno oAlumno=new Alumno();
oAlumno.alumno_id
Int32.Parse(linea.Substring(0,5).Trim());
oAlumno.apellidoNombre
= linea.Substring(5, 25).Trim();
oAlumno.evaluacionParcial1
double.Parse(linea.Substring(30,5).Trim());
oAlumno.evaluacionParcial2
double.Parse(linea.Substring(35,5).Trim());
oAlumno.promedioDeTrabajo
double.Parse(linea.Substring(40,5).Trim());
oAlumno.promedioFinal
double.Parse(linea.Substring(45,5).Trim());
oArregloAlumno[i]
= oAlumno;
i=i+1;
}
return oArregloAlumno;
}
...

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

=
=
=
=
=

Pgina 47

Microsoft C# - Archivo de datos

}
Para la seleccin del archivo para abrir o guardar se utiliza la Clase OpenFileDialog y
SaveFileDialog respectivamente. OpenFileDialog permite al usuario examinar una unidad
de disco, carpetas y visualizar archivos con extensin especificada y finalmente
seleccionar el nombre de un archivo. Una vez realizada la seleccin, la propiedad
FileName contendr la ruta y el nombre del archivo seleecionado. Adems se tiene las
siguientes propiedades:
OpenFileDialog.ShowDialog
Muestra un OpenFileDialog que es modal con respecto al formulario que hace la llamada.
DialogResult
Obtiene o establece el resultado del cuadro de dilogo. El valor de tipo DialogResult
devuelto por ShowDialog indica si el usuario acept la operacin (Ok) o la Cancel
(Cancel). Cuando el usuario hace clic en el control de Button, el valor asignado a la
propiedad de DialogResult de Button se asigna a la propiedad de DialogResult .
DialogoResult tiene los siguientes valores:
DialogResult.Abort

: El valor devuelto por el cuadro de dilogo es Abort (suele


enviarse desde un botn Anular).
DialogResult.Cancel
: El valor devuelto por el cuadro de dilogo es Cancel (suele
enviarse desde un botn Cancelar).
DialogResult.Ignore
: El valor devuelto por el cuadro de dilogo es Ignore (suele
enviarse desde un botn Omitir).
DialogResult.No
: El valor devuelto por el cuadro de dilogo es No (suele enviarse
desde un botn de etiqueta No).
DialogResult.None
: El cuadro de dilogo devuelve Nothing. Esto significa que el
cuadro de dilogo modal contina ejecutndose.
DialogResult.OK
: El valor devuelto por el cuadro de dilogo es OK (suele enviarse
desde un botn Aceptar).
DialogResult.Retry
: El valor devuelto por el cuadro de dilogo es Retry (suele
enviarse desde un botn de etiqueta Reintentar).
DialogResult.Yes
: El valor devuelto por el cuadro de dilogo es Yes (suele enviarse
desde un botn de etiqueta S).
Adems OpenFileDialog tiene las siguientes propiedades:
OpenFileDialog . InitialDirectory. Obtiene o establece el directorio inicial que muestra el
cuadro de dilogo OpenFileDialog .
OpenFileDialog.Title. Proporciona le nombre del Cuadro de dilogo.
OpenFileDialog.Filename. Obtiene el nombre de un de un archivo seleccionado por
OpenFileDialog.
FileInfo.Length. Obtiene el tamao, en bytes, del archivo actual.
FileDialog.Filter. Obtiene o establece la cadena de filtro que determina qu tipos de
archivo se muestran desde OpenFileDialog o SaveFileDialog. Un objeto String que contiene
el filtro. El valor predeterminado es Empty, que indica que no se aplica ningn filtro y que
se muestran todos los tipos de archivo. Al menos, una Extension debe describir cada tipo
de archivo. Si se usa ms de una Extension, se deben separar por punto y coma (";"). Por
ejemplo:

"*.doc"
"*.xls;"
"*.ppt"
"*.doc;*.xls;*.ppt"

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 48

Microsoft C# - Archivo de datos

"*.*"
Word Documents|*.doc
Excel Worksheets|*.xls
PowerPoint Presentations|*.ppt
Office Files|*.doc;*.xls;*.ppt
All Files|*.*
Word Documents|*.doc|Excel Worksheets|*.xls|PowerPoint Presentations|*.ppt|Office
Files|*.doc;*.xls;*.ppt|All Files|*.*

OpenFileDialog oOpenFileDialog = new OpenFileDialog();


oOpenFileDialog.InitialDirectory="c:\\";
oOpenFileDialog.Title="Selecione un archivo de texto ";
oOpenFileDialog.Filter="Archivos de datos |*.dat";
DialogResult oDialogResult = oOpenFileDialog.ShowDialog();
if (oDialogResult==DialogResult.OK)
{ AlumnoDAO oAlumnoDAO=new AlumnoDAO();
oArregloAlumno=oAlumnoDAO.CargarArchivoDeTexto(oOpenFileDialog,
oArregloAlumno);

SaveFileDialog.ShowDialog
Es idntico al cuadro de dilogo OpenFileDialog donde SaveFileDialog permite al usuario
seleccionar una unidad de disco, abrir una carpeta, visualizar archivos con extensin
especificadas y finalmente seleccionar o proporcionar el nombre de un archivo para
guardarlo. Ejemplo:
private void buttonGrabarArchivodeTexto_Click(object sender, EventArgs e)
{ SaveFileDialog oSaveFileDialog = new SaveFileDialog();
oSaveFileDialog.InitialDirectory="c:\\";
oSaveFileDialog.Filter="Archivos de datos |*.dat";
oSaveFileDialog.Title="Selecione un archivo de texto ";
DialogResult oDialogResult = oSaveFileDialog.ShowDialog();
if (oDialogResult==DialogResult.OK)
{ AlumnoDAO oAlumnoDAO=new AlumnoDAO();
oAlumnoDAO.grabarArchivoDeTexto(oSaveFileDialog, oArregloAlumno);
}
}
A continuacin se presenta un ejemplo de una aplicacin que administra un archivo de
testo secuencial que tiene las siguientes caractersticas:
a)Presenta un formulario para un Ssistema de Mantenimiento ABCM de alumnos.
b)La letra ABCM significan Altas, Bajas, Consultas y Modificacin respectivamente.
c) La estructura de la clase Alumno es la siguiente:
int

alumno_id
String apellidoNombre
double evaluacionParcial1
double
evaluacionParcial2
double promedioDeTrabajo
double promedioFinal

d) La longitud del registro es 52 bytes.


e)Utiliza una clase de acceso a datos (DAO) que permite interactuar la aplicacin con el
archivo de datos de texto almacenado externamente
f) Utiliza un clase denominada ABCMAction para almacenar las constantes de las
operaciones posibles.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 49

Microsoft C# - Archivo de datos

g) La Figura 7.1 visualiza el diagrama de clases de clase de la aplicacin ejemplo.


h) En la Figura 7.2, Figura 7.3, Figura 7.4, Figura 7.5, Figura 7.6, Figura 7.7 y Figura 7.8 se
visualizan los formularios de la aplicacin ejemplo.
i) La Figura 7.9 visualiza la aplicacin en el Explorador de Soluciones.
j) La Figura 7.10 presenta el cdigo de la aplicacin ABCMAction.
k)La Figura 7.11 presenta el cdigo de la aplicacin Programa principal.
l) La Figura 7.12 presenta el cdigo de la aplicacin Clase Alumno.
m) La Figura 7.13 presenta el cdigo de la aplicacin Clase Alumno DAO.
n) La Figura 7.14 presenta Cdigo de la aplicacin Clase FormularioABCM

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 50

Microsoft C# - Archivo de datos

Figura 7.1: Diagrama de clases

Figura 7.2: Formulario Sistema de Mantenimiento ABCM de alumnos No action

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 51

Microsoft C# - Archivo de datos

Figura 7.3: Formulario Sistema de Mantenimiento ABCM de alumnos Action InsertarBuscar

Figura 7.4: Formulario Sistema de Mantenimiento ABCM de alumnos Action InsertarGuardar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 52

Microsoft C# - Archivo de datos

Figura 7.5: Formulario Sistema de Mantenimiento ABCM de alumnos Action ModificarGuardar

Figura 7.6: Formulario Sistema de Mantenimiento ABCM de alumnos Action ModificarConfirmar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 53

Microsoft C# - Archivo de datos

Figura 7.7: Formulario Sistema de Mantenimiento ABCM de alumnos Consultar

Figura 7.8: Formulario Sistema de Mantenimiento ABCM de alumnos Eliminar - Confirmar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 54

Microsoft C# - Archivo de datos

Figura 7.9: Aplicacin en el Explorador de soluciones

Figura 7.10: Cdigo de la aplicacin ABCMAction


using System;
namespace ABCMyDAO

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 55

Microsoft C# - Archivo de datos


{ public class ABCMAccion
{ public static int NO_ACTION
public static int ACTION_BUSCAR
public static int ACTION_INSERTAR
public static int ACTION_MODIFICAR
public static int ACTION_CANCELAR
public static int ACTION_ELIMINAR
public static int ACTION_CONSULTA
}

= 1;
= 2;
= 3;
= 4;
= 5;
= 6;
= 7;

Figura 7.11: Cdigo de la aplicacin Programa principal


using System;
using System.Windows.Forms;
namespace ABCMyDAO
{ static class Program
{
[STAThread]
static void Main()
{ Alumno[] oArregloAlumno = new Alumno[100];
for (int i = 0; i<100; i=i+1)
{ oArregloAlumno[i]=new Alumno();
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
AlumnoDAO oAlumnoDAO=new AlumnoDAO();
Application.Run(new FormularioSistemaDeMenu(oArregloAlumno));
}

Figura 7.12: Cdigo de la aplicacin Clase Alumno


using System;
namespace ABCMyDAO
{ public class Alumno
{ public int alumno_id
{get;set;}
public String apellidoNombre
{get;set;}
public double evaluacionParcial1
{get;set;}
public double evaluacionParcial2
{get;set;}
public double promedioDeTrabajo
{get;set;}
public double promedioFinal
{get;set;}
public Alumno ( )
{ this.alumno_id = 0;
this.apellidoNombre = null;
this.evaluacionParcial1 = 0;
this.evaluacionParcial2 = 0;
this.promedioDeTrabajo = 0;
}
public
Alumno
(
int
alumno_id,
String
apellidoNombre,
double
evaluacionParcial1,
double evaluacionParcial2, double promedioDeTrabajo, double
promedioFinal )
{ this.alumno_id = alumno_id;

this.apellidoNombre = apellidoNombre;
this.evaluacionParcial1 = evaluacionParcial1;
this.evaluacionParcial2 = evaluacionParcial2;
this .promedioDeTrabajo = promedioDeTrabajo;
this .promedioFinal = promedioFinal;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 56

Microsoft C# - Archivo de datos

public void setPromedioFinal ( )


{
this.promedioFinal =(this.evaluacionParcial1 + this.evaluacionParcial2 + this
.promedioDeTrabajo) / 3;

public override String ToString ( )


{ return apellidoNombre;
}
}
}

Figura 7.13: Cdigo de la aplicacin Clase Alumno DAO


using System;
using System.IO;
using System.Windows.Forms;
namespace ABCMyDAO
{ public class AlumnoDAO
{ public int insertarRegistro(Alumno[] oArregloAlumno, Alumno oAlumno, int
numeroDeAlumno)
{ oArregloAlumno[numeroDeAlumno]=oAlumno;
numeroDeAlumno=numeroDeAlumno+1;
return numeroDeAlumno;
}
public
Alumno
consultarRegistro(Alumno[]
oArregloAlumno,
numeroDeAlumno,int busqueda)
{ Alumno oAlumno = new Alumno();
for (int i = 0; i < numeroDeAlumno; i = i + 1)
{ if (oArregloAlumno[i].alumno_id==busqueda)
{ oAlumno=oArregloAlumno[i];
return oAlumno;
}
}
return null;
}

int

public
Boolean
modificarRegistro
numeroDeAlumno,int busqueda,

int

(Alumno[]

oArregloAlumno,

Alumno oAlumno )
{ int indice=buscarRegistro(oArregloAlumno,numeroDeAlumno, busqueda);
oArregloAlumno[indice]=oAlumno;
return true;
}
public int eliminarRegistro(Alumno[] oArregloAlumno, int numeroDeAlumno, int
busqueda)
{
int indice = buscarRegistro(oArregloAlumno, numeroDeAlumno,
busqueda);
for (int i = indice; i < numeroDeAlumno-1; i = i + 1)
{ oArregloAlumno[i]=oArregloAlumno[i+1];
}
numeroDeAlumno=numeroDeAlumno-1;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 57

Microsoft C# - Archivo de datos

return numeroDeAlumno;
}
public int buscarRegistro(Alumno[] oArregloAlumno, int numeroDeAlumno,int
busqueda)
{ Alumno oAlumno = new Alumno();
for (int i = 0; i < numeroDeAlumno; i = i + 1)
{ if (oArregloAlumno[i].alumno_id==busqueda)
{ oAlumno=oArregloAlumno[i];
return i;
}
}
return -99;
}
public Alumno[] obtenerDatosEnList(Alumno[] oArregloAlumno)
{ return oArregloAlumno;
}
public Alumno[] CargarArchivoDeTexto(OpenFileDialog oOpenFileDialog, Alumno[]
oArregloAlumno)
{ int tamaoDelRegistro=51;
int numeroDeRegistros;
FileStream
FileMode.Open, FileAccess.Read);

oFileStream=new

FileStream(oOpenFileDialog.FileName,

StreamReader oStreamReader = new StreamReader(oFileStream);


FileInfo oFileInfo = new FileInfo(oOpenFileDialog.FileName);
int tamaoDelArchivo = (int) oFileInfo.Length;
numeroDeRegistros=tamaoDelArchivo/tamaoDelRegistro;

try
{ String linea;
int i=0;
while (i<numeroDeRegistros)
{ linea=oStreamReader.ReadLine();
Alumno oAlumno=new Alumno();
oAlumno.alumno_id=Int32.Parse(linea.Substring(0,5).Trim());
oAlumno.apellidoNombre = linea.Substring(5, 25).Trim();
oAlumno.evaluacionParcial1=
double.Parse(linea.Substring(30,5).Trim());
oAlumno.evaluacionParcial2=
double.Parse(linea.Substring(35,5).Trim());
oAlumno.promedioDeTrabajo
=
double.Parse(linea.Substring(40,5).Trim());
oAlumno.promedioFinal
=
double.Parse(linea.Substring(45,5).Trim());
oArregloAlumno[i]=oAlumno;
i=i+1;
}
return oArregloAlumno;
}
catch (FileNotFoundException ex)
{ MessageBox.Show("El archivo no existe!"+ex);

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 58

Microsoft C# - Archivo de datos

return null;
}
catch (IOException ex)
{ MessageBox.Show("El archivo no se puede leer!"+ex);
return null;
}
}
public void grabarArchivoDeTexto(SaveFileDialog oSaveFileDialog, Alumno[]
oArregloAlumno)
{ FileStream
oFileStream=new
FileStream(oSaveFileDialog.FileName,
FileMode.Create,
FileAccess.Write);
StreamWriter oStreamWriter = new StreamWriter(oFileStream);
try
{ for (int i = 0; i<FormularioSistemaDeMenu.numeroDeAlumno; i=i+1)
{ // Se utiliza String.Format para formatear la salida.
// se grabar un registro con todos sus campos, los cuales se
alinean a la izquierda.
String output = String.Format"{0,-5} {1,-25} {2,-5} {3,-5} {4,-5}
{5,-5}",
oArregloAlumno[i].alumno_id.ToString(),
oArregloAlumno[i].apellidoNombre,
oArregloAlumno[i].evaluacionParcial1.ToString(),
oArregloAlumno[i].evaluacionParcial2.ToString(),
oArregloAlumno[i].promedioDeTrabajo.ToString(),
oArregloAlumno[i].promedioFinal.ToString()
);
oStreamWriter.WriteLine(output);
}
oStreamWriter.Close();
oFileStream.Close();
}
catch (IOException e)
{ MessageBox.Show("Error..."+e);
}
}
}
}
Figura 7.14: Cdigo de la aplicacin Clase FormularioABCM
using System;
using System.Windows.Forms;
using System.Drawing;
namespace ABCMyDAO
{ public partial class FormularioABCMyDAO: Form
{ private int action = ABCMAction.NO_ACTION;
Alumno[] oArregloAlumno;
public FormularioABCMyDAO(Alumno[] oArregloAlumno)
{ InitializeComponent();
this.oArregloAlumno=oArregloAlumno;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
private void formatearDataGridView()
{ //Para especificar la fuente utilizada por las celdas de DataGridView

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 59

Microsoft C# - Archivo de datos

dataGridViewAlumno.DefaultCellStyle.Font=new Font("Tahoma", 07);


// Para cambiar mediante programacin el estilo de borde de todo el
control DataGridView
dataGridViewAlumno.BorderStyle=BorderStyle.Fixed3D;
// Para cambiar mediante programacin el color de la lnea de la
cuadrcula
dataGridViewAlumno.GridColor=Color.Blue;
// Para indicar la forma de seleccin de las filas
dataGridViewAlumno.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
// Para especificar los colores de primer plano y de fondo de celdas
seleccionadas
dataGridViewAlumno.DefaultCellStyle.SelectionForeColor=Color.Black;
dataGridViewAlumno.DefaultCellStyle.SelectionBackColor=Color.Aqua;
// Para establecer estilos de filas alternas mediante programacin
dataGridViewAlumno.RowsDefaultCellStyle.BackColor=Color.Pink;
dataGridViewAlumno.AlternatingRowsDefaultCellStyle.BackColor=Color.Azure;
// Para especificar la alineacin del texto de celdas de DataGridView
dataGridViewAlumno.Columns["ColumnAlumno_id"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleRight;
dataGridViewAlumno.Columns["ColumnApellidoNombre"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleLeft;
dataGridViewAlumno.Columns["ColumnEvaluacionparcial1"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleRight;
dataGridViewAlumno.Columns["ColumnEvaluacionparcial2"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleRight;
dataGridViewAlumno.Columns["ColumnPromedioDetrabajo"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleRight;
dataGridViewAlumno.Columns["ColumnPromedioFinal"].DefaultCellStyle.Alignment=
DataGridViewContentAlignment.MiddleRight;
// Para especificar los colores de primer plano y de fondo de las celdas de
DataGridView
dataGridViewAlumno.DefaultCellStyle.ForeColor=Color.Black;
dataGridViewAlumno.DefaultCellStyle.BackColor=Color.Beige;
}
private Alumno getObjetoAlumno()
{ Alumno oAlumno = new Alumno();
oAlumno.alumno_id=int.Parse(textBoxAlumno_id.Text);
oAlumno.apellidoNombre=textBoxApellidoNombre.Text;
oAlumno.evaluacionParcial1=double.Parse(textBoxEvaluacionParcial1.Text);

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 60

Microsoft C# - Archivo de datos

oAlumno.evaluacionParcial2=double.Parse(textBoxEvaluacionParcial2.Text);
oAlumno.promedioDeTrabajo=double.Parse(textBoxPromedioDeTrabajo.Text);
return oAlumno;
}
private void setObjetoAlumno(Alumno oAlumno)
{ textBoxAlumno_id.Text=oAlumno.alumno_id+"";
textBoxApellidoNombre.Text=oAlumno.apellidoNombre+"";
textBoxEvaluacionParcial1.Text=oAlumno.evaluacionParcial1+"";
textBoxEvaluacionParcial2.Text=oAlumno.evaluacionParcial2+"";
textBoxPromedioDeTrabajo.Text=oAlumno.promedioDeTrabajo+"";
}
private void limpiarDataGridViewAlumno()
{ dataGridViewAlumno.Rows.Clear();
}
private void actualizarDataGridViewAlumno()
{ limpiarDataGridViewAlumno();
AlumnoDAO oAlumnDAO = new AlumnoDAO();
oArregloAlumno=oAlumnDAO.obtenerDatosEnList(oArregloAlumno);
for (int posicion = 0; posicion<FormularioSistemaDeMenu.numeroDeAlumno;
posicion=posicion+1)
{ dataGridViewAlumno.Rows.Add(oArregloAlumno[posicion].alumno_id,
oArregloAlumno[posicion],
oArregloAlumno[posicion].evaluacionParcial1,
oArregloAlumno[posicion].evaluacionParcial2,
oArregloAlumno[posicion].promedioDeTrabajo,
oArregloAlumno[posicion].promedioFinal);
}
}
private void dataGridViewAlumno_MouseClick(object sender, MouseEventArgs e)
{ if (e.Clicks==1 && FormularioSistemaDeMenu.numeroDeAlumno>=1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada!=-1)
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void habilitarBotonesABCM(Boolean cBuscar, Boolean cNuevo, Boolean
cGuardar,
Boolean cEditar, Boolean cEliminar, Boolean cConsultar, Boolean cCancelar, Boolean
cSalir)
{ buttonBuscar.Enabled = cBuscar;
buttonNuevo.Enabled = cNuevo;
buttonGuardar.Enabled = cGuardar;
buttonModificar.Enabled = cEditar;
buttonEliminar.Enabled = cEliminar;
buttonConsultar.Enabled = cConsultar;
buttonCancelar.Enabled = cCancelar;
buttonSalir.Enabled = cSalir;
}
private void habilitarCajasDeTexto(Boolean editable)
{ textBoxApellidoNombre.Enabled = editable;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 61

Microsoft C# - Archivo de datos

textBoxEvaluacionParcial1.Enabled = editable;
textBoxEvaluacionParcial2.Enabled = editable;
textBoxPromedioDeTrabajo.Enabled = editable;
}
private void limpiarCajasDeTexto()
{ textBoxApellidoNombre.Text = "";
textBoxEvaluacionParcial1.Text = "";
textBoxEvaluacionParcial2.Text = "";
textBoxPromedioDeTrabajo.Text = "";
}
private void buttonBuscar_Click(object sender, EventArgs e)
{ if (action == ABCMAction.ACTION_BUSCAR)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
int busqueda = Int32.Parse(textBoxAlumno_id.Text);
Alumno oAlumno = oAlumnoDAO.consultarRegistro(oArregloAlumno,
FormularioSistemaDeMenu.numeroDeAlumno, busqueda);
if (oAlumno != null)
{ MessageBox.Show("Registro existente !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
else
{ action = ABCMAction.ACTION_INSERTAR;
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(true);
controladorDeEventosBotonesABCM();
textBoxApellidoNombre.Focus();
}
}
else
{ if (action == ABCMAction.ACTION_CONSULTA)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
int busqueda = Int32.Parse(textBoxAlumno_id.Text);
Alumno oAlumno = oAlumnoDAO.consultarRegistro(oArregloAlumno,
FormularioSistemaDeMenu.numeroDeAlumno, busqueda);
if (oAlumno != null)
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
setObjetoAlumno(oAlumno);
}
else
{ MessageBox.Show("No se encuentra !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}
}
private void buttonNuevo_Click(object sender, EventArgs e)
{ dataGridViewAlumno.Enabled = false;
textBoxAlumno_id.Text = "";
limpiarCajasDeTexto();
action = ABCMAction.ACTION_BUSCAR;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 62

Microsoft C# - Archivo de datos

controladorDeEventosBotonesABCM();
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();
}
private void buttonGuardar_Click(object sender, EventArgs e)
{ if (action==ABCMAction.ACTION_INSERTAR)
{ if (MessageBox.Show("Desea guardarlo...?", "Confirme el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question)==DialogResult.Yes)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
FormularioSistemaDeMenu.numeroDeAlumno=
oAlumnoDAO.insertarRegistro(oArregloAlumno, getObjetoAlumno(),
FormularioSistemaDeMenu.numeroDeAlumno);
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
buttonNuevo.Focus();
}
else
{ limpiarCajasDeTexto();
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ if (action==ABCMAction.ACTION_MODIFICAR)
{ if (MessageBox.Show("Est seguro de guardar las modificaciones?",
"Confirme el guardado", MessageBoxButtons.YesNo,
MessageBoxIcon.Question)==DialogResult.Yes)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
Alumno oAlumno = new Alumno();
if (oAlumnoDAO.modificarRegistro(oArregloAlumno,
FormularioSistemaDeMenu.numeroDeAlumno, int.Parse( textBoxAlumno_id.Text),
getObjetoAlumno()))
{ MessageBox.Show("Operacin exitosa ... !!!");
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else
{ MessageBox.Show("No se pudo guardar el registro ...!!!");
}
}
}
}
}

private void buttonModificar_Click(object sender, EventArgs e)


{ if (FormularioSistemaDeMenu.numeroDeAlumno>=1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada!=-1&&(textBoxAlumno_id.Text.Length)>0)
{ textBoxApellidoNombre.Focus();
action=ABCMAction.ACTION_MODIFICAR;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 63

Microsoft C# - Archivo de datos

controladorDeEventosBotonesABCM();
}
else
{ MessageBox.Show("No se ha seleccionado un registro ...!!!");
}
}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonCancelar_Click(object sender, EventArgs e)
{ action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
buttonNuevo.Focus();
}
private void buttonSalir_Click(object sender, EventArgs e)
{ DialogResult dialogo = MessageBox.Show("Desea cerrar el formulario?",
"Cuidado",
MessageBoxButtons.YesNo);
if (dialogo==DialogResult.Yes)
{ Dispose();
}
}
private void controladorDeEventosBotonesABCM()
{ if (action == ABCMAction.NO_ACTION)
{ textBoxAlumno_id.Text = "";
limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(false);
habilitarBotonesABCM(false, true, false, true, true, true, false, true);
dataGridViewAlumno.Enabled = true;
buttonNuevo.Focus();
}
else
{ if (action == ABCMAction.ACTION_BUSCAR)
{ habilitarCajasDeTexto(false);
limpiarCajasDeTexto();
habilitarBotonesABCM(true, false, false, false, false, false, true, false);
}
else
{ if (action == ABCMAction.ACTION_INSERTAR)
{ limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = true;
habilitarBotonesABCM(false, false, true, false, false, false, true,
false);
}
else
{ if (action == ABCMAction.ACTION_MODIFICAR)
{ habilitarCajasDeTexto(true);
habilitarBotonesABCM(false, false, true, false, false, false, true,
false);
textBoxAlumno_id.Enabled = false;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 64

Microsoft C# - Archivo de datos

}
else
{ if (action == ABCMAction.ACTION_ELIMINAR)
{ actualizarDataGridViewAlumno();
}
else
{ if (action == ABCMAction.ACTION_CONSULTA)
{ habilitarCajasDeTexto(false);
habilitarBotonesABCM(true, false, false, false, false,
false, true,
false);
textBoxAlumno_id.Enabled = true;
}
}
}
}
}
}
}
private void buttonEliminar_Click(object sender, EventArgs e)
{ if (FormularioSistemaDeMenu.numeroDeAlumno>=1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada!=-1&&(textBoxAlumno_id.Text.Length)>0)
{ if (MessageBox.Show("Est seguro de eliminar los datos?",
"Confirme la eliminacin",
MessageBoxButtons.YesNo, MessageBoxIcon.Question)==DialogResult.Yes)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
Alumno oAlumno = new Alumno();
int busqueda = int.Parse(textBoxAlumno_id.Text);
oAlumno=oAlumnoDAO.consultarRegistro(oArregloAlumno,
FormularioSistemaDeMenu.numeroDeAlumno, busqueda);
if (oAlumno!=null)
{ FormularioSistemaDeMenu.numeroDeAlumno =
oAlumnoDAO.eliminarRegistro(oArregloAlumno,
FormularioSistemaDeMenu.numeroDeAlumno, busqueda);
MessageBox.Show("Se elimin el registro ...!!!");
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else
{ MessageBox.Show("No se pudo eliminar el
registro ...!!!");
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}

else
{ MessageBox.Show("No se pudo eliminar el registro ...!!!");
action=ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 65

Microsoft C# - Archivo de datos

}
}
else
{ MessageBox.Show("Se tiene que seleccionar un registro ...!!!");
}
}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void FormularioABCMyDAOyBD_FormClosing(object sender,
FormClosingEventArgs e)
{ DialogResult dialogo = MessageBox.Show("Desea cerrar el formulario?",
"Cuidado",
MessageBoxButtons.YesNo);
if (dialogo==DialogResult.No)
{ e.Cancel=true;
}
else
{ if (dialogo==DialogResult.No)
{ e.Cancel=false;
}
}
}
private void dataGridViewAlumno_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyCode==Keys.Down)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index+1;
if (filaSeleccionada>=dataGridViewAlumno.RowCount)
{ filaSeleccionada=filaSeleccionada-1;
}
else
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
if (e.KeyCode==Keys.Up)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index-1;
if (filaSeleccionada<=-1)
{ filaSeleccionada=filaSeleccionada+1;
}
else
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void buttonCargarArchivoDeTexto_Click(object sender, EventArgs e)
{ OpenFileDialog oOpenFileDialog = new OpenFileDialog();
oOpenFileDialog.InitialDirectory="c:\\";
oOpenFileDialog.Filter="Archivos de datos |*.dat";

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 66

Microsoft C# - Archivo de datos

oOpenFileDialog.Title="Selecione un archivo de texto ";


DialogResult oDialogResult = oOpenFileDialog.ShowDialog();
if (oDialogResult==DialogResult.OK)
{ AlumnoDAO oAlumnoDAO=new AlumnoDAO();
oArregloAlumno=oAlumnoDAO.CargarArchivoDeTexto(oOpenFileDialog,
oArregloAlumno);
FormularioSistemaDeMenu.numeroDeAlumno=0;
for (int i=0; i<100; i=i+1)
{ if (oArregloAlumno[i].alumno_id!=0)
{ FormularioSistemaDeMenu.numeroDeAlumno=
FormularioSistemaDeMenu.numeroDeAlumno+1;
}
else
{ break;
}
}
for (int i=0; i<FormularioSistemaDeMenu.numeroDeAlumno; i=i+1)
{
dataGridViewAlumno.Rows.Add( oArregloAlumno[i].alumno_id,
oArregloAlumno[i],
oArregloAlumno[i].evaluacionParcial1,
oArregloAlumno[i].evaluacionParcial2,
oArregloAlumno[i].promedioDeTrabajo,
oArregloAlumno[i].promedioFinal);
}
}
}
private void buttonGrabarArchivodeTexto_Click(object sender, EventArgs e)
{ SaveFileDialog oSaveFileDialog = new SaveFileDialog();
oSaveFileDialog.InitialDirectory="c:\\";
oSaveFileDialog.Filter="Archivos de datos |*.dat";
oSaveFileDialog.Title="Selecione un archivo de texto ";
DialogResult oDialogResult = oSaveFileDialog.ShowDialog();
if (oDialogResult==DialogResult.OK)
{ AlumnoDAO oAlumnoDAO=new AlumnoDAO();
oAlumnoDAO.grabarArchivoDeTexto(oSaveFileDialog, oArregloAlumno);
}
}
private void buttonConsultar_Click(object sender, EventArgs e)
{dataGridViewAlumno.ClearSelection();
limpiarCajasDeTexto();
textBoxAlumno_id.Text = "";
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();
action = ABCMAction.ACTION_CONSULTA;
controladorDeEventosBotonesABCM();
}
}
}

El cdigo de la aplicacin se presenta en el Cd que acompaa el libro con el


nombre de FormularioABCM-Archivo de datos con acceso secuencial.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 67

Microsoft C# - Archivo de datos

CAPTULO 8
ACCESO A BASE DE DATOS C#

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 68

Microsoft C# - Archivo de datos

ACCESO A BASE DE DATOS CON C#


Una base de datos es una coleccin de datos clasificados y estructurados que son
guardados en una o varias tablas pero referenciados como si fueran una sola entidad
(nombre de base de datos). Para crear y manipular la base de datos relacionales, existen
varios sistemas de administracin de base de datos Microsoft SQL Server, Oracle, DB2,
Postgress, MySQL entre otros. Los datos en una base de datos relacional se almacenan en
tablas lgicamente relacionadas entre s utilizando campos claves. La tabla a su vez posee
filas (registros) y columnas (campos). El conjunto de todos los registros forman la tabla de
base de datos. Los usuarios de un sistema de administracin de base de datos pueden
realizar determinadas operaciones como insertar, recuperar, modificar o eliminar datos de
la tabla de base de datos, as como aadir nuevas tablas o eliminarlas. Estas operaciones
se expresan en el lenguaje SQL Transact.
SQL es un lenguaje estndar para interactuar con una base de datos relacional y es
soportado por casi todos los administradores de base de datos actuales. En l, las
unidades bsicas son los campos, los registros, las tablas y relaciones entre tablas. En
Anexo N01 muestra un resumen de las sentencias de Microsoft SQL Server 2012 R2
trabajando sobre Windows 7. Para el desarrollo del siguiente apartado se crea un script
utilizando de Microsoft SQL Server 2012 R2. En la Figura 8.1 se visualiza el script para el
ejemplo a realizar.
Figura 8.1: Script para creacin de base de datos ejemplo

ADO.NET
ADO.NET es un conjunto de clases, pertenecientes al espacio de nombres System.Data
(librera de clases del .NET Framework), para acceder a los datos de un origen de datos
(base de datos y otros) y cualquier tipo de aplicacin. Proporciona un grupo de
componentes para crear aplicaciones distribuidas de uso compartido de datos. Entre las
caractersticas ms importantes tenemos:
ADO.NET no depende de las conexiones continuamente activas, que se refiere a que la
conexin solo se realiza durante el tiempo necesario para extraer (consulta) o
actualizar los datos.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 69

Microsoft C# - Archivo de datos

Las interacciones para insertar, consultar, eliminar y actualizar registros se realizan


con las sentencias SQL insert, select, delete, update respectivamente, mediante
rdenes de acceso a los datos, que son objetos que encapsulan las sentencias SQL o los
procedimientos almacenados que definen la operacin a realizar sobre el origen de
datos.
Los datos requeridos, normalmente se almacenan en memoria cach en conjunto de
datos, lo que permite trabajar sin conexin sobre una copia temporal de los datos
obtenidos. Los conjuntos de datos son independientes de los orgenes de datos. Cuando
sea necesario, se puede restablecer la conexin con la base de datos y actualizarlos
desde el conjunto de datos.
El formato de transferencia de datos es XML. La representacin XML no utiliza
informacin binaria, sino se basa en texto que permite enviarla mediante cualquier
protocolo como por ejemplo HTTP.
En el Grfico 8.2 presenta a ADO.NET y su relacin entre las aplicaciones y los orgenes de
datos.
Figura 8.2: ADO.Net y su relacin entre las aplicaciones y origen de datos

Los componentes de ADO.NET estn diseados para separar el acceso a datos de la


manipulacin de los mismos y son: DataSet y el proveedor de datos del NET.Framework. El
proveedor de datos es un conjunto de componentes entre los que se incluyen los objetos
conexin (Connection), de rdenes (Command), el lector de datos (DataReader) y
adaptador de datos (DataAdapter). La Figura 8.3 muestra la interaccin entre los objetos
de ADO.NET
Figura 8.3: Interaccin entre los objetos ADO.Net

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 70

Microsoft C# - Archivo de datos

En la Figura 8.4 se visualiza cmo trabajan los objetos de manera conjunta para que una
aplicacin pueda interactuar con un origen de datos utilizando la arquitectura de tres
capas:
Figura 8.4: ADO.Net y la arquitectura de tres capas

El trabajo de conexin con la base de datos o la ejecucin de la sentencia SQL lo realiza el


proveedor de datos. La recuperacin de los datos (para procesarlos, manipularlos o
volcarlo a un determinado control o dispositivo) es una accin ejecutada en la capa
superior. El resultado es un conjunto de datos agrupados en tablas.
PROVEEDOR DE DATOS
En .NET Framework sirve como un puente entre una aplicacin y un origen de datos. Se
utiliza tanto para recuperar datos desde un origen de datos y para actualizarlos. Los
componentes principales de un proveedor de datos .NET son los siguientes objetos:
Conexin con el origen de datos (objeto connection), que establece una conexin a un
origen de datos determinado.
Orden para manipular (insertar, eliminar, actualizar, consultar) los datos (objeto
Command), que ejecuta una orden en lenguaje SQL en un origen de datos ya sea como
sentencia Sql incrustada o procedimiento almacenado.
Lector de datos (objeto DataReader) que lee una secuencia de datos de solo avance y
solo lectura desde un origen de datos.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 71

Microsoft C# - Archivo de datos

Adaptador de datos (objeto DataAdapter), que llena un DataSet (conjunto de datos) y


realiza actualizaciones necesarias en la base de datos.

.NET incluye los siguientes proveedores de datos: ODBC, OLE DB, Oracle y SQL Server que
se pueden encontrar en el espacio de nombres como System.Data.Odbc,
System.Data.OleDb, System.Data.OracleClient y System.Data.SqlClient. Cada uno de
estos proveedores proporciona los drivers adecuados para acceder a las distintas bases
de datos. Hay proveedores de igual importancia como MySql, AS/400 que proporcionan el
conjunto de clases que proveen acceso a sus bases de datos.
OBJETO CONEXIN
El objeto conexin establece la conexin a un origen de datos. Por ejemplo para
establecer una conexin a Microsoft SQL Server se utiliza el objeto SqlConnection. La
funcin del objeto conexin es presentar atributos y mtodos para permitir establecer y
modificar las propiedades de la conexin (por ejemplo identificador del usuario,
contrasea entre otras). Ejemplo:

using System;
using System.Data.SqlClient;
namespace ABCMyDAO
{ public class AdministradorDeConexion
{ static SqlConnection conexion;
static public SqlConnection getConexion()
{ oSqlConnection
=
new
SqlConnection("Data

Source=(local);Initial

Catalog=dbAlumno;Integrated Security=True");

return oSqlConnection;
}
}
}
OBJETO RDEN
Permite ejecutar sentencias SQL (sentencia Sql incrustada o procedimiento almacenado) y
devolver resultados desde el origen de datos.
Ejemplo:
namespace ABCMyDAO
{ public class AlumnoDAO
{ SqlConnection oSqlConnection;
public Boolean insertarRegistro(Alumno oAlumno)
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
String sentencia = "INSERT INTO Alumno( alumno_id, apellidoNombre,
evaluacionParcial1,
evaluacionParcial2,
promedioDeTrabajo,
promedioFinal)
VALUES("+ oAlumno.alumno_id+",'"+
oAlumno.apellidoNombre+"',"+
oAlumno.evaluacionParcial1+","+
oAlumno.evaluacionParcial2+","+

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 72

Microsoft C# - Archivo de datos

oAlumno.promedioDeTrabajo
+","+
oAlumno.promedioFinal+")";
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch (System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return false;
}
}
...
}

OBJETO LECTOR DE DATOS


Un objeto lector de datos obtiene los datos del origen de datos y los pasa directamente a
la aplicacin cuando no se necesite actualizar los datos. Ejemplo
public Alumno consultarRegistro(int busqueda)
{ try
{ Alumno oAlumno;
SqlConnection
oSqlConnection
=
AdministradorDeConexion
.getConexion();
oSqlConnection.Open();
String sentencia="SELECT * FROM Alumno WHERE alumno_id =" +
busqueda;
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();
if (oSqlDataReader.Read())
{ oAlumno = new Alumno();
oAlumno.alumno_id
= (int)
oSqlDataReader
["Alumno_id"];
oAlumno.apellidoNombre
= (String) oSqlDataReader
["apellidoNombre"];
oAlumno.evaluacionParcial1 = (double)
oSqlDataReader
["evaluacionParcial1"];
oAlumno.evaluacionParcial2 = (double)
oSqlDataReader
["evaluacionParcial2"];
oAlumno.promedioDeTrabajo = (double) oSqlDataReader
["promedioDeTrabajo"];

oAlumno.promedioFinal

= (double)

oSqlDataReader

["promedioFinal"];
oSqlDataReader.Close();
oSqlConnection.Close();
return oAlumno;
}
else
{ return null;
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 73

Microsoft C# - Archivo de datos

catch (System.Exception e)
{ oSqlDataReader.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return null;
}
}
Adems el lector de datos es utilizado por un adaptador de datos para llenar un conjunto
de datos.
ADAPTADOR DE DATOS
Es un conjunto de objetos utilizado para intercambiar datos entre un origen de datos y un
conjunto de datos (objeto DataSet). Esto significa que una aplicacin leer datos de una
base de datos para un conjunto de datos y a continuacin manipular dichos datos en el
conjunto de datos, para que luego, en algunas ocasiones vuelva a escribir en la base de
datos los datos modificados del conjunto de datos.
Un adaptador de datos contiene propiedades para facilitar la lectura y actualizacin de los
datos en un origen de datos tales como SelectCommand, InsertCommand,
DeleteCommand, UpdateCommand y TableMappings. SelectCommand hace referencia a
una orden que recupera filas del origen datos, entendiendo por un objeto Command que
almacena una instruccin SQL o un nombre de procedimiento, insertCommand hace
referencia a una orden para insertar filas en un origen de datos, UpdateCommand hace
referencia a una orden para modificar filas en el origen de datos y deleteCommand hace
referencia a una orden para eliminar filas en una base de datos.
CONJUNTO DE DATOS
Una aplicacin accede a los datos de un origen de datos utilizando un adaptador de datos
que lee los datos de la base de datos y lo almacena en tablas de un conjunto de datos.
Posteriormente para escribir en el origen de datos se utiliza el adaptador de datos que
tomar los datos del conjunto de datos y los escribir en el origen de datos.
Un conjunto de datos incluye una o ms tablas basadas en un origen de datos, las
relaciones entre esas tablas y las restricciones para los datos que puede contener dichas
tablas. Las partes de un conjunto de datos se exponen mediante propiedades y
colecciones.
En ADO.NET el componente central de la arquitectura sin conexin es la clase DataSet
(conjunto de datos). La clase DataSet incluye la coleccin DataTableCollection de objetos
DataTable (tabla de datos) y la coleccin DataColumnCollection de objetos DataColumn y
la coleccin ConstraintCollection de objetos constraint (relaciones entre tablas). La Clase
DataTable incluye la coleccin DataRowCollection de objetos DataRow (filas de tabla), la
coleccin DataColumnCollection (columna de datos) y la coleccin ConstaintCollection de
objetos Constraint (restricciones).
Asimismo, la clase DataRow incluye la propiedad RowState que permite saber si la fila
cambi y de que modo, desde que la tabla de datos se carg por primera vez. Algunas
propiedades son Added, Deleted, Modified y Unchanged.
VISTA DE DATOS
Es importante destacar la existencia de la clase DataView por su relacin con la clase
DataTable. La clase DataView permite representar los datos de la clase DataTable creando
mltiples vistas de los mismos, puesto que permite editar, ordenar, filtrar, buscar y
navegar por un conjunto de datos.
En la Figura 8.5 se resume los componentes del DataSet.
Figura 8.5: El DataSet

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 74

Microsoft C# - Archivo de datos

En la Figura 8.6 se visualiza un resumen de ADO.Net respecto al proveedor de datos y el


conjunto de datos.
Figura 8.6: Resumen de ADO.Net

A continuacin se presenta un ejemplo de una aplicacin que administra un tabla de base


de datos que tiene las siguientes caractersticas:
a) Presenta un formulario para un sistema de mantenimiento ABCM de alumnos la cual se
visualiza en la Figura 8.7. El formulario ABCM tiene la misma funcionalidad que la del
ejemplo anterior.
b) La letra ABCM significan Altas, Bajas, Consultas y Modificacin
c) La estructura de la clase alumno es la siguiente:
int
alumno_id
String apellidoNombre
double
evaluacionParcial1
double
evaluacionParcial2
double
promedioDeTrabajo
double
promedioFinal
d) Utiliza una clase ABCMAccion para definir las acciones que se puedan realizar, la cual
se visualiza en la Figura 8.8 como cdigo de la Aplicacin ABCMAction.
e) En la Figura 8.9 se visualiza la aplicacin en el Explorador de Aplicaciones.
f) En la Figura 8.10 se visualiza el diagrama de clases de la aplicacin.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 75

Microsoft C# - Archivo de datos

g) En la Figura 8.11 se visualiza la Clase AdministradorDeConexion que contiene el


mtodo getConexion() el cual permite la conexin con la base de datos.
h) En la Figura 8.12 se visualiza la clase entidad Alumno.
i) En la Figura 8.13 se visualiza el cdigo de la aplicacin Programa principal
j) Utiliza una clase de acceso a datos (DAO) que permite interactuar la aplicacin con el
arreglo de objetos, la cual se visualiza en la Figura 8.14.
k) En la Figura 8.15 se visualiza el cdigo de la aplicacin Clase FormularioABCMyDAO.
l) En la Figura 8.16: Ejecucin del formulario FormularioReporteDeAlumnos.
m) En las Figuras del 8.17 a la Figura 8.41 se visualiza el procedimiento para generar
reporte con Crystal Report y C# utilizando como origen de datos una base de datos.
Figura 8.7: Formulario del sistema de mantenimiento ABCM de alumnos con base de datos

Figura 8.8: Cdigo de la aplicacin - ABCMAction


namespace ABCMyDAO
{ public class ABCMAccion
{ public static int NO_ACTION
= 1;
public static int ACTION_INSERTAR = 2;
public static int ACTION_MODIFICAR = 3;
public static int ACTION_CANCELAR
= 4;
public static int ACTION_ELIMINAR
= 5;
public static int ACTION_CONSULTA = 6;
}
}
Figura 8.9: Aplicacin en el explorador de soluciones

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 76

Microsoft C# - Archivo de datos

Figura 8.10: Diagrama de clases de la aplicacin

Figura 8.11: Cdigo de la aplicacin Clase AdministradorDeConexion


using System;
using System.Data.SqlClient;
namespace ABCMyDAO
{ public class AdministradorDeConexion
{ static SqlConnection oSqlConnection;
static public SqlConnection getConexion()
{ oSqlConnection
=
new
SqlConnection("Data

Source=(local);Initial

Catalog=dbAlumno;Integrated Security=True");
return oSqlConnection;

}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 77

Microsoft C# - Archivo de datos

}
Figura 8.12: Cdigo de la aplicacin Clase Entidad Alumno
using System;
namespace ABCMyDAO
{ public class Alumno
{ public int alumno_id
{get;set;}
public String apellidoNombre
{get;set;}
public double evaluacionParcial1 {get;set;}
public double evaluacionParcial2 {get;set;}
public double promedioDeTrabajo {get;set;}
public double promedioFinal
{get;set;}
public Alumno ( )
{ this.alumno_id
= 0;
this.apellidoNombre
= null;
this.evaluacionParcial1
= 0;
this.evaluacionParcial2
= 0;
this.promedioDeTrabajo = 0;
}
public Alumno ( int alumno_id, String apellidoNombre, double evaluacionParcial1,
double evaluacionParcial2, double promedioDeTrabajo, double
promedioFinal )
{ this.alumno_id
= alumno_id;
this.apellidoNombre
= apellidoNombre;
this.evaluacionParcial1
= evaluacionParcial1;
this.evaluacionParcial2
= evaluacionParcial2;
this .promedioDeTrabajo = promedioDeTrabajo;
this .promedioFinal
= promedioFinal;
}
public void setPromedioFinal ( )
{ this.promedioFinal =(this.evaluacionParcial1 + this.evaluacionParcial2 + this
.promedioDeTrabajo) / 3;

public override String ToString ( )


{ return apellidoNombre;
}
}
}
Figura 8.13: Cdigo de la aplicacin Programa principal
using System;
using System .Windows .Forms;
namespace ABCMyDAO
{ static class Program
{ static void Main ( )
{ Application .EnableVisualStyles();
Application .SetCompatibleTextRenderingDefault(false);
Application .Run(new FormularioABCMyDAOyBD());
}
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 78

Microsoft C# - Archivo de datos

Figura 8.14: Cdigo de la aplicacin Clase AlumnoDAO


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace ABCMyDAO
{ public class AlumnoDAO
{ SqlConnection oSqlConnection;
public Boolean insertarRegistro(Alumno oAlumno)
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
String sentencia = "INSERT INTO Alumno(alumno_id,apellidoNombre,
evaluacionParcial1,
evaluacionParcial2,
promedioDeTrabajo, promedioFinal) VALUES("+
oAlumno.alumno_id+",'"+
oAlumno.apellidoNombre+"'
,"+
oAlumno.evaluacionParcial1
+","+
oAlumno.evaluacionParcial2
+","+
oAlumno.promedioDeTrabajo
+","+
oAlumno.promedioFinal+")";
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch (System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return false;
}
}

public Alumno consultarRegistro(int busqueda)


{ try
{ Alumno oAlumno;
SqlConnection
oSqlConnection
=
AdministradorDeConexion
.getConexion();
oSqlConnection.Open();
String sentencia="SELECT * FROM Alumno WHERE alumno_id =" +
busqueda;
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 79

Microsoft C# - Archivo de datos

if (oSqlDataReader.Read())
{ oAlumno = new Alumno();
oAlumno.alumno_id=(int) oSqlDataReader["Alumno_id"];
oAlumno.apellidoNombre
=
(String)
oSqlDataReader["apellidoNombre"];
oAlumno.evaluacionParcial1
=
(double)
oSqlDataReader["evaluacionParcial1"];
oAlumno.evaluacionParcial2
=
(double)
oSqlDataReader["evaluacionParcial2"];
oAlumno.promedioDeTrabajo
=
(double)
oSqlDataReader["promedioDeTrabajo"];

oAlumno.promedioFinal
oSqlDataReader["promedioFinal"];
oSqlDataReader.Close();
return oAlumno;
}
else
{ return null;
}
}
catch (System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return null;
}
}

(double)

public Boolean modificarRegistro ( int busqueda, Alumno oAlumno )


{ try
{ SqlConnection
oSqlConnection
=
AdministradorDeConexion
.getConexion();
oSqlConnection.Open();
string sentencia = "UPDATE Alumno
SET apellidoNombre='"+oAlumno.apellidoNombre+"',"+
"evaluacionParcial1="+oAlumno.evaluacionParcial1+","+
"evaluacionParcial2="+oAlumno.evaluacionPar
cial2+","+
"promedioDeTrabajo="+oAlumno.promedioDeTrabajo+
","+
"promedioFinal="+oAlumno.promedioFinal+
" WHERE alumno_id =" + busqueda;
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch ( System .Exception e )
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return false;
}
}

public Boolean eliminarRegistro(int busqueda)


{ try

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 80

Microsoft C# - Archivo de datos

{ SqlConnection
oSqlConnection
=
AdministradorDeConexion.getConexion();
oSqlConnection.Open();
string sentencia = "DELETE FROM Alumno WHERE alumno_id
="+busqueda;
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch (System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return false;
}
}
public int buscarRegistro(int busqueda)
{ Alumno oAlumno = new Alumno();
try
{
SqlConnection
oSqlConnection
=
AdministradorDeConexion.getConexion();
oSqlConnection.Open();
String sentencia= "SELECT * FROM Alumno WHERE alumno_id=" +
busqueda;
SqlCommand
oSqlCommand
=
new
SqlCommand(sentencia,
oSqlConnection);
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();
if (oSqlDataReader.Read())
{ oAlumno.alumno_id=(int) oSqlDataReader["alumno_id"];
oAlumno.apellidoNombre=(String)oSqlDataReader["apellidoNombre"];
oAlumno.evaluacionParcial1=(double)oSqlDataReader["evaluacionParcial1"];
oAlumno.evaluacionParcial2=(double)oSqlDataReader["evaluacionParcial2"];
oAlumno.promedioDeTrabajo=(double)oSqlDataReader["promedioDeTrabajo"];
oAlumno.promedioFinal=(double)oSqlDataReader["promedioFinal"];
oSqlDataReader.Close();
oSqlConnection.Close();
return oAlumno.alumno_id;
}
return -99;
}
catch (System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!"+e.Message);
return -99;
}
}
public List<Alumno> obtenerDatosEnList()
{ List<Alumno> oListAlumno=new List<Alumno>();
try
{ oSqlConnection = AdministradorDeConexion.getConexion();

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 81

Microsoft C# - Archivo de datos

oSqlConnection.Open();
String sentencia = "SELECT * FROM Alumno";
SqlCommand
oSqlCommand
=
new

SqlCommand(sentencia,

oSqlConnection);
SqlDataReader oSqlDataReader = oSqlCommand .ExecuteReader();
Alumno oAlumno;
while (oSqlDataReader.Read())
{ oAlumno=new Alumno();
oAlumno.alumno_id=(int) oSqlDataReader["Alumno_id"];
oAlumno.apellidoNombre=(String)oSqlDataReader["apellidoNombre"];
oAlumno.evaluacionParcial1=(double)oSqlDataReader["evaluacionParcial1"];
oAlumno.evaluacionParcial2=(double)oSqlDataReader["evaluacionParcial2"];
oAlumno.promedioDeTrabajo=(double)oSqlDataReader["promedioDeTrabajo"];
oAlumno.promedioFinal=(double)oSqlDataReader["promedioFinal"];
oListAlumno.Add(oAlumno);

}
oSqlDataReader.Close();
oSqlConnection.Close();
return oListAlumno;
}
catch (System.Exception e )
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e .Message);
return null;
}
}

public Boolean calcularPromedioFinalConCommand()


{ try
{ oSqlConnection = AdministradorDeConexion .getConexion();
oSqlConnection .Open();
string sentencia = "UPDATE Alumno

set
promedioFinal=(evaluacionParcial1+evaluacionParcial2+promedioDeTrabajo)/3";

SqlCommand

oSqlCommand

new

SqlCommand(sentencia,

oSqlConnection);
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch ( System .Exception e )
{ oSqlConnection .Close();
MessageBox .Show("Error ...!!!" + e .Message);
return false;
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 82

Microsoft C# - Archivo de datos

public Boolean calcularPromedioFinalConDataSet()


{ SqlConnectionoSqlConnection = AdministradorDeConexion.getConexion();
// Crear el adaptador de datos
SqlDataAdapter oSqlDataAdapter

// Crear objetos rdenes

= new SqlDataAdapter();

SqlCommand
oSqlSelectCommand
= new SqlCommand();
SqlCommand
oSqlInsertCommand
= new SqlCommand();
SqlCommand
oSqlUpdateCommand = new SqlCommand();
SqlCommand
oSqlDeleteCommand
= new SqlCommand();
// Asignar la conexin a cada propiedad del adaptador de datos
oSqlSelectCommand.Connection = oSqlConnection;
oSqlInsertCommand.Connection = oSqlConnection;
oSqlUpdateCommand.Connection = oSqlConnection;
oSqlDeleteCommand.Connection = oSqlConnection;
// Referenciar las rdenes a las propiedades del adaptador de datos
oSqlDataAdapter.SelectCommand = oSqlSelectCommand;
oSqlDataAdapter.DeleteCommand = sqlDeleteCommand;
oSqlDataAdapter.InsertCommand = oSqlInsertCommand;
oSqlDataAdapter.UpdateCommand = oSqlUpdateCommand;

// Modificar la propiedad Comand.Text del objeto oSqlSelectCommand


oSqlSelectCommand.CommandText = "select * from Alumno";
// Crear el conjunto de datos
DataSet oDataSet = new DataSet();
// Rellenar el DataSet con el contenido obtenido por SELECT
oSqlDataAdapter.Fill(oDataSet, "Alumno");
// Calcular el promedio final utilizando un buble for
for ( int posicion = 0 ; posicion < oDataSet.Tables[0].Rows.Count
posicion=posicion + 1 )
{ // Recuperar datos del conjunto de datos y crear objetos oAlumno
Alumno oAlumno=new Alumno (
(int )
["alumno_id"],
(string)

oDataSet.Tables["Alumno"].Rows[posicion]
oDataSet.Tables["Alumno"].Rows[posicion]

["apellidoNombre"],
(double) oDataSet.Tables["Alumno"].Rows[posicion]
["evaluacionParcial1"],
(double)

oDataSet.Tables["Alumno"].Rows[posicion]

["evaluacionParcial2"],
(double)

oDataSet.Tables["Alumno"].Rows[posicion]

["promedioDeTrabajo"],
(double) oDataSet.Tables["Alumno"].Rows[posicion]
["promedioFinal"]
);

// Calcular el promedio final


oAlumno.setPromedioFinal();

// Asignar el promedio final calculado a la columna "promedio final" de la fila actual en


el conjunto de datos

oDataSet.Tables[0].Rows[posicion]
["promedioFinal"]=oAlumno.promedioFinal;
}
// Verificar si ha habido cambio en el conjunto de datos
if (oDataSet.HasChanges() ) // Implementacin de la orden Update
{ // Aadir los parmetros a la orden oSqlUpdateCommand para cada campo de
la fila

oSqlUpdateCommand.Parameters.Add("@alumno_id",

SqlDbType.Int,

0,

"alumno_id");

oSqlUpdateCommand.Parameters.Add("@promedioFinal",SqlDbType.Float,0,
"promedioFinal");

// Modificar la Sentencia Update a ejecutar

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 83

Microsoft C# - Archivo de datos

oSqlUpdateCommand.CommandText

"UPDATE

Alumno

SET

promedioFinal=
@promedioFinal
alumno_id=@alumno_id";
// Actualizar la base de datos desde el DataAdapter
oSqlDataAdapter.Update(oDataSet, "Alumno");
}
MessageBox.Show("Origen de datos actualizado");
return true;
}
}
}
Figura 8.15: Cdigo de la aplicacin Clase FormularioABCMyDAO
using System;
using System.Collections.Generic;
using System.Windows.Forms;

where

namespace ABCMyDAO
{ public partial class FormularioABCMyDAOyBD:Form
{ private int action = ABCMAction.NO_ACTION;
public FormularioABCMyDAOyBD()
{ InitializeComponent();
formatearTabla();
controladorDeEventosBotonesABCM();
}
public void formatearTabla()
{ dataGridViewAlumno.SelectionMode =
DataGridViewSelectionMode.FullRowSelect;
}
public Alumno getObjetoAlumno()
{ Alumno oAlumno = new Alumno();
oAlumno.alumno_id
= int.Parse(textBoxAlumno_id.Text);
oAlumno.apellidoNombre
= textBoxApellidoNombre.Text;
oAlumno.evaluacionParcial1 =(double.Parse(textBoxEvaluacionParcial1.Text));
oAlumno.evaluacionParcial2 = (double.Parse(textBoxEvaluacionParcial2.Text));
oAlumno.promedioDeTrabajo = (double.Parse(textBoxPromedioDeTrabajo.Text));

return oAlumno;
}
public void setObjetoAlumno(Alumno oAlumno)
{ textBoxAlumno_id.Text = oAlumno.alumno_id + "";
textBoxApellidoNombre.Text = oAlumno.apellidoNombre + "";
textBoxEvaluacionParcial1.Text = oAlumno.evaluacionParcial1 + "";
textBoxEvaluacionParcial2.Text = oAlumno.evaluacionParcial2 + "";
textBoxPromedioDeTrabajo.Text = oAlumno.promedioDeTrabajo + "";
}
public void actualizarDataGridViewAlumno()
{ limpiarDataGridViewAlumno();
AlumnoDAO oAlumnDAO = new AlumnoDAO();
List<Alumno> oListAlumno = oAlumnDAO.obtenerDatosEnList();
for (int posicion=0; posicion<oListAlumno.Count; posicion=posicion + 1)
{ if (oListAlumno[posicion].alumno_id != 0)
{ dataGridViewAlumno.Rows.Add(oListAlumno[posicion].alumno_id,
oListAlumno[posicion],
oListAlumno[posicion].evaluacionParcial1, oListAlumno[posicion].evaluacionParcial2,

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 84

Microsoft C# - Archivo de datos

oListAlumno[posicion].promedioDeTrabajo,
oListAlumno[posicion].promedioFinal);
}
}
}

private void habilitarBotonesABCM(Boolean cBuscar, Boolean cNuevo,


Boolean cGuardar, Boolean cEditar, Boolean cEliminar, Boolean cConsultar, Boolean
cCancelar, Boolean cSalir)
{ buttonBuscar.Enabled = cBuscar;
buttonNuevo.Enabled = cNuevo;
buttonGuardar.Enabled = cGuardar;
buttonModificar.Enabled = cEditar;
buttonEliminar.Enabled = cEliminar;
buttonConsultar.Enabled = cConsultar;
buttonCancelar.Enabled = cCancelar;
buttonSalir.Enabled = cSalir;
}
private void habilitarCajasDeTexto(Boolean editable)
{ textBoxApellidoNombre.Enabled = editable;
textBoxEvaluacionParcial1.Enabled = editable;
textBoxEvaluacionParcial2.Enabled = editable;
textBoxPromedioDeTrabajo.Enabled = editable;
}
private void limpiarCajasDeTexto()
{ textBoxApellidoNombre.Text = "";
textBoxEvaluacionParcial1.Text = "";
textBoxEvaluacionParcial2.Text = "";
textBoxPromedioDeTrabajo.Text = "";
}
private void buttonBuscar_Click(object sender, EventArgs e)
{ if (action == ABCMAction.ACTION_BUSCAR)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
int busqueda = Int.Parse(textBoxAlumno_id.Text);
Alumno oAlumno = oAlumnoDAO.consultarRegistro(busqueda);
if (oAlumno != null)
{ MessageBox.Show("Registro existente !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
else
{ action = ABCMAction.ACTION_INSERTAR;
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(true);
controladorDeEventosBotonesABCM();
textBoxApellidoNombre.Focus();
}
}
else

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 85

Microsoft C# - Archivo de datos

{ if (action == ABCMAction.ACTION_CONSULTA)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
int busqueda = Int32.Parse(textBoxAlumno_id.Text);
Alumno oAlumno = oAlumnoDAO.consultarRegistro(busqueda);
if (oAlumno != null)
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
setObjetoAlumno(oAlumno);
}
else
{ MessageBox.Show("No se encuentra !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}
}
private void buttonNuevo_Click(object sender, EventArgs e)
{ dataGridViewAlumno.Enabled = false;
textBoxAlumno_id.Text
= "";
limpiarCajasDeTexto();
action = ABCMAction.ACTION_BUSCAR;
controladorDeEventosBotonesABCM();
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();

}
private void buttonGuardar_Click(object sender, EventArgs e)
{ if (action == ABCMAction.ACTION_INSERTAR)
{ if (MessageBox.Show("Desea guardarlo?", "Confirme el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes )

{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();


if (oAlumnoDAO.insertarRegistro(getObjetoAlumno()))
{ MessageBox.Show("Operacin exitosa ... !!!");
}
else
{ MessageBox.Show("No se pudo guardar el registro ... !!!");
}
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
buttonNuevo.Focus();
}
else
{ limpiarCajasDeTexto();
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ if (action == ABCMAction.ACTION_MODIFICAR)
{ if (MessageBox.Show("Est seguro de guardar los datos?",
"Confirme el guardado", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)

{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();


Alumno oAlumno = new Alumno();

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 86

Microsoft C# - Archivo de datos

if (oAlumnoDAO.modificarRegistro(int.Parse(textBoxAlumno_id.Text),
getObjetoAlumno()))

{ MessageBox.Show("Operacin exitosa ... !!!");


action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else
{ MessageBox.Show("No se pudo guardar el registro ...!!!");
}
}
else
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}
}
private void buttonModificar_Click(object sender, EventArgs e)
{ if (dataGridViewAlumno.RowCount >= 1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada != -1 && (textBoxAlumno_id.Text.Length) > 0)
{ textBoxApellidoNombre.Focus();
action = ABCMAction.ACTION_MODIFICAR;
controladorDeEventosBotonesABCM();
}
else
{ MessageBox.Show("No se ha seleccionado un registro ...!!!");
}
}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonEliminar_Click(object sender, EventArgs e)
{ if (dataGridViewAlumno.RowCount >= 1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada != -1 && (textBoxAlumno_id.Text.Length) > 0)
{ if (MessageBox.Show("Est seguro de eliminar los datos?",
"Confirme la eliminacin", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
Alumno oAlumno = new Alumno();
int busqueda = int.Parse(textBoxAlumno_id.Text);
oAlumno = oAlumnoDAO.consultarRegistro(busqueda);
if (oAlumno != null)
{ oAlumno = getObjetoAlumno();
oAlumno.alumno_id = 0;
if (oAlumnoDAO.eliminarRegistro(busqueda))
{ MessageBox.Show("Se elimin el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 87

Microsoft C# - Archivo de datos

{ MessageBox.Show("No se pudo eliminar el registro ...!!!");


action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ MessageBox.Show("No se pudo eliminar el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ MessageBox.Show("Se tiene que seleccionar un registro ...!!!");
}
}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonCancelar_Click(object sender, EventArgs e)
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
buttonNuevo.Focus();
}
private void buttonSalir_Click(object sender, EventArgs e)
{ Dispose();
}
private void dataGridViewAlumno_MouseClick(object sender, MouseEventArgs e)
{ if (e.Clicks == 1 && dataGridViewAlumno.RowCount >= 1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if (filaSeleccionada != -1)
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void limpiarDataGridViewAlumno()
{ dataGridViewAlumno.Rows.Clear();
}
private void controladorDeEventosBotonesABCM()
{ if (action == ABCMAction.NO_ACTION)
{ actualizarDataGridViewAlumno();
textBoxAlumno_id.Text = "";
limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(false);
habilitarBotonesABCM(false, true, false, true, true, true, false,

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 88

Microsoft C# - Archivo de datos

true);
dataGridViewAlumno.Enabled = true;
buttonNuevo.Focus();
}
else
{ if (action == ABCMAction.ACTION_BUSCAR)
{ habilitarCajasDeTexto(false);
limpiarCajasDeTexto();
habilitarBotonesABCM(true, false, false, false, false, false,
true, false);
}
else
{ if (action == ABCMAction.ACTION_INSERTAR)
{ limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = true;
habilitarBotonesABCM(true, false, true, false, false, false,
true, false);
}
else
{ if (action == ABCMAction.ACTION_MODIFICAR)
{ habilitarCajasDeTexto(true);
habilitarBotonesABCM(false, false, true, false, false,
false, true, false);
textBoxAlumno_id.Enabled = false;

}
else
{ if (action == ABCMAction.ACTION_ELIMINAR)
{ actualizarDataGridViewAlumno();
}
else
{ if (action == ABCMAction.ACTION_CONSULTA)
{ habilitarCajasDeTexto(false);

habilitarBotonesABCM(true, false, false, false,


false, false, true, false);
textBoxAlumno_id.Enabled = true;

}
}
}
}
}
}
private void buttonCalcularPromedioFinalConDataSet_Click(object sender,
EventArgs e)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
oAlumnoDAO.calcularPromedioFinalConDataSet();
actualizarDataGridViewAlumno();
}
private void buttonCalcularPromedioFinalConCommand_Click(object sender,
EventArgs e)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
oAlumnoDAO.calcularPromedioFinalConCommand();
actualizarDataGridViewAlumno();
}
private void dataGridViewAlumno_KeyDown(object sender, KeyEventArgs e)

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 89

Microsoft C# - Archivo de datos

{ if (e.KeyCode == Keys.Down)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index + 1;
if (filaSeleccionada >= dataGridViewAlumno.RowCount)
{ filaSeleccionada = filaSeleccionada - 1;
}
else
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
if (e.KeyCode == Keys.Up)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index - 1;
if (filaSeleccionada <= -1)
{ filaSeleccionada = filaSeleccionada + 1;
}
else
{ Alumno oAlumnoSeleccionado = (Alumno)
dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void buttonImprimir_Click(object sender, EventArgs e)
{ FormularioReporteDeAlumnos oFormularioReporteDeAlumnos=new
FormularioReporteDeAlumnos();
oFormularioReporteDeAlumnos.ShowDialog();
}
private void buttonConsultar_Click(object sender, EventArgs e)
{ dataGridViewAlumno.ClearSelection();
limpiarCajasDeTexto();
textBoxAlumno_id.Text = "";
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();
action = ABCMAction.ACTION_CONSULTA;
controladorDeEventosBotonesABCM();
}
}
}
Figura 8.16: Ejecucin del formulario FormularioReporteDeAlumnos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 90

Microsoft C# - Archivo de datos

A continuacin se presenta el procedimiento para generar un Formulario que presente un


reporte creado en Crystal report con origen de datos a una tabla de base de datos. El
proceso empieza con la creacin de un DataSetAlumno (Conjunto de datos alumno), pala
el cual se debe seguir el siguiente procedimiento:

Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar- NuevoElemento.


En la Figura 8.17 nuestra lo indicado.
Figura 8.17: Agregar nuevo elemento

Seleccione Datos Conjunto de datos. Escriba DataSetAlumno como nombre del


Conjunto de datos. En la Figura 8.18 nuestra lo indicado.
Figura 8.18: Seleccin de datos Conjunto de datos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 91

Microsoft C# - Archivo de datos

Verifique que se muestra el diseador de DataSet. La Figura 8.19 muestra el diseador


de DataSet. Luego haga doble clic en el vnculo Explorador de Soluciones que se
encuentra en el rea de diseo del DataSet.
Figura 8.19: rea de diseo del DataSet

En el rea de diseo de DataSet haga doble clic derecho y seleccione del men
conceptual Agregar Tabla de datos. En la Figura 7.19 nuestra lo indicado.
Figura 8.20: Seleccin Agregar Tabla de datos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 92

Microsoft C# - Archivo de datos

En Agregar conexin en Origen de datos escriba LocalHost (servidor local) y en


seleccione o escriba el nombre de una base de datos escriba dbAlumno. En la Figura
8.21 nuestra lo indicado.
Figura 8.21: Seleccin Agregar Columna

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 93

Microsoft C# - Archivo de datos

Verifique que el Explorador de Servidores visualice la conexin dbalumno (conexin a la


base de datos dbAlumno). La Figura 8.22 visualiza la conexin a la base de datos
dbAlumno.
Figura 8.22: Conexin a la base de datos dbAlumno

Arrastre la tabla Alumno del Explorador de servidores al rea de diseo del DataSet. La
Figura 8.23 visualiza la tabla Alumno en el DataSet despus de arrastrarla desde el
servidor de archivos.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 94

Microsoft C# - Archivo de datos

Figura 8.23: Tabla alumno despus de arrastrarla del Explorador de Servidores

Para crear un reporte utilizando Crystal Report se debe seguir el siguiente procedimiento:
Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar -> NuevoElemento.
En la Figura 8.24 nuestra lo indicado.
Figura 8.24: Agregar nuevo elemento

.
Seleccione Reporting Crystal Reports. Escriba CrystalReporteAlumno.rpt
nombre del Reporte. En la Figura 8.25 nuestra lo indicado.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

como

Pgina 95

Microsoft C# - Archivo de datos

Figura 8.25: Seleccin Reporting Crystal Reports

Seleccione Usar asistente de informes -> Estndar y haga clic en el botn de comando
Aceptar. En la Figura 8.26 nuestra lo indicado.
Figura 8.26: Seleccin Estndar Botn de comando Aceptar

Seleccione en datos del proyecto ADO.NET DataSets - ABCMyDAO.DataSetAlumno DataTable1. Luego haga clic en el botn de comando
lo indicado.

. En la Figura 8.27 nuestra

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 96

Microsoft C# - Archivo de datos

Figura 8.27: Datos del proyecto ADO.NET DataSets - ABCMyDAO.DataSetAlumnoData

Verifique que la ventana del Asistente para la creacin de informes estndar se


visualice como en la Figura 8.28. Luego haga clic en el botn de comando Siguiente.
Figura 8.28: Asistente para la creacin de informes estndar

Seleccione todos los campos de la table Alumno haciendo clic en el botn de comando
. La Figura 8.29 muestra el asistente en la seleccin de campos a mostrar.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 97

Microsoft C# - Archivo de datos

Figura 8.29: Seleccin de campos a mostrar

Verifique que la ventana del asistente para la creacin de informes estndar se


visualice como en la Figura 8.30. Luego haga clic en el botn de comando Finalizar.
Figura 8.30: Asistente para la creacin de informes estndar

Verifique que la ventana del reporte se visualice como en la Figura 8.31 despus de
agregar otros objetos de texto.
Figura 8.31: Ventana de reporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 98

Microsoft C# - Archivo de datos

Para crear un formulario para desplegar el reporte se debe seguir el siguiente


procedimiento:
Hacer clic derecho en el proyecto ABCMyDAO y seleccionar Agregar- NuevoElemento.
En la Figura 8.32 nuestra lo indicado.
Figura 8.32: Agregar nuevo elemento

.
Seleccione Windows Forms Windows Forms. Escriba FormularioReporte como nombre
del Formulario. En la Figura 8.33 nuestra lo indicado.
Figura 8.33: Seleccin Windows Forms- Windows Forms

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 99

Microsoft C# - Archivo de datos

Del cuadro de herramientas arrastre el control CrystalReportViewer. En la Figura 8.34


nuestra lo indicado.
Figura 8.34: Seleccin de control CrystalReportViewer al FormularioReporteDeAlumnos

Verifique que el FormularioReporte y el icono sealado por la fecha se visualicen como


en la Figura 8.35. Este icono activa el Men conceptual Tareas del CrystalReportViewer

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 100

Microsoft C# - Archivo de datos

Figura 8.35: Ventana FormularioReporteDeAlumnos

Del Men conceptual -> Tareas del CrystalReportViewer seleccione Elegir un informe
en Crystal tal como se presenta en la Figura 8.36.
Figura 8.36 Men conceptual->Tareas de CrystaReportViewer

En Elegir un informe de Crystal cristalReportViewer1 seleccione Crystalreport1.rpt tal


como se presenta en la Figura 8.37.
Figura 8.37: Men conceptual tareas de CrystalreportViewer con seleccin de reporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 101

Microsoft C# - Archivo de datos

Verifique que el FormularioReporte.cs se presente como en la Figura 8.38


Figura 8.38: Vista del formulario FormularioReporteDeAlumno.cs

Pulse F7 ingrese el cdigo del FormularioReporte el cual se presenta en la Figura 8.39.


Figura 8.39: Cdigo del FormularioReporte

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 102

Microsoft C# - Archivo de datos

Haga docle clic en el objeto app.config del Explorador de soluciones. En la Figura 8.40
se visualiza el objeto app.Config.
Figura 8.40: Objeto app.Config en el explorador de soluciones

Agregue el siguiente cdigo en el objeto app.config. En la Figura 8.41. el cdigo a


agregarse en el objeto app.Config. Esto se realiza siempre en cuando no corre la
aplicacin.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 103

Microsoft C# - Archivo de datos

Figura 8:41: Cdigo a agregar en el Objeto app.Config

Ejecute el proyecto y verifique que se presente el Sistema de mantenimiento ABCM de


Alumnos y se presente el Reporte de Alumno cuando se haga clic en el botn de
comando imprimir tal como se visualiza en la Figura 8.42.
Figura 8.42: Ejecucin del Formulario ABCM con base de datos y el reporte de alumnos.

El cdigo de la aplicacin se presenta en el Cd que acompaa el libro con el


nombre de FormularioABCM-Base de Datos con DAO Propiedades.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 104

Microsoft C# - Archivo de datos

CAPTULO 9
PROCEDIMIENTOS ALMACENADOS

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 105

Microsoft C# - Archivo de datos

PROCEDIMIENTOS ALMACENADOS
Un procedimiento almacenado (stored procedure) es un programa que se almacena
fsicamente en una base de datos. Su implementacin vara de un gestor de bases de
datos a otro. La ventaja de un procedimiento almacenado es que se ejecuta en respuesta
a una peticin de usuario directamente en el motor de bases de datos, el cual usualmente
corre en un servidor de datos. Los procedimientos almacenados acceden directamente a
los datos y slo necesita parmetros para pasar datos de la aplicacin al procedimiento
almacenado y luego de hacer un proceso devuelve resultados a la aplicacin que lo llam.
Esto elimina la sobrecarga de comunicar grandes cantidades de datos salientes y
entrantes.
Los procedimientos almacenados son ventajosos cuando una base de datos es
manipulada desde muchas aplicaciones externas, los cuales pueden ser escritos en
diferentes lenguajes. Incluyen la lgica de la aplicacin en la base de datos e eliminan la
necesidad de incrustar la lgica en todas las aplicaciones que acceden a los datos, lo cual
simplifica la creacin y particularmente el mantenimiento de las aplicaciones clientes
involucrados. Esto reduce la probabilidad de que los datos sean corrompidos por el uso de
aplicaciones clientes defectuosos.
Los procedimientos se asemejan a las construcciones de otros lenguajes de programacin
porque pueden:

Aceptar parmetros de entrada (parmetros) y devolver varios valores (resultados)


de salida a la aplicacin que lo llam.

Contener instrucciones realizan operaciones en la base de datos y pueden


contener llamadas a otros procedimientos almacenados.

Devolver un valor de estado a un programa que realiza una llamada para indicar si
la operacin se ha realizado correctamente o se han producido errores, y el motivo de
estos.
Los comandos de un procedimiento almacenado se ejecutan en un nico lote de
cdigo. Esto reduce significativamente el trfico de red entre el servidor y el cliente, ya
que solo se enva la llamada red que va a ejecutar a travs de ella.
Los procedimientos almacenados permiten la reutilizacin del cdigo, ya que el cdigo de
cualquier operacin de base de datos redundante resulta un candidato perfecto para la
encapsulacin de procedimientos. De este modo, se elimina la necesidad de escribir de
nuevo el mismo cdigo, se reducen las inconsistencias de cdigo y se permite que
cualquier usuario o aplicacin que cuente con los permisos necesarios pueda acceder al
cdigo y ejecutarlo.
Los procedimientos almacenados permiten un mantenimiento ms sencillo, ya que las
aplicaciones cliente llaman a procedimientos y mantienen las operaciones de base de
datos en la capa de datos, solo deben actualizarse los cambios de los procesos en la base
de datos. El nivel de aplicacin permanece independiente y no tiene que tener
conocimiento sobre los cambios realizados en los diseos, las relaciones o los procesos de
la base de datos.
Los procedimientos almacenados aseguran un rendimiento mejorado de forma
predeterminada ya se compila la primera vez que se ejecuta y crea un plan de ejecucin
que vuelve a usarse en posteriores ejecuciones. Como el procesador de consultas no tiene
que crear un nuevo plan, normalmente necesita menos tiempo para procesar el
procedimiento.
Por otro lado dan mayor seguridad, ya que varios usuarios y aplicaciones cliente pueden
realizar operaciones en los objetos de base de datos subyacentes a travs de un
procedimiento, aunque los usuarios y las aplicaciones no tengan permisos directos sobre

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 106

Microsoft C# - Archivo de datos

esos objetos subyacentes. El procedimiento controla que procesos y actividades se llevan


a cabo y protege los objetos de base de datos subyacentes. Esto elimina la necesidad de
conceder permisos en cada nivel de objetos y simplifica los niveles de seguridad. Al llamar
a un procedimiento a travs de la red, solo est visible la llamada que va a ejecutar el
procedimiento. Por lo tanto, los usuarios malintencionados no pueden ver los nombres de
los objetos de base de datos y tabla, incrustados en sus propias instrucciones TransactSQL, ni buscar datos crticos.
El uso de parmetros ayuda a protegerse contra ataques por inyeccin de cdigo SQL.
Dado que la entrada de parmetros se trata como un valor literal y no como cdigo
ejecutable, resulta ms difcil para un atacante insertar un comando en la
instruccin Transact-SQL del procedimiento y comprometer la seguridad. Los
procedimientos pueden cifrarse, lo que ayuda a ofuscar el cdigo fuente. Entre los
comandos importantes para usar procedimientos almacenados en C# tenemos:
SqlConnection
Obtiene o establece la conexin SqlConnection que utiliza esta instancia de la
SqlCommand. Ejemplo:
public class AdministradorDeConexion
{ static SqlConnection conexion;
static public SqlConnection getConexion()
{ conexion = new SqlConnection("Data Source=(local);Initial Catalog=dbAlumno;Integrated
Security=True");
return conexion;
}
}
SqlConnection.Open
Abre una conexin a una base de datos. Ejemplo:
oSqlConnection.Open();
SqlConnection.Close
Cierra una conexin a una base de datos. Ejemplo:
oSqlConnection.Close();
SqlCommand
Representa una sentencia Transact-SQL o un procedimiento almacenado para ejecutarse
en una base de datos SQL Server. Ejemplo:
SqlCommand oSqlCommand = new SqlCommand(sentencia, oSqlConnection);
SqlCommand (String, SqlConnection)
Inicializa una nueva instancia de la clase SqlCommand con un texto que representa una
sentencia Sql o el nombre de procedimiento almacenado y un objeto SqlConnection.
Ejemplo:
SqlCommand oSqlCommand = new SqlCommand("dbo.InsertarAlumno", oSqlConnection);
CommandType
Obtiene o establece la instruccin de Transact-SQL para ejecutarse en el origen de datos.
Cuando
la
propiedad CommandType se
establece
en StoredProcedure,
la
propiedad CommandText se establece con el nombre del procedimiento almacenado. El
comando ejecutar este procedimiento almacenado cuando se llame a uno de los
mtodos Execute. Ejemplo:

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 107

Microsoft C# - Archivo de datos

oSqlCommand.CommandType = CommandType.StoredProcedure;
SqlCommand.Parameter
Los objetos de comando utilizan parmetros para pasar valores a instrucciones SQL o
procedimientos almacenados Se puede definir de manera ms explcita parmetros de
procedimientos almacenados y para acceder a los parmetros de salida y devolver
valores. Los parmetros se almacenan a travs de una coleccin que se asocia a un objeto
SqlCommand El valor predeterminado es una coleccin vaca. Cuando se utilizan
parmetros con SqlCommand para ejecutar un procedimiento almacenado de SQL Server,
los nombres de los parmetros agregados a la coleccin deben coincidir con los nombres
de los marcadores de parmetros en el procedimiento almacenado. Ejemplo:
En C#:
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id",
oAlumno.getAlumno_id()));
oSqlCommand.Parameters.Add(new SqlParameter("@apellidoNombre",
oAlumno.getApellidoNombre()));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial1",
oAlumno.getEvaluacionParcial1()));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial2",
oAlumno.getEvaluacionParcial2()));
oSqlCommand.Parameters.Add(new SqlParameter("@promedioTrabajo",
oAlumno.getPromedioDeTrabajo()));
oSqlCommand.Parameters.Add(new SqlParameter ("@promedioFinal",
oAlumno.getPromedioFinal()));
En Sql server 2008 R2:
CREATE/ALTER PROCEDURE [dbo].[InsertarAlumno]
@alumno_id
int,
@apellidoNombre char(50),
@evaluacionParcial1 float,
@evaluacionParcial2 float,
@promedioTrabajo
float,
@promedioFinal
float
SqlCommand.ExecuteNonQuery();
Ejecuta una instruccin de Transact-SQL (update, insert o delete) o un procedimiento
almacenado en una conexin y devuelve el nmero de filas afectadas. Ejemplo:
SqlCommand.ExecuteNonQuery();
SqlDataReader
Proporciona una manera de leer una secuencia de slo avance de filas de una base de
datos. La recuperacin implica crear una instancia del objeto SqlCommand y de
un SqlDataReader, para lo cual se llama a SqlCommand.ExecuteReader a fin de recuperar
filas de un origen de datos. Se utiliza el mtodo Read del objeto SqlDataReader para
obtener una fila a partir de los resultados de una consulta. Para tener acceso a cada
columna de la fila devuelta, puede pasar a DataReader el nombre de la columna. Los
datos de los campos ledos tienen que parsearse para ser utilizados en en C#. Ejemplo:
String sentencia="SELECT * FROM Alumno WHERE alumno_id =" + busqueda;
SqlCommand oSqlCommand
= new SqlCommand(sentencia, oSqlConnection);
SqlDataReader oSqlDataReader
= oSqlCommand.ExecuteReader();
if (oSqlDataReader.Read())
{ oAlumno = new CEAlumno();
oAlumno.alumno_id
= (int)
oSqlDataReader["alumno_id"];
oAlumno.apellidoNombre
= (String) oSqlDataReader["apellidoNombre"];

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 108

Microsoft C# - Archivo de datos

oAlumno.evaluacionParcial1 = (double) oSqlDataReader["evaluacionParcial1"];


oAlumno.evaluacionParcial2 = (double) oSqlDataReader["evaluacionParcial2"];
oAlumno.promedioDeTrabajo = (double)
oSqlDataReader["promedioDeTrabajo"];
oAlumno.setPromedioFinal = (double) oSqlDataReader["promedioFinal"];
oSqlDataReader.Close();
return oAlumno;
}
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();
SqlDataReader.Close
Cierra un SqlDataReader aperturado. Ejemplo:
oSqlDataReader.Close();
A continuacin se presenta un ejemplo de una aplicacin que adminsitra una tabla de
base de datos donde se utiliza procedimientos almacenados y desarrollo de aplicaciones
con la arquitectura Modelo-Vista-Controlado en Formularios Windows el cual tiene las
siguientes caractersticas:
a) Presenta un formulario para un sistema de mantenimiento ABCM de alumnos el cual se
visualiza en la Figura 9.1.
b) Las letras ABCM significan Altas, Bajas, Consultas y Modificacin respectivamente.
c) La aplicacin se ha desarrollado con la arquitectura Modelo-Vista-Controlador la cual se
visualiza en la Figura 9.2.
d) La estructura de la clase Alumno es la siguiente:
int
alumno_id
String apellidoNombre
double evaluacionParcial1
double
evaluacionParcial2
double promedioDeTrabajo
double promedioFinal

e) Utiliza la clase ABCMAction para definir las acciones que se pueden realizar, la cual se
visualiza en la Figura 9.3 como Cdigo de la Aplicacin - ABCMAction
f) En la Figura 9.4 se visualiza la clase AdministradorDeConexion que contiene el mtodo
getConexion(), el cual permite la conexin de la aplicacin con la base de datos.
g) En la Figura 9.5 se visualiza el diagrama de clases de la aplicacin.
h) En la Figura 9.6 se visualiza la clase entidad Alumno.
i) En la Figura 9.7 se visualiza la clase AlumnoDAO
j) En la Figura 9.8 se visualiza la Clase ControladorAlumno.cs que es el controlador en el
Modelo-Vista-Controlador.
k) En la Figura 9.9 se visualiza el Cdigo de la Aplicacin - Clase FormularioABCMyMVCyBD
(Vista)
l) En la Figura 9.10 se visualiza el Cdigo de la Aplicacin - Clase
FormularioImprimir(Vista)
m) En la Figura 9.11 un formulario para visualizar el reporte de alumnos.
n) En la Figura 9.12 se visualiza Cdigo de la Aplicacin Programa principal.
o) En la Figura 9.13 se visualiza la base de datos en el Administrador del Micrsoft SQL
Server 2008.
p) En la Figura 9.14 se visualiza el cdigo SQL para crear la base de datos dbAlumno y la
tabla Alumno. Para crear la base de datos y la tabla se tiene que ejecutar el cdigo SQL
en el Microsoft SQL 2008.
q) En la Figura 9.15 se visualiza el cdigo SQL para crear los procedimientos almacenados
en Microsft SQL Server 2008. Para crear los procedimientos almacenados se tiene que
ejecutar el cdigo SQL en el Microsoft SQL 2008.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 109

Microsoft C# - Archivo de datos

Figura 9.1: Formulario de la aplicacin

Figura 9.2: Arquitectura de la aplicacin utilizando Modelo-Vista-Controlador

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 110

Microsoft C# - Archivo de datos

Figura 9.3: Cdigo de la Aplicacin - ABCMAction


namespace ABCMyMVC.Util
{ public class ABCMAccion
{ public static int NO_ACTION
= 1;
public static int ACTION_INSERTAR = 2;
public static int ACTION_MODIFICAR = 3;
public static int ACTION_CANCELAR = 4;
public static int ACTION_ELIMINAR
= 5;
public static int ACTION_CONSULTA = 6;
}
}
Figura 9.4: Cdigo de la Aplicacin Clase AdministradorDeConexin
using System;
using System.Data.SqlClient;
namespace ABCMyMVC.Modelo.Datos
{ public class AdministradorDeConexion
{ static SqlConnection conexion;
static public SqlConnection getConexion()
{ oSqlConnection = new SqlConnection("Data Source=(local);Initial
Catalog=dbAlumno;Integrated Security=True");
return oSqlConnection;

}
}
}
Figura 9.5: Diagrama de clases de la aplicacin

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 111

Microsoft C# - Archivo de datos

9.6. Cdigo de la Aplicacin- Clase entidad Alumno


using System;
namespace ABCMyMVC.Modelo.Entidad
{ public class Alumno
{ public int alumno_id
{ get; set; }
public String apellidoNombre
{ get; set; }
public double evaluacionParcial1 { get; set; }
public double evaluacionParcial2 { get; set; }
public double promedioDeTrabajo { get; set; }
public double promedioFinal
{ get; set; }
public CEAlumno()
{ this.alumno_id = 0;
this.apellidoNombre = null;
this.evaluacionParcial1 = 0;
this.evaluacionParcial2 = 0;
this.promedioDeTrabajo = 0;
}
public Alumno(int alumno_id, String apellidoNombre, double evaluacionParcial1,
double evaluacionParcial2, double promedioDeTrabajo, double
promedioFinal)
{ this.alumno_id
= alumno_id;
this.apellidoNombre
= apellidoNombre;
this.evaluacionParcial1
= evaluacionParcial1;
this.evaluacionParcial2
= evaluacionParcial2;
this.promedioDeTrabajo
= promedioDeTrabajo;
this.promedioFinal
= promedioFinal;
}
public void setPromedioFinal()
{ this.promedioFinal = (this.evaluacionParcial1 + this.evaluacionParcial2 +
this.promedioDeTrabajo) / 3;
}
public override String ToString()
{ return apellidoNombre;
}
}
}

9.7. Cdigo de la Aplicacin- Clase AlumnoDAO

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 112

Microsoft C# - Archivo de datos

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using ABCMyMVC.Modelo.Entidad;
namespace ABCMyMVC.Modelo.Datos
{ public class AlumnoDAO
{ SqlConnection oSqlConnection;
public Boolean insertarRegistro(Alumno oAlumno)
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.InsertarAlumno",
oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id",
oAlumno.alumno_id));
oSqlCommand.Parameters.Add(new SqlParameter("@apellidoNombre",
oAlumno.apellidoNombre));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial1",
oAlumno.evaluacionParcial1));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial2",
oAlumno.evaluacionParcial2));
oSqlCommand.Parameters.Add(new SqlParameter("@promedioTrabajo",
oAlumno.promedioDeTrabajo));
oSqlCommand.Parameters.Add(new SqlParameter("@promedioFinal",
oAlumno.promedioFinal));

oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;

}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return false;
}
}
public Alumno consultarRegistro(int busqueda)
{ try
{ Alumno oAlumno;
SqlConnection oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.consultarAlumno",
oSqlConnection);

["alumno_id"];

oSqlCommand.CommandType=CommandType.StoredProcedure;
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id", busqueda));
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();
if(oSqlDataReader.Read())
{ oAlumno=new Alumno();
oAlumno.alumno_id
= (int)
oSqlDataReader

["apellidoNombre"];
["evaluacionParcial1"];
["evaluacionParcial2"];

oAlumno.apellidoNombre

= (String) oSqlDataReader

oAlumno.evaluacionParcial1

= (double)

oAlumno.evaluacionParcial2 = (double)

oSqlDataReader
oSqlDataReader

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 113

Microsoft C# - Archivo de datos

["promedioDeTrabajo"];
["promedioFinal"];

oAlumno.promedioDeTrabajo

= (double)

oSqlDataReader

oAlumno.promedioFinal

= (double)

oSqlDataReader

oSqlDataReader.Close();
return oAlumno;

else
{ return null;
}
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return null;
}
}
public Boolean modificarRegistro(int busqueda, Alumno oAlumno)
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.ModificarAlumno",
oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id",
oAlumno.alumno_id));
oSqlCommand.Parameters.Add(new SqlParameter("@apellidoNombre",
oAlumno.apellidoNombre));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial1",
oAlumno.evaluacionParcial1));
oSqlCommand.Parameters.Add(new SqlParameter("@evaluacionParcial2",
oAlumno.evaluacionParcial2));
oSqlCommand.Parameters.Add(new SqlParameter("@promedioTrabajo",
oAlumno.promedioDeTrabajo));
oSqlCommand.Parameters.Add(new SqlParameter("@promedioFinal",
oAlumno.promedioFinal));
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return false;
}
}
public Boolean eliminarRegistro(int busqueda)
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.EliminarAlumno",
oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id",
busqueda));

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 114

Microsoft C# - Archivo de datos

oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return false;
}
}
public int buscarRegistro(int busqueda)
{ Alumno oAlumno = new Alumno();
try
{ SqlConnection oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.ConsultarAlumno",
oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.Parameters.Add(new SqlParameter("@alumno_id",
oAlumno.alumno_id));
SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();
if(oSqlDataReader.Read())
{ oAlumno.alumno_id
= (int)oSqlDataReader
["alumno_id"];
oAlumno.apellidoNombre
= (String)oSqlDataReader
["apellidoNombre"];
oAlumno.evaluacionParcial1 = (double)oSqlDataReader
["evaluacionParcial1"];
oAlumno.evaluacionParcial2 = (double)oSqlDataReader
["evaluacionParcial2"];
oAlumno.promedioDeTrabajo = (double)oSqlDataReader
["promedioDeTrabajo"];
oAlumno.promedioFinal
= (double)oSqlDataReader
["promedioFinal"];
oSqlDataReader.Close();
oSqlConnection.Close();
return oAlumno.alumno_id;
}
return -99;
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return -99;
}
}
public List<Alumno> obtenerDatosEnList()
{ List<Alumno> oListAlumno = new List<Alumno>();
try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new SqlCommand("dbo.ListarAlumnos",
oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 115

Microsoft C# - Archivo de datos

SqlDataReader oSqlDataReader = oSqlCommand.ExecuteReader();


Alumno oAlumno;
while(oSqlDataReader.Read())
{ oAlumno
= new Alumno();
oAlumno.alumno_id
= (int)oSqlDataReader["alumno_id"];
oAlumno.apellidoNombre
=
(String)oSqlDataReader["apellidoNombre"];
oAlumno.evaluacionParcial1 =
(double)oSqlDataReader["evaluacionParcial1"];
oAlumno.evaluacionParcial2 =
(double)oSqlDataReader["evaluacionParcial2"];
oAlumno.promedioDeTrabajo =
(double)oSqlDataReader["promedioDeTrabajo"];
oAlumno.promedioFinal
=
(double)oSqlDataReader["promedioFinal"];
oListAlumno.Add(oAlumno);
}
oSqlDataReader.Close();
oSqlConnection.Close();
return oListAlumno;
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return null;
}
}
public Boolean calcularPromedioFinalConCommand()
{ try
{ oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
SqlCommand oSqlCommand = new
SqlCommand("dbo.CalculoPromedioFinal", oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.ExecuteNonQuery();
oSqlConnection.Close();
return true;
}
catch(System.Exception e)
{ oSqlConnection.Close();
MessageBox.Show("Error ...!!!" + e.Message);
return false;
}
}
}
}
}
9.8: Cdigo de la Aplicacin- Clase Controlador Alumno
using System;
using System.Collections.Generic;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 116

Microsoft C# - Archivo de datos

using ABCMyMVC.Modelo.Entidad;
using ABCMyMVC.Modelo.Datos;
namespace ABCMyMVC.Controlador
{ public class ControladorAlumno
{ public Boolean insertarRegistro(Alumno oAlumno)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.insertarRegistro(oAlumno);
}
public Alumno consultarRegistro(int busqueda)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.consultarRegistro(busqueda);
}
public Boolean modificarRegistro(int busqueda, Alumno oAlumno)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.modificarRegistro(busqueda, oAlumno);
}
public Boolean eliminarRegistro(int busqueda)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.eliminarRegistro(busqueda);
}
public int buscarRegistro(int busqueda)
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.buscarRegistro(busqueda);
}
public List<Alumno> obtenerDatosEnList()
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.obtenerDatosEnList();
}
public Boolean calcularPromedioFinalConCommand()
{ AlumnoDAO oAlumnoDAO = new AlumnoDAO();
return oAlumnoDAO.calcularPromedioFinalConCommand();
}
}
}
Figura 9.9: Cdigo de la Aplicacin - Clase FormularioABCMyMVCyBD (Vista)
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using ABCMyMVC.Util;
using ABCMyMVC.Modelo.Entidad;
using ABCMyMVC.Controlador;
namespace Vista
{ public partial class FormularioABCMyMVCyBD: Form
{ private int action = ABCMAction.NO_ACTION;
public FormularioABCMyMVCyBD()
{ InitializeComponent();
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
public Alumno getObjetoAlumno()

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 117

Microsoft C# - Archivo de datos

{ Alumno oAlumno
= new Alumno();
oAlumno.alumno_id
= int.Parse(textBoxAlumno_id.Text);
oAlumno.apellidoNombre
= textBoxApellidoNombre.Text;
oAlumno.evaluacionParcial1 =
double.Parse(textBoxEvaluacionParcial1.Text);
oAlumno.evaluacionParcial2 =
double.Parse(textBoxEvaluacionParcial2.Text);
oAlumno.promedioDeTrabajo =
double.Parse(textBoxPromedioDeTrabajo.Text);
return oAlumno;
}
public void setObjetoAlumno(Alumno oAlumno)
{ textBoxAlumno_id.Text
= oAlumno.alumno_id + "";
textBoxApellidoNombre.Text
= oAlumno.apellidoNombre + "";
textBoxEvaluacionParcial1.Text = oAlumno.evaluacionParcial1 + "";
textBoxEvaluacionParcial2.Text = oAlumno.evaluacionParcial2 + "";
textBoxPromedioDeTrabajo.Text = oAlumno.promedioDeTrabajo + "";
}

public void actualizarDataGridViewAlumno()


{ limpiarDataGridViewAlumno();
ControladorAlumno oControladorAlumno = new ControladorAlumno();
List<Alumno> oListAlumno = oControladorAlumno.obtenerDatosEnList();
for(int posicion = 0; posicion < oListAlumno.Count; posicion = posicion + 1)
{ if(oListAlumno[posicion].alumno_id != 0)
{ dataGridViewAlumno.Rows.Add(oListAlumno[posicion].alumno_id,
oListAlumno[posicion],
oListAlumno[posicion].evaluacionParcial1,
oListAlumno[posicion].evaluacionParcial2,
oListAlumno[posicion].promedioDeTrabajo,
oListAlumno[posicion].promedioFinal
);
}
}
}
private void habilitarBotonesABCM(Boolean cBuscar, Boolean cNuevo, Boolean
cGuardar,
Boolean cEditar, Boolean cEliminar, Boolean cConsultar, Boolean cCancelar, Boolean
cSalir)
{ buttonBuscar.Enabled = cBuscar;
buttonNuevo.Enabled
= cNuevo;
buttonGuardar.Enabled = cGuardar;
buttonModificar.Enabled = cEditar;
buttonEliminar.Enabled = cEliminar;
buttonConsultar.Enabled = cConsultar;
buttonCancelar.Enabled = cCancelar;
buttonSalir.Enabled
= cSalir;
}
private void limpiarCajasDeTexto()
{ textBoxApellidoNombre.Text

= "";

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 118

Microsoft C# - Archivo de datos

textBoxEvaluacionParcial1.Text = "";
textBoxEvaluacionParcial2.Text = "";
textBoxPromedioDeTrabajo.Text = "";
}
private void habilitarCajasDeTexto(Boolean editable)
{ textBoxApellidoNombre.Enabled
= editable;
textBoxEvaluacionParcial1.Enabled = editable;
textBoxEvaluacionParcial2.Enabled = editable;
textBoxPromedioDeTrabajo.Enabled = editable;
}
private void buttonBuscar_Click(object sender, EventArgs e)
{ if (action == ABCMAction.ACTION_BUSCAR)
{ Alumno oAlumno
= new Alumno();
ControladorAlumno oControladorAlumno = new ControladorAlumno();
int busqueda = int.Parse(textBoxAlumno_id.Text);
oAlumno
= oControladorAlumno.consultarRegistro(busqueda);
if (oAlumno != null)
{ MessageBox.Show("Registro existente !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
else
{ action = ABCMAction.ACTION_INSERTAR;
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(true);
controladorDeEventosBotonesABCM();
textBoxApellidoNombre.Focus();
}
}
else
{ if (action == ABCMAction.ACTION_CONSULTA)
{ ControladorAlumno oControladorAlumno = new
ControladorAlumno();
int busqueda = Int32.Parse(textBoxAlumno_id.Text);
Alumno oAlumno =
oControladorAlumno.consultarRegistro(busqueda);
if (oAlumno != null)
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
setObjetoAlumno(oAlumno);
}
else
{ MessageBox.Show("No se encuentra !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
}
}
private void buttonNuevo_Click(object sender, EventArgs e)
{ dataGridViewAlumno.ClearSelection();
dataGridViewAlumno.Enabled = false;

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 119

Microsoft C# - Archivo de datos

textBoxAlumno_id.Text = "";
limpiarCajasDeTexto();
action = ABCMAction.ACTION_BUSCAR;
controladorDeEventosBotonesABCM();
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();
}
private void buttonGuardar_Click(object sender, EventArgs e)
{ if(action == ABCMAction.ACTION_INSERTAR)
{ if(MessageBox.Show("Desea guardarlo?", "Confirme el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{ ControladorAlumno oControladorAlumno = new ControladorAlumno();
if(oControladorAlumno.insertarRegistro(getObjetoAlumno()))
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
buttonNuevo.Focus();
}
else
{ MessageBox.Show("No se pudo guardar el registro ... !!!");
}
}
else
{ limpiarCajasDeTexto();
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ if(action == ABCMAction.ACTION_MODIFICAR)
{ if(MessageBox.Show("Est seguro de guardar los datos?", "Confirme
el guardado",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ ControladorAlumno oControladorAlumno = new
ControladorAlumno();
Alumno oAlumno = new Alumno();
if(oControladorAlumno.modificarRegistro(int.Parse(textBoxAlumno_id.Text),
getObjetoAlumno()))
{ MessageBox.Show("Operacin exitosa ... !!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else
{ MessageBox.Show("No se pudo guardar el registro ...!!!");
}
}
}
}
}
private void buttonModificar_Click(object sender, EventArgs e)
{ if(dataGridViewAlumno.RowCount >= 1)

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 120

Microsoft C# - Archivo de datos

{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;


if(filaSeleccionada != -1 && (textBoxAlumno_id.Text.Length) > 0)
{ textBoxApellidoNombre.Focus();
action = ABCMAction.ACTION_MODIFICAR;
controladorDeEventosBotonesABCM();
}
else
{ MessageBox.Show("No se ha seleccionado un registro ...!!!");
}
}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonEliminar_Click(object sender, EventArgs e)
{ if(dataGridViewAlumno.RowCount >= 1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if(filaSeleccionada != -1 && (textBoxAlumno_id.Text.Length) > 0)
{ if(MessageBox.Show("Est seguro de eliminar los datos?", "Confirme la
eliminacin",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ ControladorAlumno oControladorAlumno = new
ControladorAlumno();
Alumno oAlumno = new Alumno();
int busqueda = int.Parse(textBoxAlumno_id.Text);
oAlumno = oControladorAlumno.consultarRegistro(busqueda);
if(oAlumno != null)
{ oAlumno = getObjetoAlumno();
if(oControladorAlumno.eliminarRegistro(busqueda))
{ MessageBox.Show("Se elimin el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
actualizarDataGridViewAlumno();
}
else
{ MessageBox.Show("No se pudo eliminar el registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ MessageBox.Show("No se pudo eliminar el
registro ...!!!");
action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
}
}
else
{ MessageBox.Show("Se tiene que seleccionar un registro ...!!!");
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 121

Microsoft C# - Archivo de datos

}
else
{ MessageBox.Show("No existen registros ...!!!");
}
}
private void buttonCancelar_Click(object sender, EventArgs e)
{ action = ABCMAction.NO_ACTION;
controladorDeEventosBotonesABCM();
buttonNuevo.Focus();
}
private void buttonSalir_Click(object sender, EventArgs e)
{ Dispose();
}
private void dataGridViewAlumno_MouseClick(object sender, MouseEventArgs e)
{ if(e.Clicks == 1 && dataGridViewAlumno.RowCount >= 1)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index;
if(filaSeleccionada != -1)
{ Alumno oAlumnoSeleccionado =
(Alumno)dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void limpiarDataGridViewAlumno()
{ dataGridViewAlumno.Rows.Clear();
}
private void controladorDeEventosBotonesABCM()
{ if (action == ABCMAction.NO_ACTION)
{ actualizarDataGridViewAlumno();
textBoxAlumno_id.Text = "";
limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = false;
habilitarCajasDeTexto(false);
habilitarBotonesABCM(false, true, false, true, true, true, false, true);
dataGridViewAlumno.Enabled = true;
buttonNuevo.Focus();
}
else
{ if (action == ABCMAction.ACTION_BUSCAR)
{ habilitarCajasDeTexto(false);
limpiarCajasDeTexto();
habilitarBotonesABCM(true, false, false, false, false, false, true, false);
}
else
{ if (action == ABCMAction.ACTION_INSERTAR)
{ limpiarCajasDeTexto();
textBoxAlumno_id.Enabled = true;
habilitarBotonesABCM(true, false, true, false, false, false, true,
false);
}
else
{ if (action == ABCMAction.ACTION_MODIFICAR)
{ habilitarCajasDeTexto(true);

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 122

Microsoft C# - Archivo de datos

habilitarBotonesABCM(false, false, true, false, false, false,


true, false);
textBoxAlumno_id.Enabled = false;
}
else
{ if (action == ABCMAction.ACTION_ELIMINAR)
{ actualizarDataGridViewAlumno();
}
else
{ if (action == ABCMAction.ACTION_CONSULTA)
{ habilitarCajasDeTexto(false);
habilitarBotonesABCM(true, false, false, false, false, false,
true, false);

textBoxAlumno_id.Enabled = true;
}
}
}
}
}
}

}
private void buttonCalcularPromedioFinalConCommand_Click(object sender,
EventArgs e)
{ ControladorAlumno oControladorAlumno = new ControladorAlumno();
oControladorAlumno.calcularPromedioFinalConCommand();
actualizarDataGridViewAlumno();
}
private void dataGridViewAlumno_KeyDown(object sender, KeyEventArgs e)
{ if(e.KeyCode == Keys.Down)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index + 1;
if(filaSeleccionada >= dataGridViewAlumno.RowCount)
{ filaSeleccionada = filaSeleccionada - 1;
}
else
{ Alumno oAlumnoSeleccionado =
(Alumno)dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
if(e.KeyCode == Keys.Up)
{ int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index - 1;
if(filaSeleccionada <= -1)
{ filaSeleccionada = filaSeleccionada + 1;
}
else
{ Alumno oAlumnoSeleccionado =
(Alumno)dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value;
setObjetoAlumno(oAlumnoSeleccionado);
}
}
}
private void buttonImprimir_Click(object sender, EventArgs e)
{ FormularioImprimir oFormularioImprimir=new FormularioImprimir();
oFormularioImprimir.Show();

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 123

Microsoft C# - Archivo de datos

}
private void buttonConsultar_Click(object sender, EventArgs e)
{ dataGridViewAlumno.ClearSelection();
limpiarCajasDeTexto();
textBoxAlumno_id.Text = "";
textBoxAlumno_id.Enabled = true;
textBoxAlumno_id.Focus();
action = ABCMAction.ACTION_CONSULTA;
controladorDeEventosBotonesABCM();
}
}
}

Figura 9.10: Cdigo de la Aplicacin Clase FormularioImprimir(Vista)


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using ABCMyMVC.Modelo.Datos;
using ABCMyMVC.Vista;
namespace Vista
{ public partial class FormularioImprimir: Form
{ public FormularioImprimir()
{ InitializeComponent();
}
private void FormularioImprimir_Load(object sender, EventArgs e)
{ poblarReporte();
}
private void poblarReporte()
{ //Definimos las sentencias las cuales seleccionan los datos
string sentencia = "select * from Alumno";
// Se crea un conjunto de datos del tipo DataSetAlumno
DataSetAlumno oDataSetProducto = new DataSetAlumno();
try
{ // Se solicita y abre una conexin a base de datos
SqlConnection oSqlConnection = AdministradorDeConexion.getConexion();
oSqlConnection.Open();
//creamos el adaptador de datos

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 124

Microsoft C# - Archivo de datos

SqlDataAdapter oSqlDataAdapter = new SqlDataAdapter(sentencia,


oSqlConnection);
// Se pobla las tablas del conjunto de datos tipeado
oSqlDataAdapter.Fill(oDataSetProducto, "Alumno");
//Ahora poblamos el informe y lo mostramos
CrystalReportAlumno oCrystalReportAlumno = new CrystalReportAlumno();
oCrystalReportAlumno.SetDataSource(oDataSetProducto);
crystalReportViewerAlumno.ReportSource = oCrystalReportAlumno;
oSqlConnection.Close();
}
catch(Exception e)
{ MessageBox.Show(e.Message);
}
}
}
}

Figura 9.11: Formulario de la aplicacin (Reporte de alumnos)

Figura 9.12: Cdigo de la Aplicacin Programa principal


using System;
using System.Windows.Forms;
using vista;
namespace ABCMyMVC
{ static class Program
{ static void Main()
{ Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormularioABCMyMVCyBD());
}
}
}

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 125

Microsoft C# - Archivo de datos

Figura 9.13: Cdigo SQL para creacin de base de datos dbAlumno y tablas Alumno

Figura 9.14: Base de datos en el Administrador del Micrsoft SQL Server 2008.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 126

Microsoft C# - Archivo de datos

Figura 9.15: Cdigo SQL para la base de datos dbAlumno, tabla Alumno y los
procedimientos almacenados
USE MASTER
IF EXISTS ( SELECT name FROM sysdatabases WHERE name = 'dbAlumno' )
DROP DATABASE dbAlumno
GO
CREATE DATABASE dbalumno
GO
USE dbAlumno
GO
CREATE TABLE Alumno
( alumno_id
int not null,
apellidoNombre
char(31),
evaluacionParcial1
float,
evaluacionParcial2 float,
promedioDeTrabajo float,
promedioFinal
float
)
GO
ALTER TABLE Alumno ADD CONSTRAINT PK_Alumno_id PRIMARY KEY CLUSTERED (alumno_id)
GO

CREATE PROCEDURE InsertarAlumno


@alumno_id
@apellidoNombre

int,
char(31),

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 127

Microsoft C# - Archivo de datos


@evaluacionParcial1
@evaluacionParcial2
@promedioTrabajo
@promedioFinal

float,
float,
float,
float

AS
BEGIN
INSERT INTO [dbAlumno].[dbo].[Alumno]
([alumno_id],
[apellidoNombre],
[evaluacionParcial1],
[evaluacionParcial2],
[promedioDeTrabajo],
[promedioFinal])
VALUES
( @alumno_id,
@apellidoNombre,
@evaluacionParcial1,
@evaluacionParcial2,
@promedioTrabajo,
@promedioFinal);

END
GO
CREATE PROCEDURE ConsultarAlumno
@alumno_id int
AS
BEGIN
SELECT
[alumno_id],
[apellidoNombre],
[evaluacionParcial1],
[evaluacionParcial2],
[promedioDeTrabajo],
[promedioFinal]
FROM
Alumno
WHERE
Alumno.alumno_id=@alumno_id;
END
GO
CREATE PROCEDURE ModificarAlumno
@alumno_id int,
@apellidoNombre char(31),
@evaluacionParcial1 float,
@evaluacionParcial2 float,
@promedioTrabajo float,
@promedioFinal float

AS
BEGIN
UPDATE [dbAlumno].[dbo].[Alumno]
SET

[apellidoNombre]
= @apellidoNombre,
[evaluacionParcial1] = @evaluacionParcial1,
[evaluacionParcial2]
= @evaluacionParcial2,
[promedioDeTrabajo] = @promedioTrabajo,
[promedioFinal]
= @promedioFinal

WHERE [alumno_id] = @alumno_id


END
GO
CREATE PROCEDURE ListarAlumnos
AS
BEGIN
SELECT [alumno_id],
[apellidoNombre],
[evaluacionParcial1],

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 128

Microsoft C# - Archivo de datos


[evaluacionParcial2],
[promedioDeTrabajo],
[promedioFinal]

FROM Alumno;
END
GO
CREATE PROCEDURE EliminarAlumno
@alumno_id int
AS
BEGIN
DELETE
FROM Alumno
WHERE Alumno.alumno_id=@alumno_id;
END
GO
CREATE PROCEDURE CalculoPromedioFinal
AS
BEGIN
UPDATE [dbo].[Alumno]
SET promedioFinal=(evaluacionParcial1+evaluacionParcial2+promedioDeTrabajo)/3;
END
GO

El cdigo de la aplicacin se presenta en el Cd que acompaa el libro con el


nombre de FormularioABCM-MVC y Procedimientos Almacenados.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 129

Microsoft C# - Archivo de datos

BIBLIOGRAFA
Enciclopedia de Microsoft Visual C#. Fco Javier Ceballos. Alfaomega. Tercera Edicin. 2012. Mexico
Como programar en Java. Deitel, Harvey M.; Deitel, Paul J. Pearson Education. 5ta Edicin.
2004. Mxico.
Desarrollo de aplicaciones en Java. Castaeda Len, Juan Jos. Ritisa Graff. 1ra Edicin.
2007. Lima. 536 pginas.
Estructura de datos en Java: Compatible con Java 2. Allen Weiss, Mark. Pearson Education.
1ra Edicin. 2000. Madrid.
Java 2: Curso de programacin. Ceballos Sierra, Francisco Javier. Alfaomega Grupo Editor.
2da Edicin. 2003. Mxico.
Piensa en Java. Eckel, Bruce. Pearson Education. 2da Edicin. 2002. Madrid.
Problemas resueltos de programacin en Java. Prez Menor, Jos Mara; Carretero Prez,
Jess; Garca Carballeira, Flix. Thomson Learning. 1ra Edicin. 2003. Espaa.
Programacin en Java 2: Algoritmos, estructuras de datos y programacin orientada a
objetos. Joyanes Aguilar, Luis; Zahonero Martnez, Ignacio. McGraw-Hill Interamericana.
1ra Edicin. 2002. Espaa.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 130

Microsoft C# - Archivo de datos

ANEXO N01
A continuacin se presentan los comandos bsicos de base de datos del Microsoft SQL
Server 12 .
CREATE DATABASES
Crea una base de datos. Ejemplo:
create database dbalumno
USE
Indica al Microsoft SQL que use una base de datos especificada. Ejemplo:
use dbalumno
CREATE TABLE
Crea una tabla de base de datos. Ejemplo:
create table alumno
( alumno_id
int not null,
apellidoNombre
char(31),
evaluacionParcial1 float,
evaluacionParcial2
float,
promedioDeTrabajo
float,
promedioFinal
float
)
INSERT
Inserta registros en la tabla de base de datos. Ejemplo;
insert into alumno ( alumno_id, apellidoNombre, evaluacionParcial1, evaluacionParcial2,
promedioDeTrabajo, promedioFinal ) values ( 1, Arias, Alex, 11, 11, 11,11 )
insert into alumno ( alumno_id, apellidoNombre, evaluacionParcial1, evaluacionParcial2,
promedioDeTrabajo, promedioFinal ) values ( 2, Barreto, Byron, 12, 12, 12,12 )
SELECT
Visualiza los registros de una tabla. Ejemplo:
select * from alumno
----> Para visualizar todos los registros con todos sus campos
select alumno_id, apellidoNombre
from alumno ----> Para visualizar los campos
alumno_id y apellidoNombre de la tabla alumno
select count (*) from alumno ----> Para visualizar el nmero de registros almacenados en
la tabla alumno.
select from alumno order by alumno_id ----> Para visualizar los datos ordenados por el
campo alumno_id
UPDATE
Actualiza datos de registros en una tabla de base de datos. Ejemplo.
update alumno set evaluacionParcial = 10 where alumno_id = 1
La clusula where permite condicionar la actualizacin de un conjunto de registros
especficos. Si no se especifica un registro determinado, se actualizan todos los registros.

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 131

Microsoft C# - Archivo de datos

DELETE
Elimina registros
delete from alumno where alumno_id = 1
ALTER TABLE . . . DROP COLUMN . . .
Elimina una columna de la tabla. Ejemplo:
alter table tAlumno drop column promedioDeTrabajo
ALTER TABLE . . . ADD COLUMN . . .
Agrega una columna de la tabla. Ejemplo:
alter table talumno add

promedioDeTrabajo int

ALTER TABLE . . . MODIFY COLUMN . . .


Modifica el tipo de dato de una columna. Ejemplo:
alter table talumno alter column promedioDeTrabajo float
ALTER TABLE . . . CHANGE COLUMN . . .
Modifica el nombre de una columna. Ejemplo:
EXEC sp_rename 'tAlumno.apellidoNombre', 'ap'
EXEC sp_rename 'tAlumno.ap', 'apellidoNombre'
ALTER TABLE . . . ALTER COLUMN . . .
Modifica una columna de NULL a not NULL
ALTER TABLE tAlumno ALTER COLUMN alumno_id int not NULL
ALTER TABLE . . . ADD CONSTRAINT . . .
Crea un ndice de bsqueda en la tabla utilizando un campo clave. Ejemplo:
alter table talumno add constraint pk_alumno primary key (alumno_id)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Permite ver las tablas de una base de datos. Ejemplo
USE DbAlumno
Select table_name from information_schema.tables
Select table_name, column_name from information_schema.columns
DROP TABLE
Permite borrar una tabla de base de datos
drop table talumno
DROP DATABASE
Borra una base de datos. Ejemplo:
drop database dbalumno

Ing. Javier Alberto Manrique Quionez / Rudy Alvino Penadillo Lirio

Pgina 132