Está en la página 1de 23

Tutorial: mostrar datos en

un formulario Windows
Forms mediante una
consulta parametrizada
Visual Studio .NET 2003
Un escenario habitual es mostrar slo los datos seleccionados en un formulario; por
ejemplo, los pedidos de un cliente especificado o los libros de un autor determinado. En
este escenario, un usuario escribe informacin en un formulario y, a continuacin, se
ejecuta una consulta con la entrada del usuario como criterio; es decir, los datos se
seleccionan basndose en una consulta parametrizada. La consulta slo devuelve los
datos que necesita el usuario.
El uso de consultas parametrizadas ayuda a la aplicacin a ser ms eficaz permitiendo
a la base de datos realizar su trabajo en lo que es mejor, es decir, filtrando y
ordenando registros. Al contrario, si solicita una tabla de base de datos completa, la
transfiere en la red y, a continuacin, utiliza lgica de la aplicacin para buscar los
registros que necesita, la aplicacin podra llegar a ser lenta y difcil de utilizar.
En este tutorial, crear una formulario Windows Forms que muestra autores de la base
de datos estndar Pubs de SQL Server. Los usuarios podrn escribir un cdigo de
estados americanos (como CA para California) y llenar el conjunto de datos con una
lista de autores que viven en ese estado.

Para poder completar este tutorial, necesitar:

Acceso a un servidor con la base de datos de ejemplo Pubs de SQL Server.

El tutorial est dividido en varias partes ms pequeas:

Crear el formulario.

Crear y configurar el conjunto de datos con respecto al cual se enlazar el


formulario. Esto incluye crear una consulta que llene el conjunto de datos a
partir de la base de datos.

Agregar controles al formulario.

Agregar cdigo para actualizar el conjunto de datos con parmetros nuevos.

Agregar cdigo para desplazarse a lo largo de los autores.

Crear el proyecto y el formulario


El primer paso es crear un formulario Windows Forms.
Para crear el proyecto y el formulario
1. Si ya tiene una solucin abierta, seleccione Cerrar solucin en el
men Archivo.
Nota En proyectos de produccin, con mucha frecuencia tendr varios
proyectos en la misma solucin. No obstante, en este tutorial, cerrar cualquier
solucin abierta y crear una nueva junto con el proyecto, por lo que no existir
ninguna interferencia entre lo que har aqu y los formularios, conjuntos de
datos, etc. existentes.
2. En el men Archivo, elija Nuevo y, a continuacin, seleccione Proyecto. Se
muestra el cuadro de dilogo Nuevo proyecto.
3. En el panel Tipos de proyecto, elija Proyectos de Visual Basic, Proyectos
de Visual C# o Proyectos de Visual C++.
4. En el panel Plantillas, elija Aplicacin para Windows para proyectos de
Visual Basic o Visual C#, o elija Aplicacin de Windows Forms (.NET) para
proyectos de Visual C++.
5. Asigne un nombre al proyecto que sea nico y cumpla las convenciones de
nomenclatura utilizadas. Por ejemplo, podra denominar este proyecto
como Walkthrough_Parameters.
6. Cuando haya asignado un nombre, haga clic en Aceptar para crear el proyecto.
Visual Studio muestra un nuevo formularios en el Diseador de Windows Forms.

Crear y configurar un conjunto de datos


Como sucede con la mayora de los escenarios de acceso a datos en Visual Studio,
trabajar con un conjunto de datos. Un conjunto de datos es un contenedor, una cach,
que contiene los registros con los que le interesa trabajar.
Nota Usar un conjunto de datos es slo una de las opciones para obtener acceso a
datos, y no es la eleccin ideal en algunos escenarios. No obstante, los conjuntos de
datos son normalmente la eleccin correcta en las aplicaciones Windows Forms, por lo
que usar uno de ellos en este tutorial. Para obtener ms informacin,
vea Recomendaciones sobre la estrategia de acceso a datos.
En este tutorial, agregar un conjunto de datos al formulario. No obstante, no lo har
directamente, sino manualmente, agregndolo al formulario. En su lugar, seguir los
pasos siguientes:

Crear un adaptador de datos con un asistente. El adaptador contiene


instrucciones SQL que se utilizan para leer y escribir informacin en la base de
datos. El asistente le ayuda a definir las instrucciones SQL que necesita. Si es
preciso, el asistente tambin crea una conexin a la base de datos.

Generar el esquema del conjunto de datos. En este proceso, har que Visual
Studio cree una nueva clase conjunto de datos basndose en las tablas y
columnas a las que est obteniendo acceso. Cuando genera la clase conjunto de
datos, tambin agrega una instancia de ella al formulario.

Es importante que siga todos los procedimientos de esta seccin. En caso contrario, el
formulario no tendr el conjunto de datos que se va a utilizar en las subsiguientes
partes del tutorial.
Para obtener ms informacin sobre adaptadores, vea Introduccin a los adaptadores
de datos. Para obtener ms informacin acerca de los conjuntos de datos,
vea Introduccin a conjuntos de datos.

