You are on page 1of 33

ISSD Tcnicas de Programacin 2- 1

UNIDAD N 4
Base de Datos

TEMAS:
Acceso a Datos
Reportes
Clase
8
8




Objetivos de la clase:
Desarrollar reportes en el acceso a la base de datos.-


Actividades:
En sta octava clase vamos finalizando con los conceptos del lenguaje C# junto con
la confeccin de los reportes en el acceso a las bases de datos y consultas que re-
suelven operaciones.-

Cada clase estar encabezada con sus temas y correspondientes objetivos, y para
cumplirlos se proponen los siguientes pasos:
Realizar una primera lectura de cada tema de la clase, y la clase en su totali-
dad, para crear una mapa general de lo que se hablar en la clase.
Realizar una segunda lectura profunda.
Marcar los conceptos ms importantes en el material de estudio.
Escribir en una hoja aparte del material de estudio, aquellas consultas que
vayan surgiendo de la lectura.
Cuando la clase sea con contenidos tericos-prcticos, realizar los ejemplos
en el software de C#.

Aquellas consultas que vayan surgiendo en la lectura profunda de la clase, envir-
melas a travs del campus virtual para poder evacuar tus dudas, proseguir con las
prximas clases sin ninguna duda.


ISSD Tcnicas de Programacin 2- 2

Base de datos en .NET
Data Binding en Formularios Window
El Data Binding es la habilidad de un conjunto de controles de mostrar datos
desde una fuente de datos con muy poco o nada de cdigo provisto por el progra-
mador. Data Binding est normalmente conectada con controles visuales, pero no
es obligatorio que as lo fuera siempre. Es posible que enlacemos datos con propie-
dades de componentes no visuales.
El enlace de datos ms robusto se encuentra en el empleo de los formularios
Windows. Podemos enlazar datos de casi cualquier control de Windows. En general
podemos enlazar diferentes columnas y an datos de diferentes tablas a diferentes
propiedades de un mismo control. La va de manejar es a travs de una propiedad
del formulario llamada BindingContext.
Tipos de Data Binding
Existen dos tipos de enlace de datos: simple y complejo.
Enlace simple (Simple Data Binding): Este tipo de enlace consiste en una
asociacin entre un control que puede mostrar un nico dato y el objeto que acta
como contenedor de datos. El ejemplo ms ilustrativo es el control TextBox.
Enlace complejo (Complex Data Binding): En este enlace, el control que
acta como interfaz o visualizador de datos, dispone de la capacidad de mostrar va-
rios o todos los datos del objeto que contiene la informacin. El control ms comn
es el control DataGrid.
Clase relacionadas con el Data Binding
El mecanismo de enlace automtico de datos a controles est compuesto por
un elevado conjunto de elementos del conjunto de tipos de .NET Framework, entre
clases, colecciones, enumeraciones, etc. A continuacin vamos a mencionar los
ms importantes, que emplearemos en el ejemplo desarrollado seguidamente.
Binding: Clase que permite crear un enlace (binding) para un control, indi-
cando la propiedad del control que mostrar los datos, el DataSet del que se extrae-
r la informacin, y el nombre de la tabla-columna, cuyos datos pasarn a la propie-
dad del control.
DataBindings: Coleccin de que disponen los controles, con la informacin
de enlaces a datos. Gracias a su mtodo Add( ), podemos aadir un objeto Binding,
para que el control muestre los datos que indica el enlace.


ISSD Tcnicas de Programacin 2- 3

BindingContext: Propiedad de la clase Form, que representa el contexto de
enlace a datos establecido en los controles del formulario, es decir, toda la informa-
cin de enlaces establecida entre los controles y objetos proveedores de datos. De-
vuelve un objeto de tipo BindingManagerBase.
BindingManagerBase: Objeto que se encarga de administrar un conjunto de
objetos de enlace, por ejemplo, los de un formulario, obtenidos a travs del Bin-
dingContext del formulario.
Enlace simple.
Problema: Mostrar el contenido de la tabla usuarios en un formulario con los
clsicos botones de primero, ltimo, siguiente y anterior (para el desplazamiento de
registros).

