You are on page 1of 33

ISSD – Técnicas de Programación 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 confección 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 más 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 teóricos-prácticos, realizar los ejemplos
en el software de C#.

Aquellas consultas que vayan surgiendo en la lectura profunda de la clase, enviár-
melas a través del campus virtual para poder evacuar tus dudas, proseguir con las
próximas clases sin ninguna duda.


ISSD – Técnicas de Programación 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 código 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 más 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 aún datos de diferentes tablas a diferentes
propiedades de un mismo control. La vía de manejar es a través 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
asociación entre un control que puede mostrar un único dato y el objeto que actúa
como contenedor de datos. El ejemplo más ilustrativo es el control TextBox.
Enlace complejo (Complex Data Binding): En este enlace, el control que
actúa como interfaz o visualizador de datos, dispone de la capacidad de mostrar va-
rios o todos los datos del objeto que contiene la información. El control más común
es el control DataGrid.
Clase relacionadas con el Data Binding
El mecanismo de enlace automático 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 continuación vamos a mencionar los
más 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 información, y el nombre de la tabla-columna, cuyos datos pasarán a la propie-
dad del control.
DataBindings: Colección de que disponen los controles, con la información
de enlaces a datos. Gracias a su método Add( ), podemos añadir un objeto Binding,
para que el control muestre los datos que indica el enlace.


ISSD – Técnicas de Programación 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-
ción 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 través del Bin-
dingContext del formulario.
Enlace simple.
Problema: Mostrar el contenido de la tabla usuarios en un formulario con los
clásicos botones de primero, último, siguiente y anterior (para el desplazamiento de
registros).

El código 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 – Técnicas de Programación 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 – Técnicas de Programación 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 – Técnicas de Programación 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 – Técnicas de Programación 2- 7

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

//Declaración 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 – Técnicas de Programación 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 automático, el código para las operaciones de
navegación 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 – Técnicas de Programación 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 – Técnicas de Programación 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
Introducción
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 programación, porque pueden:
 Aceptar parámetros de entrada y devolver varios valores en forma de pa-
rámetros de salida al programa que realiza la llamada.
 Contener instrucciones de programación que realicen operaciones en la
base de datos. Entre otras, pueden contener llamadas a otros procedi-
mientos.


ISSD – Técnicas de Programación 2- 11

 Devolver un valor de estado a un programa que realiza una llamada para
indicar si la operación se ha realizado correctamente o se han producido
errores, y el motivo de estos.
Ventajas
Algunas de las ventajas de utilizar procedimientos almacenados son:
 Tráfico de red reducido entre el cliente y el servidor: Los comandos de
un procedimiento se ejecutan en un único lote de código. Esto puede re-
ducir significativamente el tráfico de red entre el servidor y el cliente por-
que únicamente se envía a través de la red la llamada que va a ejecutar el
procedimiento. Sin la encapsulación de código que proporciona un proce-
dimiento, cada una de las líneas de código tendría que enviarse a través
de la red.
 Mayor seguridad: Varios usuarios y programas cliente pueden realizar
operaciones en los objetos de base de datos subyacentes a través 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.
 Reutilización del código: El código de cualquier operación de base de
datos redundante resulta un candidato perfecto para la encapsulación de
procedimientos. De este modo, se elimina la necesidad de escribir de
nuevo el mismo código, se reducen las inconsistencias de código y se
permite que cualquier usuario o aplicación que cuente con los permisos
necesarios pueda acceder al código y ejecutarlo.
 Mantenimiento más 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 aplicación permanece independiente y no
tiene que tener conocimiento sobre los cambios realizados en los diseños,
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 ejecución 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 – Técnicas de Programación 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 carácter de sus nombres un solo
signo de número (#); solo son visibles en la conexión actual del usuario y
se eliminan cuando se cierra la conexión. Los procedimientos temporales
globales presentan dos signos de número (##) antes del nombre; son visi-
bles para cualquier usuario después de su creación y se eliminan al final
de la última sesión en la que se usa el procedimiento.
 Sistema: Los procedimientos del sistema se incluyen con SQL Ser-
ver. Están almacenados físicamente en la base de datos interna y ocul-
ta Resource y se muestran de forma lógica 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 programación como
C. Estos procedimientos son archivos DLL que una instancia de SQL Ser-
ver puede cargar y ejecutar dinámicamente.
Cómo crear un procedimiento almacenado
Para crear un procedimiento almacenado:
1) En el Explorador de objetos, conéctese a una instancia de SQL Server
2005 Database Engine (Motor de base de datos de SQL Server 2005) y
expándala.
2) Expanda Bases de datos, la base de datos a la que pertenece el proce-
dimiento almacenado y, por último, Programación.
3) Haga clic con el botón secundario en Procedimientos almacenados y, a
continuación, haga clic en Nuevo procedimiento almacenado.
4) En el menú Consulta, haga clic en Especificar valores para parámetros
de plantilla.
5) En el cuadro de diálogo Especificar valores para parámetros de planti-
lla, la columna Valor contiene valores recomendados para los parámetros.
Acepte los valores o reemplácelos con nuevos valores y, a continuación,
haga clic en Aceptar.