Configurar una conexin de datos y un adaptador de datos


Para empezar, cree un adaptador de datos que contenga la instruccin SQL que se
utilizar para llenar el conjunto de datos ms adelante. Como parte de este proceso,
defina una conexin para obtener acceso a la base de datos. Configure el adaptador de
datos con el asistente, lo que facilita la creacin de las instrucciones SQL necesarias
para obtener acceso a los datos.
Nota de seguridad El almacenamiento de los detalles de la cadena de conexin
(como el nombre de servidor, el nombre de usuario y la contrasea) puede afectar a la
seguridad de la aplicacin. El uso de la Seguridad integrada de Windows es un modo
ms seguro de controlar el acceso a una base de datos. Para obtener ms informacin,
vea Seguridad de bases de datos.
Nota Cuando el asistente haya finalizado, debe continuar en la seccin siguiente para
generar un conjunto de datos y completar la parte de acceso a datos del formulario.
Para crear la conexin de datos y el adaptador de datos
1. Desde la ficha Datos del Cuadro de herramientas, arrastre un
objeto OleDbDataAdapter al formulario.
Nota Tambin es posible usar el objeto SqlDataAdapter, que est optimizado
para trabajar con SQL Server 7.0 o posterior. En este tutorial, se usa el
objeto OleDbDataAdapter porque es ms genrico y proporciona acceso
mediante ADO.NET a cualquier origen de datos compatible con OLE DB.
Se inicia el Asistente para la configuracin del adaptador de datos, que
ayuda a crear la conexin y el adaptador.
2. En el asistente, haga lo siguiente:
a. En el segundo panel, cree o elija una conexin que apunte a la base de
datos Pubs de SQL Server.
b. En el tercer panel, especifique que desea usar una instruccin SQL para
obtener acceso a la base de datos.
c. En el cuarto panel, cree la siguiente instruccin SQL:

d. SELECT au_id, au_lname, state