El cdigo fuente completo es:
using System.Data;
using System.Data.SqlClient;

public partial class Ejemplo5 : Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be
disposed; otherwise, false.</param>


ISSD Tcnicas de Programacin 2- 4

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.txtNombre = new System.Windows.Forms.TextBox();
this.txtClave = new System.Windows.Forms.TextBox();
this.btnPrimero = new System.Windows.Forms.Button();
this.btnAnterior = new System.Windows.Forms.Button();
this.btnUltimo = new System.Windows.Forms.Button();
this.btnSiguiente = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.lblCantidad = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(33, 31);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Nombre";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(33, 57);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(34, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Clave";
//
// txtNombre
//
this.txtNombre.Location = new System.Drawing.Point(116, 28);
this.txtNombre.Name = "txtNombre";
this.txtNombre.Size = new System.Drawing.Size(145, 20);
this.txtNombre.TabIndex = 2;
//


ISSD Tcnicas de Programacin 2- 5

// txtClave
//
this.txtClave.Location = new System.Drawing.Point(116, 54);
this.txtClave.Name = "txtClave";
this.txtClave.Size = new System.Drawing.Size(145, 20);
this.txtClave.TabIndex = 3;
//
// btnPrimero
//
this.btnPrimero.Location = new System.Drawing.Point(36,
105);
this.btnPrimero.Name = "btnPrimero";
this.btnPrimero.Size = new System.Drawing.Size(54, 23);
this.btnPrimero.TabIndex = 4;
this.btnPrimero.Text = "<<";
this.btnPrimero.UseVisualStyleBackColor = true;
this.btnPrimero.Click += new
System.EventHandler(this.btnPrimero_Click);
//
// btnAnterior
//
this.btnAnterior.Location = new System.Drawing.Point(116,
105);
this.btnAnterior.Name = "btnAnterior";
this.btnAnterior.Size = new System.Drawing.Size(54, 23);
this.btnAnterior.TabIndex = 5;
this.btnAnterior.Text = "<";
this.btnAnterior.UseVisualStyleBackColor = true;
this.btnAnterior.Click += new
System.EventHandler(this.btnAnterior_Click);
//
// btnUltimo
//
this.btnUltimo.Location = new System.Drawing.Point(267,
105);
this.btnUltimo.Name = "btnUltimo";
this.btnUltimo.Size = new System.Drawing.Size(54, 23);
this.btnUltimo.TabIndex = 6;
this.btnUltimo.Text = ">>";
this.btnUltimo.UseVisualStyleBackColor = true;
this.btnUltimo.Click += new
System.EventHandler(this.btnUltimo_Click);
//
// btnSiguiente
//
this.btnSiguiente.Location = new System.Drawing.Point(190,
105);
this.btnSiguiente.Name = "btnSiguiente";
this.btnSiguiente.Size = new System.Drawing.Size(54, 23);
this.btnSiguiente.TabIndex = 7;
this.btnSiguiente.Text = ">";
this.btnSiguiente.UseVisualStyleBackColor = true;
this.btnSiguiente.Click += new
System.EventHandler(this.btnSiguiente_Click);


ISSD Tcnicas de Programacin 2- 6

//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(33, 153);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(114, 13);
this.label3.TabIndex = 8;
this.label3.Text = "Cantidad de Registros:";
//
// lblCantidad
//
this.lblCantidad.AutoSize = true;
this.lblCantidad.Location = new System.Drawing.Point(169,
153);
this.lblCantidad.Name = "lblCantidad";
this.lblCantidad.Size = new System.Drawing.Size(13, 13);
this.lblCantidad.TabIndex = 9;
this.lblCantidad.Text = "0";
//
// Ejemplo5
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F,
13F);
this.AutoScaleMode =
System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(344, 205);
this.Controls.Add(this.lblCantidad);
this.Controls.Add(this.label3);
this.Controls.Add(this.btnSiguiente);
this.Controls.Add(this.btnUltimo);
this.Controls.Add(this.btnAnterior);
this.Controls.Add(this.btnPrimero);
this.Controls.Add(this.txtClave);
this.Controls.Add(this.txtNombre);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Name = "Ejemplo5";
this.Text = "Ejemplo5";
this.Load += new System.EventHandler(this.Ejemplo5_Load);
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtNombre;
private System.Windows.Forms.TextBox txtClave;
private System.Windows.Forms.Button btnPrimero;
private System.Windows.Forms.Button btnAnterior;
private System.Windows.Forms.Button btnUltimo;