ISSD – Técnicas de Programación 2- 13

6) En el editor de consultas, reemplace la instrucción 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 reemplácelo por un nombre
nuevo y, a continuación, haga clic en Guardar.
Ejemplo de Procedimiento Almacenado
Problema: Realizar una aplicación que permita realizar búsquedas utilizando
procedimientos almacenados.
1) En el Explorador de objetos, conéctese a una instancia de SQL Server
2005 Database Engine (Motor de base de datos de SQL Server 2005) y
expándala.
2) Expanda Bases de datos, la base de datos administracion y, por últi-
mo, Programación.
3) Haga clic con el botón secundario en Procedimientos almacenados y, a
continuación, haga clic en Nuevo procedimiento almacenado.
4) En el menú Consulta, haga clic en Especificar valores para paráme-
tros de plantilla.
5) En el cuadro de diálogo Especificar valores para parámetros de planti-
lla, especifique los siguientes valores para los parámetros mostrados.
Parámetro 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 – Técnicas de Programación 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 instrucción SELECT por la siguien-
te instrucción:
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-
ción 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 aplicación debería ser similar a la siguiente:


ISSD – Técnicas de Programación 2- 15


El código 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 – Técnicas de Programación 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 continuación explicaremos el código anterior, también repasamos los
conceptos vistos anteriormente:
using System.Data;
using System.Data.SqlClient;
En esta línea agregamos las librerías 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 conexión 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 instrucción es el
nombre del procedimiento almacenado. Le pasamos la conexión que definimos
anteriormente.
Luego le indicamos que el tipo de instrucción pasada anteriormente en el
constructor del SqlCommand es de tipo procedimiento almacenado.


ISSD – Técnicas de Programación 2- 17

Por último, en este fragmento de código le agregamos el parámetro 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 código del botón, instanciamos el objeto DataTable cada vez que se
pulsa el botón para limpiar los datos de la anterior instancia. Luego agregamos el
parámetro 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 – Técnicas de Programación 2- 18

Reportes
Introducción
La finalidad de crear reportes en nuestras aplicaciones es producir salida de
información para los usuarios del sistema. Hay varias alternativas de poder resolver
esta situación, la que nosotros veremos en este manual es a través de la herramien-
ta ReportViewer, que a diferencia de otras herramientas tales como Crystal Reports,
nos permite construir reportes fácilmente y en poco tiempo.
Además de tener mucha productividad en relación al tiempo invertido en
desarrollo, para situaciones más específicas 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 creación de un informe
Creamos una aplicación nueva, una vez creada, nos dirigimos hacia el explo-
rador de soluciones, clic derecho sobre nuestro proyecto recién creado y seleccio-
namos Agregar > Nuevo Elemento.
En la categoría de Elementos de Visual C#, seleccionamos Reporting, y den-
tro de esta categoría elegimos “Asistente para informes”, escribimos un nombre y
pulsamos el botón Aceptar como muestra la imagen a continuación.



ISSD – Técnicas de Programación 2- 19



Pulsamos siguiente.


ISSD – Técnicas de Programación 2- 20


Seleccionamos Base de datos y pulsamos siguiente.


ISSD – Técnicas de Programación 2- 21


En este paso, si no tenemos nuestra cadena de conexión, pulsamos el botón
“Nueva Conexión…” y seguimos los pasos para obtener una, como lo hicimos ante-
riormente, y una vez que tengamos nuestra cadena de conexión, pulsamos el botón
siguiente.


ISSD – Técnicas de Programación 2- 22

Seleccionamos que deseamos guardar la conexión y pulsamos siguien-


ISSD – Técnicas de Programación 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 continuación nos saldrá una pantalla como está a la que le damos al botón
Siguiente.


ISSD – Técnicas de Programación 2- 24




ISSD – Técnicas de Programación 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 – Técnicas de Programación 2- 26


El paso siguiente es diseñar el reporte, al comienzo los campos de nuestra ta-
la estarán 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 presentación de
datos, son para realizar totales, promedios, etc.


ISSD – Técnicas de Programación 2- 27


Ahora debemos seleccionar el diseño, en este caso seleccionamos escalona-
do.


ISSD – Técnicas de Programación 2- 28


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


ISSD – Técnicas de Programación 2- 29


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


ISSD – Técnicas de Programación 2- 30


A continuación nos muestra el resultado de la configuración del informe de los
pasos anteriores, ahora nos dirigimos a nuestro formulario, y en el cuadro de herra-
mientas, pestaña de Reportes, seleccionamos MicrosoftReportViewer y lo arrastra-
mos hasta nuestro formulario.


ISSD – Técnicas de Programación 2- 31




ISSD – Técnicas de Programación 2- 32


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



ISSD – Técnicas de Programación 2- 33