e. FROM authors
f. WHERE (state = ?)
El signo de interrogacin (?) es el marcador de posicin del parmetro.
(Si utiliza la clase SqlDataAdapter para tener acceso a SQL Server
versin 7.0, los parmetros se especifican mediante variables con
nombre).
Sugerencia Para obtener ayuda sobre la generacin de la
instruccin SQL, haga clic en Generador de consultas para
iniciar el Generador de consultas. Para proporcionar el
marcador de posicin del parmetro, escriba el signo de
interrogacin en la columna Criteria del campo de estado.
3. El asistente crea una conexin (OleDbConnection1 en Visual Basic
u oleDbConnection1 en Visual C# o Visual C++) y un adaptador de datos
(OleDbDataAdapter1 en Visual Basic u oleDbDataAdapter1 en Visual C# o
Visual C++).
4. Cuando el asistente haya finalizado, genere el conjunto de datos basndose en
la consulta SQL que ha creado durante este procedimiento. Para obtener ms
informacin, vea la siguiente seccin.
El adaptador de datos realmente contiene cuatro instrucciones SQL, no slo la
instruccin Select que ha creado, si no tambin instrucciones adicionales para
actualizar, insertar y eliminar registros. En este tutorial, slo se utilizar la instruccin
Select.
La instruccin Select de SQL del adaptador se almacena como parte de la
propiedad SelectCommand del adaptador de datos. La
propiedad SelectCommand contiene un objeto de comando de datos (un objeto de
tipo OleDbDataComman) que, a su vez, contiene no slo la instruccin SQL, sino
tambin otra informacin que necesita esa instruccin. Ms concretamente, el
comando contiene una coleccin Parameters. Esta coleccin contiene un objeto de
parmetro (de tipo OleDbParameter) por cada parmetro que se va a pasar a y desde
la instruccin SQL. Por supuesto, en este caso, slo hay un parmetro, es decir, el valor
de la columna de estado. De forma predeterminada, el Asistente para la configuracin
del adaptador de datos genera el parmetro con el nombre de la columna; por tanto, el
parmetro se denomina "estado". Posteriormente, en este tutorial, aprender a
establecer el valor del parmetro antes de ejecutar la instruccin SQL.

Crear el conjunto de datos

Despus de haber establecido los mtodos para conectarse a la base de datos y de


especificar la informacin que desea (a travs del comando SQL del adaptador de
datos), puede hacer que Visual Studio cree un conjunto de datos. Visual Studio puede
generar el conjunto de datos automticamente basndose en la consulta que ha
especificado para el adaptador de datos. El conjunto de datos es una instancia de la
clase DataSet basada en un esquema XML correspondiente (archivo .xsd) que
describe los elementos de la clase (tabla, columnas y restricciones). Para obtener ms

informacin acerca de la relacin entre los conjuntos de datos y los esquemas,


vea Introduccin al acceso a datos con ADO.NET.
Para generar un conjunto de datos
1. Desde el men Datos, elija Generar conjunto de datos.
Sugerencia Si no ve el men Datos, haga clic en el formulario; el formulario
debe tener el foco para que aparezca el men.
Se mostrar el cuadro de dilogo Generar conjunto de datos.
2. Llame al conjunto de datos dsAuthors y marque la casilla Agregar este
conjunto de datos al diseador; a continuacin, haga clic en Aceptar.
Visual Studio genera una clase de conjunto de datos con tipo (dsAuthors) y un
esquema que define el conjunto de datos. Ver el nuevo esquema
(dsAuthors.xsd) en el Explorador de soluciones. Si elige la opcin Mostrar
todos los archivos del Explorador de soluciones, ver que el archivo de
esquema tiene un archivo .vb o .cs dependiente que contiene el cdigo que
define la nueva clase de objeto dataset.
Por ltimo, Visual Studio agrega una instancia de la nueva clase de conjunto de
datos (DsAuthors1 en Visual Basic o dsAuthors1en Visual C# o Visual C++) al
formulario.
Llegados a este punto, tiene configurado todo lo necesario para obtener informacin de
la base de datos y almacenarla en un conjunto de datos. Ya puede crear un formulario
que muestre los datos.

Agregar controles para mostrar datos


Para este tutorial, el formulario necesitar una manera en la que los usuarios escriban
un cdigo de estado, un modo de ejecutar la consulta y otro para mostrar informacin
del autor.
Para agregar controles al formulario
1. Agregue los siguientes controles al formulario, y deles un nombre como se
indica:

Control

TextBox

Button

TextBox

TextBox

TextBox

2. Agregue etiquetas delante de los cuadros de texto para indicar su funcin.

Agregar cdigo para llenar el conjunto de datos


Cuando se muestra el formulario, el conjunto de datos no se llena automticamente
con informacin de la base de datos. Si no se debe llenar el conjunto de datos
explcitamente. En este tutorial, cada vez que el usuario hace clic en el botn Mostrar,
se vuelve a ejecutar la consulta especificada en el adaptador de datos y el resultado
alimenta el conjunto de datos. En este caso, la consulta requiere un parmetro. El valor
del parmetro es la informacin que el usuario escribe en el cuadro de
texto txtStateParameter.
Ejecute la consulta en cdigo llamando al mtodo Fill del adaptador de datos.
Para escribir cdigo para llenar el conjunto de datos

Haga doble clic en el botn Mostrar para crear un mtodo para el evento Click.
Agregue cdigo al controlador para:

Establecer el valor del nico parmetro requerido por la instruccin SQL


que ha creado antes. Lo establecer en el valor que el usuario haya
escrito en el cuadro de texto txtStateParameter.

Llamar al mtodo Clear del conjunto de datos. Si no lo borra, los


registros devueltos por una consulta se anexan al conjunto de datos.

Llamar al mtodo Fill del adaptador de datos, pasndole una referencia


al conjunto de datos y al valor del parmetro que se va a incluir en la
consulta.

En el ejemplo siguiente se muestra la apariencia del cdigo para el mtodo:


' Visual Basic

Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnShow.Click
' The following line passes the value the user enter for state
' to the SQL Select statement.
OleDbDataAdapter1.SelectCommand.Parameters("state").Value =
txtStateParameter.Text
DsAuthors1.Clear()
OleDbDataAdapter1.Fill(DsAuthors1)
End Sub
// C#
private void btnShow_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["state"].Value =
txtStateParameter.Text;
dsAuthors1.Clear();
oleDbDataAdapter1.Fill(dsAuthors1);
}
// C++
private:
System::Void btnShow_Click(System::Object * sender,
System::EventArgs * e)
{
oleDbDataAdapter1->SelectCommand->Parameters->
Item[S"state"]->Value = txtStateParameter->Text;
dsAuthors1->Clear();
oleDbDataAdapter1->Fill(dsAuthors1);
}

Enlazar los cuadros de texto al conjunto de datos


Los tres cuadros de texto de autores pretenden mostrar informacin de un nico
registro en la tabla de datos Authors del conjunto de datos. Para hacer que esto se
produzca automticamente, enlace columnas de la tabla de datos a cuadros de texto.
El mecanismo de enlace del formulario garantiza que los controles del cuadro de texto
se actualizan automticamente cada vez que se mueve a otro registro.
En el tutorial, enlazar la propiedad Text de los controles del cuadro de texto a la
columna que desee mostrar. En realidad, puede enlazar cualquier propiedad del control
de cuadro de texto a cualquier columna del conjunto de datos y tambin puede enlazar
varias propiedades de un control. Para obtener ms informacin, vea Arquitectura de
datos en formularios Windows Forms.
Para enlazar cuadros de texto al conjunto de datos
1. Vuelva al diseador de formularios.
2. Seleccione el cuadro de texto del primer autor y presione F4 para abrir la
ventana Propiedades.

3. Expanda el nodo (DataBindings) y, para la propiedad Text,


expanda DsAuthors1, expanda authors y seleccione au_id en la lista
desplegable.
4. Repita los pasos 2 y 3 para los otros dos cuadros de texto de autores restantes,
enlcelos a DsAduthors1.authors.au_lname yDsAduthors1.authors.state,
respectivamente.
Ahora, los controles estn en disposicin de mostrar datos de cada fila del conjunto de
datos. No obstante, an necesita una forma para moverse de una fila a la siguiente.

Agregar controles de desplazamiento


Finalmente, agregue controles de desplazamiento al formulario En este tutorial,
agregar los botones Anterior y Siguiente. (Tambin podra agregar los botones Primero
y ltimo, pero slo son sencillas variaciones de Anterior y Siguiente.) Tambin agregar
un cuadro de texto que muestra la posicin del registro actual.
En un formulario Windows Forms, la informacin acerca de la posicin actual y el
contador de registros en una tabla de datos individual, as como la informacin acerca
de los enlaces entre tablas de datos y controles, se mantiene en un
objeto CurrencyManager. En un formulario pueden existir varias tablas de datos
(todas con enlaces distintos y contadores y posiciones en tiempo de ejecucin), cada
una con su propio objeto CurrencyManager. Para administrar los distintos
objetos CurrencyManager posibles, el formulario incluye un
objetoBindingContext que proporciona una interfaz nica para todos los
administradores de listas.
La posicin del registro actual en una tabla de datos est disponible en la
propiedad Position que se expone a travs del objetoBindingContext. Para
desplazarse, cambie el valor de esta propiedad. Para determinar el nmero de registros
que hay en una tabla, puede consultar la propiedad Count del
objeto BindingContext.
Para agregar controles de desplazamiento
1. Agregue los controles siguientes al formulario y establezca las propiedades
como se indica:

Control

Button

Button

2. Cree un mtodo de control de eventos para el evento Click del botn Anterior.
Agregue cdigo para disminuir la propiedadPosition del
objeto BindingContext. El cdigo presentar la siguiente apariencia:
3. ' Visual Basic
4. Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnPrevious.Click
5.
Me.BindingContext(DsAuthors1, "authors").Position -= 1
6. End Sub
7.
8. // C#
9. private void btnPrevious_Click(object sender, System.EventArgs e)
10. {
11.
this.BindingContext[dsAuthors1, "authors"].Position -=1 ;
12. }
13.
14. // C++
15. private:
16.
System::Void btnPrevious_Click(System::Object * sender,
17.
System::EventArgs * e)
18.
{
19.
this->BindingContext->get_Item(dsAuthors1, S"authors")>Position =
20.
this->BindingContext->get_Item(dsAuthors1,
21.
S"authors")->Position - 1;
22.
}
23. Haga lo mismo para el botn Siguiente, slo aumente la posicin. Utilice
cdigo como el siguiente:
24. ' Visual Basic
25. Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles btnNext.Click
26.
Me.BindingContext(DsAuthors1, "authors").Position += 1
27. End Sub
28.
29. // C#
30. private void btnNext_Click(object sender, System.EventArgs e)
31. {
32.
this.BindingContext[dsAuthors1, "authors"].Position +=1 ;
33. }
34.
35. // C++
36. private:
37.
System::Void btnNext_Click(System::Object * sender,
38.
System::EventArgs * e)
39.
{
40.
this->BindingContext->get_Item(dsAuthors1, S"authors")>Position =

41.
42.
43.

this->BindingContext->get_Item(dsAuthors1,
S"authors")->Position + 1;
}

Mostrar la posicin del registro actual


Finalmente, puede crear un mtodo ShowPosition para mostrar la posicin del
registro actual.
Para mostrar la posicin del registro actual
1. Agregue un control TextBox al formulario y pngale el nombre txtPosition.
Sugerencia Establezca la propiedad Enabled en False, as esos usuarios
pueden ver la posicin actual, pero no pueden cambiar el valor del control.
2. Cree un mtodo en el formulario denominado ShowPosition. En el mtodo,
obtenga la posicin actual del objeto BindingContexty mustrela en el cuadro
de texto. En el ejemplo siguiente se muestra la apariencia del cdigo:
3. ' Visual Basic
4. Private Sub ShowPosition()
5.
Dim iCnt As Integer
6.
Dim iPos As Integer
7.
iCnt = Me.BindingContext(DsAuthors1, "authors").Count
8.
If iCnt = 0 Then
9.
txtPosition.Text = "(No records)"
10.
Else
11.
iPos = Me.BindingContext(DsAuthors1, "authors").Position + 1
12.
txtPosition.Text = iPos.ToString & " of " & iCnt.ToString
13.
End If
14. End Sub
15.
16. // C#
17. private void ShowPosition()
18. {
19.
int iCnt;
20.
int iPos;
21.
iCnt = this.BindingContext[dsAuthors1, "authors"].Count;
22.
iPos = this.BindingContext[dsAuthors1, "authors"].Position + 1;
23.
if(iCnt == 0)
24.
{
25.
txtPosition.Text = "(No records)";
26.
}
27.
else
28.
{
29.
txtPosition.Text = iPos.ToString() + " of " +
iCnt.ToString() ;
30.
}
31. }
32.

33. // C++
34. private:
35.
void ShowPosition()
36.
{
37.
int iCnt;
38.
int iPos;
39.
iCnt = this->BindingContext->get_Item(dsAuthors1,
40.
S"authors")->Count;
41.
iPos = this->BindingContext->get_Item(dsAuthors1,
42.
S"authors")->Position + 1;
43.
if(iCnt == 0)
44.
{
45.
txtPosition->Text = S"(No records)";
46.
}
47.
else
48.
{
49.
txtPosition->Text = String::Concat(iPos.ToString(),
50.
S" of ", iCnt.ToString());
51.
}
52.
}
53. Agregue una llamada al mtodo ShowPosition en cualquier lugar del cdigo
donde pueda cambiar la posicin registro actual. Para este tutorial, agrguelo
en estos lugares:

Despus de llamar al mtodo Fill en el mtodo de control de


eventos Click para el botn Mostrar.

Despus de cambiar la posicin del registro en los mtodos Click para


los botones Anterior y Siguiente. Por ejemplo, el mtodo de control de
eventos completo para el mtodo Previous presentar la apariencia
siguiente:

' Visual Basic


Private Sub btnPrevious_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnPrevious.Click
Me.BindingContext(DsAuthors1, "authors").Position -= 1
ShowPosition()
End Sub

// C#
private void btnPrevious_Click(object sender,
System.EventArgs e)
{
this.BindingContext[dsAuthors1, "authors"].Position -=1 ;
ShowPosition();
}
// C++

private:
System::Void btnPrevious_Click(System::Object * sender,
System::EventArgs * e)
{
this->BindingContext->get_Item(dsAuthors1, S"authors")>Position
= this->BindingContext->get_Item(dsAuthors1,
S"authors")->Position - 1;
ShowPosition();
}

Pruebas
Ahora puede comprobar el formulario para asegurarse de que muestra los datos
correctamente basndose en el parmetro que escriba.
Para comprobar el formulario
1. Presione F5 para ejecutar el formulario.
2. Cuando se muestre el formulario, escriba CA en el cuadro de texto de estado y,
a continuacin, haga clic en Mostrar.
Se muestra el primer autor que vive en California.
3. Haga clic en los botones Anterior y Siguiente para desplazarse a travs de los
autores.
4. Escriba un nuevo valor en el cuadro de texto de estado (por ejemplo, pruebe
con UT para Utah) y, a continuacin, haga clic enMostrar.
Confirme que se muestra un autor nuevo y que tambin ha cambiado el
contador de registros.

Pasos siguientes
Cuando haya terminado este tutorial, tendr un formulario enlazado a datos sencillo.
Hay varias mejoras que podra hacer, entre ellas:

Mostrar cdigos de estado en un cuadro de lista desplegable en vez de hacer


que los usuarios los escriban. Una forma podra ser agregar otro adaptador de
datos al formulario con la instruccin SQL SELECT DISTINCT state FROM
authors, generar un segundo conjunto de datos y enlazar un cuadro de lista a
ese conjunto de datos.

Comprobar que la consulta ha devuelto registros. Para ello, podra comprobar la


propiedad Count del objeto BindingContext; si es cero, puede mostrar un
mensaje. En el ejemplo siguiente se muestra una versin expandida del
controlador del botn Mostrar que incorpora esta comprobacin:

' Visual Basic

Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnShow.Click
OleDbDataAdapter1.SelectCommand.Parameters("state").Value =
txtStateParameter.Text
DsAuthors1.Clear()
OleDbDataAdapter1.Fill(DsAuthors1)
If Me.BindingContext(DsAuthors1, "authors").Count = 0 Then
MessageBox.Show("No authors found in state " &
txtStateParameter.Text)
txtStateParameter.Focus()
Else
ShowPosition()
End If
End Sub
// C#
private void btnShow_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["state"].Value =
txtStateParameter.Text;
dsAuthors1.Clear();
oleDbDataAdapter1.Fill(dsAuthors1);
if(this.BindingContext[dsAuthors1, "authors"].Count == 0)
{
MessageBox.Show("No authors found in " +
txtStateParameter.Text);
txtStateParameter.Focus();
}
else
{
ShowPosition();
}
}
// C++
private:
System::Void btnShow_Click(System::Object * sender,
System::EventArgs * e)
{
oleDbDataAdapter1->SelectCommand->Parameters->
Item[S"state"]->Value = txtStateParameter->Text;
dsAuthors1->Clear();
oleDbDataAdapter1->Fill(dsAuthors1);
if(this->BindingContext->get_Item(dsAuthors1,
"authors")->Count == 0)
{
MessageBox::Show(String::Concat(S"No authors found in ",
txtStateParameter->Text));
txtStateParameter->Focus();

}
else
{
ShowPosition();
}
}