ISSD Tcnicas de Programacin 2- 7

private System.Windows.Forms.Button btnSiguiente;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label lblCantidad;

//Declaracin de atributos globales
private SqlConnection conexion;
private SqlDataAdapter adaptador;
private DataSet datos;
private BindingManagerBase administradorEnlaces;

public Ejemplo5()
{
InitializeComponent();
}

private void Ejemplo5_Load(object sender, EventArgs e)
{
conexion = new SqlConnection("Data Source=NETDEV-
ISSD\\SQLEXPRESS;Initial Catalog=administracion;Integrated
Security=True");
adaptador = new SqlDataAdapter();

SqlCommand consulta = new SqlCommand("select * from
usuarios", conexion);
adaptador.SelectCommand = consulta;
datos = new DataSet();
adaptador.Fill(datos, "usuarios");
Binding enlace;
enlace = new Binding("Text", datos, "usuarios.nombre");
txtNombre.DataBindings.Add(enlace);
enlace = new Binding("Text", datos, "usuarios.clave");
txtClave.DataBindings.Add(enlace);
administradorEnlaces = BindingContext[datos, "usuarios"];
lblCantidad.Text = administradorEnlaces.Count.ToString();
}

private void btnPrimero_Click(object sender, EventArgs e)
{
administradorEnlaces.Position = 0;
}

private void btnAnterior_Click(object sender, EventArgs e)
{
administradorEnlaces.Position -= 1;
}

private void btnSiguiente_Click(object sender, EventArgs e)
{
administradorEnlaces.Position += 1;
}

private void btnUltimo_Click(object sender, EventArgs e)
{


ISSD Tcnicas de Programacin 2- 8

administradorEnlaces.Position = administradorEnlaces.Count -
1;
}
}
En el evento de carga del formulario establecemos los enlaces entre los con-
troles y el DataSet. Debido al enlace automtico, el cdigo para las operaciones de
navegacin se simplifica en gran medida. Por ejemplo para desplazarnos al primer
registro:
administradorEnlaces.Position = 0;
Enlace complejo
Problema 1: Mostrar el contenido de la tabla usuarios en un DataGrid.

using System.Data;
using System.Data.SqlClient;

public partial class Ejemplo6 : Form
{
private SqlConnection conexion;
private SqlDataAdapter adaptador;
private DataSet datos;

public Ejemplo6()
{
InitializeComponent();
}


ISSD Tcnicas de Programacin 2- 9


private void Ejemplo6_Load(object sender, EventArgs e)
{
conexion = new SqlConnection("Data Source=NETDEV-
ISSD\\SQLEXPRESS;Initial Catalog=administracion;Integrated
Security=True");
adaptador = new SqlDataAdapter();

SqlCommand consulta = new SqlCommand("select nombre,clave
from usuarios", conexion);
adaptador.SelectCommand = consulta;
datos = new DataSet();
adaptador.Fill(datos, "usuarios");
}

private void btnRecuperar_Click(object sender, EventArgs e)
{
//DataBinding complejo
//El DataGrid muestra el contenido de toda la tabla
grillaUsuarios.DataSource = datos;
grillaUsuarios.DataMember = "usuarios";
}
}
Problema 2: Mostrar la columna nombre de la tabla usuarios en un Combo-
Box.

using System.Data;
using System.Data.SqlClient;


ISSD Tcnicas de Programacin 2- 10


public partial class Ejemplo7 : Form
{
private SqlConnection conexion;
private SqlDataAdapter adaptador;
private DataSet datos;

public Ejemplo7()
{
InitializeComponent();
}

private void Ejemplo7_Load(object sender, EventArgs e)
{
conexion = new SqlConnection("Data Source=NETDEV-
ISSD\\SQLEXPRESS;Initial Catalog=administracion;Integrated
Security=True");
adaptador = new SqlDataAdapter();

SqlCommand consulta = new SqlCommand("select nombre,clave
from usuarios", conexion);
adaptador.SelectCommand = consulta;
datos = new DataSet();
adaptador.Fill(datos, "usuarios");
//Enlace
comboBox1.DataSource = datos.Tables["usuarios"];
comboBox1.DisplayMember =
datos.Tables["usuarios"].Columns["nombre"].ToString();
comboBox1.ValueMember =
datos.Tables["usuarios"].Columns["clave"].ToString();
}
}
Procedimientos Almacenados
Introduccin
Un procedimiento almacenado de SQL Server es un grupo de una o varias
instrucciones de Transact-SQL. Los procedimientos se asemejan a las construccio-
nes de otros lenguajes de programacin, porque pueden:
Aceptar parmetros de entrada y devolver varios valores en forma de pa-
rmetros de salida al programa que realiza la llamada.
Contener instrucciones de programacin que realicen operaciones en la
base de datos. Entre otras, pueden contener llamadas a otros procedi-
mientos.


ISSD Tcnicas de Programacin 2- 11

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.
Ventajas
Algunas de las ventajas de utilizar procedimientos almacenados son:
Trfico de red reducido entre el cliente y el servidor: Los comandos de
un procedimiento se ejecutan en un nico lote de cdigo. Esto puede re-
ducir significativamente el trfico de red entre el servidor y el cliente por-
que nicamente se enva a travs de la red la llamada que va a ejecutar el
procedimiento. Sin la encapsulacin de cdigo que proporciona un proce-
dimiento, cada una de las lneas de cdigo tendra que enviarse a travs
de la red.
Mayor seguridad: Varios usuarios y programas cliente pueden realizar
operaciones en los objetos de base de datos subyacentes a travs de un
procedimiento, aunque los usuarios y los programas no tengan permisos
directos sobre esos objetos subyacentes. El procedimiento controla qu
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.
Reutilizacin del cdigo: 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.
Mantenimiento ms sencillo: Cuando 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 subyacente. 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.
Rendimiento mejorado: De forma predeterminada, un procedimiento 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 con-
sultas no tiene que crear un nuevo plan, normalmente necesita menos
tiempo para procesar el procedimiento.
Tipos de Procedimientos Almacenados
Definidos por el usuario: Un procedimiento definido por el usuario se
puede crear en una base de datos definida por el usuario o en todas las
bases de datos del sistema excepto en la base de datos Resource.


ISSD Tcnicas de Programacin 2- 12

Temporales: Los procedimientos temporales son iguales que los proce-
dimientos permanentes salvo porque se almacenan en tempdb. Hay dos
tipos de procedimientos temporales: locales y globales. Se diferencian en-
tre s por los nombres, la visibilidad y la disponibilidad. Los procedimientos
temporales locales tienen como primer carcter de sus nombres un solo
signo de nmero (#); solo son visibles en la conexin actual del usuario y
se eliminan cuando se cierra la conexin. Los procedimientos temporales
globales presentan dos signos de nmero (##) antes del nombre; son visi-
bles para cualquier usuario despus de su creacin y se eliminan al final
de la ltima sesin en la que se usa el procedimiento.
Sistema: Los procedimientos del sistema se incluyen con SQL Ser-
ver. Estn almacenados fsicamente en la base de datos interna y ocul-
ta Resource y se muestran de forma lgica en el esquema sys de cada
base de datos definida por el sistema y por el usuario. Dado que los pro-
cedimientos del sistema empiezan con el prefijo sp_, le recomendamos
que no use este prefijo cuando asigne un nombre a los procedimientos de-
finidos por el usuario. SQL Server admite los procedimientos del sistema
que proporcionan una interfaz de SQL Server a los programas externos
para varias actividades de mantenimiento. Estos procedimientos extendi-
dos usan el prefijo xp_.
Extendidos definidos por el usuario: Los procedimientos extendidos
permiten crear rutinas externas en un lenguaje de programacin como
C. Estos procedimientos son archivos DLL que una instancia de SQL Ser-
ver puede cargar y ejecutar dinmicamente.
Cmo crear un procedimiento almacenado
Para crear un procedimiento almacenado:
1) En el Explorador de objetos, conctese a una instancia de SQL Server
2005 Database Engine (Motor de base de datos de SQL Server 2005) y
expndala.
2) Expanda Bases de datos, la base de datos a la que pertenece el proce-
dimiento almacenado y, por ltimo, Programacin.
3) Haga clic con el botn secundario en Procedimientos almacenados y, a
continuacin, haga clic en Nuevo procedimiento almacenado.
4) En el men Consulta, haga clic en Especificar valores para parmetros
de plantilla.
5) En el cuadro de dilogo Especificar valores para parmetros de planti-
lla, la columna Valor contiene valores recomendados para los parmetros.
Acepte los valores o reemplcelos con nuevos valores y, a continuacin,
haga clic en Aceptar.


ISSD Tcnicas de Programacin 2- 13

6) En el editor de consultas, reemplace la instruccin SELECT por las ins-
trucciones para el procedimiento.
7) Para probar la sintaxis, en el men Consulta, haga clic en Analizar.
8) Para crear el procedimiento almacenado, en el men Consulta, haga clic
en Ejecutar.
9) Para guardar la secuencia de comandos, en el men Archivo, haga clic
en Guardar. Acepte el nombre de archivo o reemplcelo por un nombre
nuevo y, a continuacin, haga clic en Guardar.
Ejemplo de Procedimiento Almacenado
Problema: Realizar una aplicacin que permita realizar bsquedas utilizando
procedimientos almacenados.
1) En el Explorador de objetos, conctese a una instancia de SQL Server
2005 Database Engine (Motor de base de datos de SQL Server 2005) y
expndala.
2) Expanda Bases de datos, la base de datos administracion y, por lti-
mo, Programacin.
3) Haga clic con el botn secundario en Procedimientos almacenados y, a
continuacin, haga clic en Nuevo procedimiento almacenado.
4) En el men Consulta, haga clic en Especificar valores para parme-
tros de plantilla.
5) En el cuadro de dilogo Especificar valores para parmetros de planti-
lla, especifique los siguientes valores para los parmetros mostrados.
Parmetro Valor
Author Su nombre.
Create Date La fecha de hoy.
Description Devuelve los usuarios cuyo nombre
coincida o comience con el nombre es-
pecificado.
Procedure_Name administracion_BuscarUsuarios