Mostrar los autores de una cuadrcula enlazada a datos en vez de controles


individuales. De este modo, podra ver a todos los autores simultneamente.

Agregar botones que permitan al usuario agregar, modificar y eliminar autores.

Ejercicios propuestos y resueltos de ficheros en Java


Hola a todos, hoy os dejo una serie de ejercicios de Java para practicar todo aquello que hemos
explicado en anteriores posts, haciendo hincapi en los ficheros en Java, incluyendo la serializacin de
objetos
Todos los ejercicios que proponemos estn resueltos en este mismo post, intenta hacerlo por ti mismo y
si te quedas atascado puedes mirar la solucin. Recuerda, que no tiene por que estar igual tu solucin
con la del post, el objetivo es que aprendas no que me copies la solucin.
Crea un proyecto en Java por ejercicio. Colocare en las soluciones algunos comentarios para que sean
ms fcilmente entendible.
Te recomiendo que uses mensajes de trazas, donde te sean necesarios. Si tienes problemas tambin
puedes usar el depurador.
Aqu tienes todos los posts relacionados con Java:

Introduccion
Convencin de nombres
Comentarios
Variables primitivas
Constantes
Operadores
Entrada y salida de datos
mbito de una variable
String
Mtodos String
Casting
Mtodos Math
Generar un nmero aleatorio con Math.random
Estructura condicional
Estructura repetitiva

Mensajes de traza
Pasar de String a distintos tipos de datos en Java
Caracteres de Escape
API Java
Mtodos Java
Arrays en Java
Bucles anidados
Arrays en mtodos en Java
Referencias en Java
Arrays multidimensionales
Mtodos java.util.Arrays Java
Formas de ordenar un array en Java
Introduccin a la programacin orientada a objetos
Variable this
Sobrecarga de mtodos y constructores
Mtodo toString
Operador instanceof
Array de Objetos
Comparacin de objetos Java
Clases abstractas
Interfaces
Uso de constantes en Java
Mtodos y atributos estticos
Polimorfismo Java
Modificadores de acceso
Clases y mtodos finales
Mtodos get y set
Herencia Java
Como utilizar Javadoc
Introduccin de ficheros
Excepciones
Clases FileReader y FileWriter para ficheros de texto
Clases BufferedReader y BufferedWriter para ficheros de texto
Clases FileInputStream y FileOutputStream para ficheros binarios
Clases DataInputStream y DataOutputStream para ficheros binarios
Serializacin de objetos en Java

Tambin incluyo los posts relacionados con eclipse.

Como usar Eclipse Juno


Instalar y desinstalar plugins en Eclipse
Como traducir Eclipse a Espaol

Si tienes alguna duda, recuerda que puedes consultarnos escribiendo un comentario en este post o
envindonos un e-mail a administrador@discoduroderoer.es
Ficheros de texto