ISSD Tcnicas de Programacin 2- 14

@Param1 @Nombre
@Datatype_For_Param1 nvarchar(50)
Default_Value_For_Param1 NULL

6) Haga clic en Aceptar.
7) En el editor de consultas, reemplace la instruccin SELECT por la siguien-
te instruccin:
SELECT nombre, clave
FROM usuarios
WHERE nombre
LIKE @Nombre + '%';
8) Para probar la sintaxis, en el men Consulta, haga clic en Analizar. Si se
devuelve un mensaje de error, compare las instrucciones con la informa-
cin anterior y corrija lo que sea necesario.
9) Para crear el procedimiento almacenado, en el men Consulta, haga clic
en Ejecutar.
10) Para guardar la secuencia de comandos, en el men Archivo, haga clic
en Guardar. Especifique un nuevo nombre de archivo y haga clic en
Guardar.
11) Para ejecutar el procedimiento almacenado, en la barra de herramientas,
haga clic en Nueva consulta.
12) En la ventana de consultas, especifique las siguientes instrucciones:
USE administracion;
GO
EXEC administracion_BuscarUsuarios @Nombre = 'is'
GO
13) En el men Consulta, haga clic en Ejecutar.
La interfaz de la aplicacin debera ser similar a la siguiente:


ISSD Tcnicas de Programacin 2- 15