1) Crea un fichero de texto con el nombre y contenido que tu quieras. Ahora crea una aplicacin que lea
este fichero de texto carcter a carcter y muestre su contenido por pantalla sin espacios. Por ejemplo,
si un fichero tiene el siguiente texto Esto es una prueba, deber mostrar Estoesunaprueba.
Captura las excepciones que veas necesario.
Mostrar
2) Crea una aplicacin donde pidamos la ruta de un fichero por teclado y un texto que queramos a
escribir en el fichero. Debers mostrar por pantalla el mismo texto pero variando entre maysculas y
minsculas, es decir, si escribo Bienvenido deber devolver bIENVENIDO. Si se escribe cualquier
otro carcter, se quedara tal y como se escribi.
Debers crear un mtodo para escribir en el fichero el texto introducido y otro para mostrar el contenido
en maysculas.
IMPORTANTE: cuando pidas por teclado una ruta con JOptionPane, no es necesario que insertes
caracteres de escape.
Mostrar
3) Crea una aplicacin que pida la ruta de dos ficheros de texto y de una ruta de destino (solo la ruta, sin
fichero al final). Debes copiar el contenido de los dos ficheros en uno, este tendr el nombre de los dos
ficheros separados por un guion bajo, este se guardara en la ruta donde le hayamos indicado por
teclado.
Para unir los ficheros en uno, crea un mtodo donde le pases como parmetro todas las rutas. En este
mtodo, aparte de copiar debe comprobar que si existe el fichero de destino, nos muestre un mensaje
informndonos de si queremos sobrescribir el fichero. Te recomiendo usar la clase File y JOptionPane.
Por ejemplo, si tengo un fichero A.txt con ABC como contenido, un fichero B.txt con DEF y una
ruta