El cdigo que resuelve este problema es el siguiente:
using System.Data;
using System.Data.SqlClient;

public partial class Ejemplo8 : Form
{
private SqlConnection conexion;
private SqlDataAdapter adaptador;
private DataTable datos;

public Ejemplo8()
{
InitializeComponent();
}

private void Ejemplo8_Load(object sender, EventArgs e)
{
conexion = new SqlConnection("Data Source=NETDEV-
ISSD\\SQLEXPRESS;Initial Catalog=administracion;Integrated
Security=True");
adaptador = new SqlDataAdapter();

adaptador.SelectCommand = new
SqlCommand("administracion_BuscarUsuarios", conexion);
adaptador.SelectCommand.CommandType =
CommandType.StoredProcedure;


ISSD Tcnicas de Programacin 2- 16

adaptador.SelectCommand.Parameters.Add("@Nombre",
SqlDbType.NVarChar);
}

private void button1_Click(object sender, EventArgs e)
{
datos = new DataTable();
adaptador.SelectCommand.Parameters["@Nombre"].Value =
textBox1.Text;
adaptador.Fill(datos);
dataGridView1.DataSource = datos;
}
}
A continuacin explicaremos el cdigo anterior, tambin repasamos los
conceptos vistos anteriormente:
using System.Data;
using System.Data.SqlClient;
En esta lnea agregamos las libreras que nos hacen falta.
private SqlConnection conexion;
private SqlDataAdapter adaptador;
private DataTable datos;
Agregamos las variables globales, utilizamos DataTable para representar la
tabla de datos en memoria una vez que es ejecutada la consulta, utilizamos este
objeto en vez del DataSet que veniamos utilizando anteriormente, porque el DataSet
es un conjunto de tablas, y como el procedimiento almacenado que se va a ejecutar
es sobre una tabla en particular, debemos asociarlo con un DataTable.
conexion = new SqlConnection("Data Source=NETDEV-
ISSD\\SQLEXPRESS;Initial Catalog=administracion;Integrated
Security=True");
adaptador = new SqlDataAdapter();
Definimos la conexin e instanciamos el SqlDataAdapter.
adaptador.SelectCommand = new
SqlCommand("administracion_BuscarUsuarios", conexion);
adaptador.SelectCommand.CommandType = CommandType.StoredProcedure;
adaptador.SelectCommand.Parameters.Add("@Nombre",
SqlDbType.NVarChar);
Definimos un nuevo comando para la consulta select, la instruccin es el
nombre del procedimiento almacenado. Le pasamos la conexin que definimos
anteriormente.
Luego le indicamos que el tipo de instruccin pasada anteriormente en el
constructor del SqlCommand es de tipo procedimiento almacenado.


ISSD Tcnicas de Programacin 2- 17

Por ltimo, en este fragmento de cdigo le agregamos el parmetro que
tenemos en la base de datos.
datos = new DataTable();
adaptador.SelectCommand.Parameters["@Nombre"].Value = textBox1.Text;
adaptador.Fill(datos);
dataGridView1.DataSource = datos;
En el cdigo del botn, instanciamos el objeto DataTable cada vez que se
pulsa el botn para limpiar los datos de la anterior instancia. Luego agregamos el
parmetro definido en el evento Load, llenamos los datos de resultado de la consulta
en el DataTable, e indicamos a la grilla que la fuente de datos de la misma es el
DataTable llenado anteriormente.


ISSD Tcnicas de Programacin 2- 18

Reportes
Introduccin
La finalidad de crear reportes en nuestras aplicaciones es producir salida de
informacin para los usuarios del sistema. Hay varias alternativas de poder resolver
esta situacin, la que nosotros veremos en este manual es a travs de la herramien-
ta ReportViewer, que a diferencia de otras herramientas tales como Crystal Reports,
nos permite construir reportes fcilmente y en poco tiempo.
Adems de tener mucha productividad en relacin al tiempo invertido en
desarrollo, para situaciones ms especficas puede que sea conveniente usar otra
herramienta debido a que ReportViewer tiene algunas limitaciones. Pero eso no va
resultar problema para lo que nosotros necesitamos realizar en este momento.
Pasos para la creacin de un informe
Creamos una aplicacin nueva, una vez creada, nos dirigimos hacia el explo-
rador de soluciones, clic derecho sobre nuestro proyecto recin creado y seleccio-
namos Agregar > Nuevo Elemento.
En la categora de Elementos de Visual C#, seleccionamos Reporting, y den-
tro de esta categora elegimos Asistente para informes, escribimos un nombre y
pulsamos el botn Aceptar como muestra la imagen a continuacin.



ISSD Tcnicas de Programacin 2- 19



Pulsamos siguiente.


ISSD Tcnicas de Programacin 2- 20


Seleccionamos Base de datos y pulsamos siguiente.


ISSD Tcnicas de Programacin 2- 21


En este paso, si no tenemos nuestra cadena de conexin, pulsamos el botn
Nueva Conexin y seguimos los pasos para obtener una, como lo hicimos ante-
riormente, y una vez que tengamos nuestra cadena de conexin, pulsamos el botn
siguiente.


ISSD Tcnicas de Programacin 2- 22

Seleccionamos que deseamos guardar la conexin y pulsamos siguien-


ISSD Tcnicas de Programacin 2- 23

te.

Elegimos de la tabla, sobre la que vamos a generar el reporte, y le damos un
nombre al DataSet, luego de realizar esto, pulsamos finalizar.
A continuacin nos saldr una pantalla como est a la que le damos al botn
Siguiente.


ISSD Tcnicas de Programacin 2- 24




ISSD Tcnicas de Programacin 2- 25


Seleccionamos el tipo de informe, en este caso es tabular porque el reporte
que nos interesa construir en base a nuestro modelo de datos va a tener una Entra-
da, que son las columnas de la tabla.


ISSD Tcnicas de Programacin 2- 26


El paso siguiente es disear el reporte, al comienzo los campos de nuestra ta-
la estarn en campos disponibles, los arrastramos a Detalles >, de esta forma se
van a mostrar en la parte de detalle del informe, las otras formas de presentacin de
datos, son para realizar totales, promedios, etc.


ISSD Tcnicas de Programacin 2- 27


Ahora debemos seleccionar el diseo, en este caso seleccionamos escalona-
do.


ISSD Tcnicas de Programacin 2- 28


Elegimos los colores del reporte, en este caso seleccionamos Pizarra.


ISSD Tcnicas de Programacin 2- 29


En esta pantalla se nos muestra el resumen del informe a agregar, hacemos
clic en Finalizar.


ISSD Tcnicas de Programacin 2- 30


A continuacin nos muestra el resultado de la configuracin del informe de los
pasos anteriores, ahora nos dirigimos a nuestro formulario, y en el cuadro de herra-
mientas, pestaa de Reportes, seleccionamos MicrosoftReportViewer y lo arrastra-
mos hasta nuestro formulario.


ISSD Tcnicas de Programacin 2- 31




ISSD Tcnicas de Programacin 2- 32


Hacemos clic en nuestro control de ReportViewer, nos dirigimos a la esquina supe-
rior donde hay un botn que al pulsarlo se nos despliega un dilogo, donde tenemos
que elegir nuestro informe de la lista seleccionable. Una vez desplegado nos saldr
nuestro informe anteriormente creado, y al elegirlo nos importarn algunos contro-
les. De esta forma ya podemos mostrar reportes en nuestros formularios.



ISSD Tcnicas de Programacin 2- 33

You might also like