de

destino D:\,

el

resultado

sera

un

fichero

llamado A_B.txt en

la

ruta D:\ con

el

contenido ABCDEF.
Puedes crear submtodos para realizar la copia de ficheros, piensa tambin como podrias optimizar
esta copia, si los ficheros tuvieran mucho contenido.
Recuerda que debes controlar las excepciones que puedan aparecer. En caso de error, mostrar una
ventana de dialogo con informacin del error.
Mostrar
Ficheros binarios
4) Crea una aplicacin que copie un fichero binario a otra localizacin. En lugar de leer y escribir byte a
byte, crea un array de bytes con el tamao del fichero de origen (utiliza el mtodo available()), copia el
contenido del fichero a este array y escribe a partir de este array.
Recuerda que debes controlar las excepciones que puedan aparecer. En caso de error, mostrar una
ventana de dialogo con informacin del error.
Esconder

1
2

import java.io.*;
import javax.swing.JOptionPane;

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

public class Ejercicio4App {


public static void main(String[] args) {
//Pedimos las rutas
String origen=JOptionPane.showInputDialog("Escribe la ruta del origen");
String destino=JOptionPane.showInputDialog("Escribe la ruta del destino");
copiaFicheros(origen, destino);
}
public static void copiaFicheros (String origen, String destino){
try(FileInputStream fis=new FileInputStream(origen);
FileOutputStream fos=new FileOutputStream(destino)){
//Creamos un array de bytes con el tamao del fichero de origen
byte byteA[]=new byte[fis.available()];
//Copia todos los bytes del fichero al array
fis.read(byteA);
//Escribe todos los bytes en el fichero de destino
fos.write(byteA);
}catch(IOException e){
JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
}
}
}

5) Crea una aplicacin que pida por teclado un nmero de nmeros aleatorios enteros positivos y la ruta
de un fichero. Este fichero contendr la cantidad de nmeros aleatorios enteros positivos que se ha
pedido por teclado.
Escribe los nmeros usando un DataOutputStream y muestra por pantalla estos nmeros leyndolos
con un DataInputStream.
El rango de los nmeros aleatorios estar entre 0 y 100, incluyendo el 100.
Cada vez que ejecutemos la aplicacin aadiremos nmeros al fichero sin borrar los anteriores, es decir,
si cuando creo el fichero aado 10 nmeros y despus aado otros 10 al mismo, en el fichero habr 20
nmeros que sern mostrados por pantalla.

Esconder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

import java.io.*;
import javax.swing.JOptionPane;
public class Ejercicio5App {
public static void main(String[] args) {

String ruta=JOptionPane.showInputDialog("Escribe la ruta del fichero");


String numeros=JOptionPane.showInputDialog("Escribe el numero de numeros ale
int numNumerosAleatorios=Integer.parseInt(numeros);

//Abrimos el fichero desde el final


try(DataOutputStream dos=new DataOutputStream (new FileOutputStream (ruta, tr
DataInputStream dis=new DataInputStream(new FileInputStream (ruta))){
escribeFichero(dos, numNumerosAleatorios);
leeFichero(dis);
}catch(EOFException e){
System.out.println("Fin del fichero");
}catch(IOException e){
JOptionPane.showMessageDialog(null, "Error: "+e.getMessage() , "Error",
JOptionPane.ERROR_MESSAGE);
}

}
public static void escribeFichero (DataOutputStream dos, int numNumerosAleatorios)
IOException{
//Escribimos los numeros
for (int i=0;i<numNumerosAleatorios;i++){
int numero=generaNumerosAleatorios();
dos.writeInt(numero);
}
//Guardamos los cambios
dos.flush();
}
public static void leeFichero (DataInputStream dis) throws IOException{
//Leemos los numeros hasta el final del fichero
while(true){
System.out.println(dis.readInt());
}
}

44
45
46
47
48
49
50
51
52
53

public static int generaNumerosAleatorios(){


int numero=(int)Math.floor(Math.random()*101);
return numero;
}
}

6) Crea una aplicacin que almacene los datos bsicos de un vehculo como la matricula(String), marca
(String), tamao de deposito (double) y modelo (String) en ese orden y de uno en uno usando la clase
DataInputStream.
Los datos anteriores datos se pedirn por teclado y se irn aadiendo al fichero (no se sobrescriben los
datos) cada vez que ejecutemos la aplicacin.
El fichero siempre sera el mismo, en todos los casos.
Muestra todos los datos de cada coche en un cuadro de dialogo, es decir, si tenemos 3 vehculos
mostrara 3 cuadros de dialogo con sus respectivos datos. Un ejemplo de salida de informacin puede
ser este:

Mostrar
Serializacion
7) Vamos a realizar el mismo ejercicio pero con serializacin, para ello, crea una simple clase Vehiculo
con los atributos matricula, marca, tamao del deposito y modelo, con sus respectivos mtodos get y el
constructor se invocara con todos los atributos.
El atributo tamaoDeposito no se incluir en el fichero (aun as debemos pedirlo), debemos indicarlo en
la clase (recuerda el uso de transient).
Recuerda que al usar la clase ObjectOutputStream, si vamos a aadir varios objetos en distintas
ejecuciones, debemos crear nuestra propia versin de ObjectOutputStream. (Serializacin de objetos en
Java)
Esconder
Clase Vehiculo

1
2
3

import java.io.Serializable;
/**
* Clase Vehiculo

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

*
* Contiene informacion de un vehiculo
*
* @author DiscoDuroderoer
* @version 1.0
*/
public class Vehiculo implements Serializable{
private static final long serialVersionUID = 7695874286508524707L;
//Atributos
/**
* Matricula del vehiculo
*/
private String matricula;
/**
* Marca del vehiculo
*/
private String marca;
/**
* Tamao del deposito del vehiculo
* No se transfiere en la serializacion
*/
transient private double tamaoDeposito;
/**
* Modelo del vehiculo
*/
private String modelo;
//Mtodos
/**
* Devuelve la matricula
* @return matricula del vehiculo
*/
public String getMatricula() {
return matricula;
}
/**
* Devuelve la marca
* @return marca del vehiculo
*/
public String getMarca() {
return marca;
}

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

/**
* Devuelve el tamao del deposito
* @return tamalos del deposito del vehiculo
*/
public double getTamaoDeposito() {
return tamaoDeposito;
}
/**
* Devuelve el modelo
* @return modelo del vehiculo
*/
public String getModelo() {
return modelo;
}
//Constructor
/**
* Constructor con 4 parametros
* @param matricula
* @param marca
* @param tamaoDeposito
* @param modelo
*/
public Vehiculo (String matricula, String marca, double tamaoDeposito, String
modelo){
this.matricula=matricula;
this.tamaoDeposito=tamaoDeposito;
this.marca=marca;
this.modelo=modelo;
}
}

Clase MiObjectOutputStream

1
2
3

import java.io.*;
//Esta clase hereda sus propiedades de ObjectOutputStream
public class MiObjectOutputStream extends ObjectOutputStream

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

//Sobrescribimos el mtodo que crea la cabecera


protected void writeStreamHeader() throws IOException
{
// No hacer nada.
}
//Constructores
public MiObjectOutputStream () throws IOException{
super();
}
public MiObjectOutputStream(OutputStream out) throws IOException
{
super(out);
}
}

Clase ejecutable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

import javax.swing.JOptionPane;
import java.io.*;
public class Ejercicio7App {
public static void main(String[] args) {
File fichero=new File("D:\vehiculos.ddr");
String
String
String
double
String

matricula=JOptionPane.showInputDialog("Introduce la matricula");
marca=JOptionPane.showInputDialog("Introduce la marca");
texto=JOptionPane.showInputDialog("Introduce el tamao del deposito")
tamaoDeposito=Double.parseDouble(texto);
modelo=JOptionPane.showInputDialog("Introduce el modelo");

/*
* No creamos los objetos para manejar objetos,
* ya que sino siempre existiria el fichero
*/
try{

Vehiculo vehiculo=new Vehiculo(matricula, marca, tamaoDeposito ,modelo)

//Si el fichero existe, usamos nuestra clase de Object y sino usamos la


if(fichero.exists()){
MiObjectOutputStream moos=new MiObjectOutputStream(new FileOutputStre
true));
moos.writeObject(vehiculo);

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

moos.close();
}else{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(fi
oos.writeObject(vehiculo);
oos.close();
}

el fichero

//Creamos despues este objeto para asegurarnos que no de un error, en ca

ObjectInputStream ois=new ObjectInputStream(new FileInputStream(fichero))


muestraDatos(ois);
}catch(ClassNotFoundException e){
}catch(EOFException e){
System.out.println("fin");
}catch(IOException e){
JOptionPane.showMessageDialog(null, "Error: "+e.getMessage() , "Error",
JOptionPane.ERROR_MESSAGE);
}
}

public static void muestraDatos(ObjectInputStream ois) throws IOException, ClassNo


//Cuando se acabe el fichero saltara la excepcion EOFException
while(true){
Vehiculo ref=(Vehiculo)ois.readObject();

JOptionPane.showMessageDialog(null, "El vehiculo tiene una matricula "+r


", su marca es "+ref.getMarca()+" y su modelo es "+ref.getModelo());
}
}
}

También podría gustarte