Vous êtes sur la page 1sur 161

Asp_net -1-

LENGUAJE DE PROGRAMACIÓN

Autor:Ing. Alberto Moreno Cueva

Universidad Nacional de Ingenieria


Asp_net -2-

INDICE
1.- ASP NET
1.1 Asp Net
1.2 ADO NET
1.3 Clases Basicas pa gestion de Datos
1.4 Acciones de Ida y Vuelta de Una WEB
1.5 Directivas den ASP
1.6 Tipos de Datos
1.7 Web Form - controles
1.8 Funciones Numéricas , cadenas y Fechas

2.- Aplicaciones
2.1 Web- form calculo matemáticos
2.2 Empleando el Datgrid1
2.3 Consultas con Hipervínculos
2.4 Consultas en cascada
2.5 Genrador de Propiedades de un datagrid
2.6 Actualizaciones en linea
2.7 Empleando Store Procedure

3.- Reportes
3.1 Crystal Report entorno para el diseño
3.2 Creacion de un reportes simple con campos enlazados
3.3 Ejecucion de un reporte desde un formulario
3.4 Filtros en un reporte

4.- Web Service


4.1 Definición
4.2 Web Method
4.3 Publicacion de los Web Service
4.4 Acceso a los servicios
4.5 Aplicación con web Services

Responsable:
Prof. Ing. Alberto Moreno –Coordinador de Lenguajes Visuales
Docencia:
- Universidad Tecnologica del Peru
- Universidad Nacional de Ingenieria
- Universidad Catolica S.S.

Email: am_alberto@hotmail.com

“Si quieres ganar, superar, vencer, vuelve a comenzar porque en este mundo hay que
hacerlo todo dos o mas veces
Asp_net -3-

CAPITULO 1
1 Introducción a la plataforma .NET

Simplificando mucho las cosas para poder dar una definición corta y comprensible,
se podría decir que la plataforma .NET es un amplio conjunto de bibliotecas de
desarrollo que pueden ser utilizadas por otras aplicaciones para acelerar
enormemente el desarrollo y obtener de manera automática características
avanzadas de seguridad, rendimiento, etc...

En realidad .NET es mucho más que eso ya que ofrece un entorno gestionado de
ejecución de aplicaciones, nuevos lenguajes de programación y compiladores, y
permite el desarrollo de todo tipo de funcionalidades: desde programas de consola
o servicios Windows hasta aplicaciones para dispositivos móviles, pasando por
desarrollos de escritorio o para Internet. Son estos últimos de los que nos
ocuparemos en este curso. Pero antes conviene conocer los fundamentos en los
que se basa cualquier aplicación creada con .NET, incluyendo las que nos
interesan.

1.1 El entorno de ejecución CLR

.NET ofrece un entorno de ejecución para sus aplicaciones conocido como


Common Language Runtime o CLR. La CLR es la implementación de Microsoft de
un estándar llamado Common Language Infrastructure o CLI. Éste fue creado y
promovido por la propia Microsoft pero desde hace años es un estándar
reconocido mundialmente por el ECMA.

.Todos estos servicios unidos a su independencia respecto a arquitecturas


computacionales convierten la CLR en una herramienta extraordinariamente útil
puesto que, en teoría, cualquier aplicación escrita para funcionar según la CLI
puede ejecutarse en cualquier tipo de arquitectura de hardware. Por ejemplo
Microsoft dispone de implementación de .NET para Windows de 32 bits, Windows
de 64 bits e incluso para Windows Mobile, cuyo hardware no tiene nada que ver
con la arquitectura de un ordenador común.

Los espacios de nombres

Dada la ingente cantidad de clases que existen debe existir algún modo de
organizarlas de un modo coherente. Además hay que tener en cuenta que
podemos adquirir más funcionalidades (que se traducen en clases) a otros
fabricantes, por no mencionar que crearemos continuamente nuevas clases
propias.
Asp_net -4-

Aplicaciones Web Forms


Tradicionalmente las aplicaciones Web se han desarrollado siguiendo un modelo
mixto que intercalaba código HTML y JavaScript propio de páginas Web (parte cliente),
junto con código que se ejecutaría en el servidor (parte servidora). Este modelo
contrastaba por completo con el modelo orientado a eventos seguido por las principales
herramientas de desarrollo de aplicaciones de escritorio.

En el modelo orientado a eventos se define la interfaz de usuario colocando


controles en un contenedor y se escribe el código que actuará como respuesta
a las interacciones de los usuarios sobre estos controles. Si conoce el
diseñador de VB6 o de Windows Forms mencionado en el apartado anterior
sabe exactamente a qué nos referimos.
Asp_net -5-

Obviamente se podría haber simplificado sin enviar el formulario al servidor usando


JavaScript en el cliente para mostrar el saludo, pero la intención es ilustrar la mezcla de
código de cliente y de servidor que existe en este tipo de aplicaciones.

La principal aportación de ASP.NET al mundo de la programación es que ha


llevado a la Web el paradigma de la programación orientada a eventos propia
de aplicaciones de escritorio, ofreciendo:

• Separación entre diseño y lógica.


• Componentes de interfaz de usuario, tanto estándar como de
terceras empresas o propios.
• Diseñadores gráficos.
• Eventos.
• Estado.
• Enlazado a datos desde la interfaz

Herramienta Rápida de Desarrollo (RAD)


La principal ventaja de Visual Studio 2005 es realizar la creación de aplicaciones
de forma fácil y rápida, tan solo con arrastrar y soltar objetos se pueden crear
desde aplicaciones Windows hasta Servicios Web XML.
Entre algunas de las ventajas del soporte RAD de Visual Studio tenemos:

Ø Creación de Páginas Web mediante Formularios Web


Visual Studio 2005 incluye un diseñador de páginas Web HTML y ASP .NET
basado en formularios Web. el diseñador permite arrastrar controles, clases de
datos, y otros objetos y configurar sus propiedades como si fuese un formulario de
una aplicación para Windows.

Ø Creación de Servicios Web XML


Para crear Servicios Web XML, Visual Studio .NET incluye una plantilla con
Servicios Web de ejemplo, los cuales puedes modificar y personalizar a tu medida,
Asp_net -6-

eligiendo el lenguaje que deseas, que puede ser Visual Basic .NET, Visual C#
.NET o Visual C++.NET

Ø Acceso a Servicios Web XML


Una vez creado los Servicios Web XML deben usarse en otras aplicaciones del
negocio, para ello Visual Studio 2005 cuenta con el Explorador de Servidores
(Server Explorer) que permite ver los Servicios Web publicados y usarlos con solo
un arrastre. También podemos usar un Servicio Web haciendo referencia desde
un proyecto mediante la opción "Add Web Referente" del menú "Project".

Ø Creación de Componentes .NET


Crear componentes o controles de usuario es tan simple como crear un formulario,
ya que usando la herencia se puede pasar todas las características de un objeto a
otro, esto esta presente en todos los objetos creados en Visual Studio 2005, sean
visuales o no.

Ø Creación de archivos XML


Con el diseñador de XML, crear un archivo XML es más fácil que nunca, ya que se
muestra de colores el código y se auto completan los Tags que uno va
escribiendo. Este maneja 3 vistas: XML, esquemas y datos.

Existen mas características RAD en Visual Studio .NET, las cuales trataremos
mas adelante.

Aplicaciones Web – ASP.NET


Una aplicación web es un conjunto de páginas HTML que se transmiten por medio del
protocolo HTTP de un servidor al cliente y viceversa, brindando distintas funcionalidades a
un usuario final.

ASP.NET es un Marco (framework) para programar aplicaciones web, de un modo


similar al que se programan las aplicaciones windows. El componente principal son los
Asp_net -7-

Web Forms (formularios web) que permiten, entre otras cosas, separar la interfaz del
usuario de la funcionalidad de la aplicación.

Aplicaciones Web - Servidor Web

Un servidor web es un sistema informático conectado a una red, donde se


almacenan las páginas, imágenes, etc. (que forman una aplicación web)
disponibles para ser visitadas por los usuarios de la red.

Internet Information Server (IIS), es el servidor Web de Microsoft que corre sobre
plataformas Windows. Los servicios que ofrece son: FTP, SMTP, NNTP y
HTTP/HTTPS

HTML Forms

• En el corazón de toda aplicación Web genuina están los HTML


Forms
• Un HTML Form es la porción de un documento HTML que
aparece entre las etiquetas <form></form>

Suma.html
<html>
<body>
<form>
<input type="text" name="op1" />
+
<input type="text" name="op2" />
<input type="submit" value=" = " />
</form>
</body>
</html>
Asp_net -8-

HTML Forms (Cont.)

Un botón submit (<input type= submit >) juega un rol especial en un


HTML Form:

Cuando es pulsado, el navegador envía el HTML Form junto con


cualquier entrada de datos del usuario al servidor Web

Cómo el HTML Form es enviado, dependerá del atributo Method del


form:

Si el atributo Method del form no está presente o tiene el valor GET, el


navegador enviará al servidor un comando HTTP GET

Si el atributo Method del form tiene el valor POST, el navegador enviará


al servidor un comando HTTP POST

Cualquiera sea el método utilizado, es decir GET o POST, cuando un


form es enviado al servidor, decimos que se produjo un POSTBACK

Procesamiento en el Servidor

• Construir la parte del cliente es fácil , sólo es HTML


• La parte difícil es la construcción de la lógica del lado del servidor. Algo
en el servidor , tiene que interpretar las entradas del usuario enviadas
junto con el form y generar la correspondiente salida.

Aplicaciones con controles a nivel de servidor.


Asp_net -9-

Enlaces de datos con los controles Web Form


Aplicación 1.- Sin incluir controles Form

Resultado

Codificación.-
<%@ Page language="vb"%>
<HTML>
<body>
<center>
<form name="frmintro" method="post" action="demo1.aspx">
Asp_net -10-

<h3>Primer Ejemplo</h3>
<h3>Ingrese Su Nombre :<input type =text name = "nombre"
value ="<%=request.form("nombre")%>">
Carrera : <select name="categoria" size=1>
<%
Dim i as integer
Dim values() as string={"Ing. Sistemas","Medicina","Psicologia","Administracion"}
for i=0 to values.length -1
%>
<% if request.form("categoria")=values(i) then%>
<option selected>
<%else%>
<option>
<%end if%>
<%=values(i)%></option>
<%next%>
</selected></h3>
<input type =submit name="busqueda" value ="busqueda">
<%if(not request.form("busqueda")=nothing) then%>
<p> Hola, <%=request.form("nombre")%>, has seleccionado la Carrera de :
<% =request.form("categoria")%> </p>
<%end if%>
</form>
</center>
</body>
</HTML>

Aplicación 2.- Segunda forma empleando etiquitas script

<html>
<head>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then si la pagina no esta cargada
Dim values as ArrayList= new ArrayList()
values.Add ("Visual Net")
values.Add ("Power Builder")
values.Add ("Macromedia MX")
values.Add ("Sql Server")
values.Add ("Oracle")
Asp_net -11-

values.Add ("Linux")
DropDown1.DataSource = values
DropDown1.DataBind
End If
End Sub

Sub SubmitBtn_Click(sender As Object, e As EventArgs)


Label1.Text = "Su elección: " + DropDown1.SelectedItem.Text
End Sub
</script>
</head>
<body>
<h3><font face="Verdana">Enlace de datos de DropDownList</font></h3>
<form runat="server" ID="Form1">
<asp:DropDownList id="DropDown1" runat="server" />
<asp:button Text="Enviar" OnClick="SubmitBtn_Click" runat="server" ID="Button1"
NAME="Button1" />
<p><asp:Label id="Label1" font-name="Verdana" font-size="10pt" runat="server" />
</form>
</body>
</html>

Nota.-
En vez de un array List tambien se puede emplear un arrgelo dinamico
Dim values() as string={ Visual Net Power Builder Macromedia Mx sql server }
Dropdown1.datasource=values

Ejercicios:
Controles Intrínsicos y WebForms:
1.-- Ingresar como datos : Nombre del Trabajador, sueldo y cantidad de Días por
vacaciones Mostrar el pago por vacaciones, la fecha de retorno y el día de retorno,
además si el día es sábado o domingo pintarlo con rojo sino pintarlo de color azul.
(se debe codificar solo en el pagina aspx)

2.- Seleccionar en un combo el artefacto a comprar, debe mostrar


automáticamente el precio del artefacto y la foto o imagen de dicho artefacto,
luego Ud. Elige una de las opciones para el pago (radio)que puede ser en 6,12,18
mes respectivamente el cual debe mostrar el calendario de pago:
Asp_net -12-

Calendario de Pagos

Fecha de compra :11/09/03


Artefacto . Cocina.
Precio a Crédito 630

Fecha Cuota Saldo


11/10/03 52.44 578.
11/11/03 ... ...
..... ... ....

<<<Retornar

Los incrementos de precio, son de acuerdo a los meses de pago y son 20%, 40%
y 60% respectivamente, la cuota mensual es constante.

3.- El gobierno tiene un plan para vivienda para el sector privado, bajo las
siguientes condiciones: Si los ingresos del comprador son menores a $1000, dará
como cuota inicial del 2% del costo de la casa y el resto lo distribuirá en pago
mensuales constantes, a pagar en 5 años; Si los ingresos del comprador es
mayor a $1000 la cuota inicial será del 5% y el resto se pagara en pago
mensuales de 4 años
Se pide mostrar la cuota inicial y el pago mensual y el saldo respecto a cada mes
en una cuadricula de datos(grid) ; Los departamentos son seleccionados a través
de la tabla
area Costo Datos de ingreso:
85 Mts c $15000 Nombre del comprador, Sueldo ,el tipo de
departamento y la fecha de compra
. 100 Mts c $ 18000
120 mts c. $ 21000 Todos los datos deben ser validados

Nota.- El trabajador debe tener un ingreso mínimo de $500


Asp_net -13-

Datos de ingreso , por


defecto se colocara la
fecha del sistema

Datos calculados , los


pagos mensuales son
constantes

4.- Elabore una pro forma de venta de computadoras ensamblada.


Condiciones: mediante un cuadro lista colocar tres monitores con sus precios
respectivos( Samsung 250, Compac 180 , IBM 280).
Una lista de discos duros( 20 GB 80, 30 GB 100, 40 GB 110)
Mediante opciones el procesador 800 MHZ 300 , 1 GHz 400, 2 GMz 600)
Mediante CheckBox colocar : Mouse 15, Teclado 20, estabilizador 25
Todos los precios están expresados en dolares, mediante una pagina Aspx,
coloque todo el diseño ( Puede colocar imágenes que representen cada
dispositivo) al elegir un dispositivo de mostrar su precio , además debe tener un
boton general para visualizar el Precio Total, el IGV y el neto a pagar en dolores
y soles
Nota.- Ud. Debe colocar las imágenes respectivas cuando se selecciona un
accesorio.

5.- Una librería ofrece ofertas de libros, para ello en una lista muestra la categoría
(Ciencia, Lenguaje, Historia), al seleccionar una categoría va mostrar solo los
libros de esa categoría en otra lista: por ejemplo ciencia(Matemática I, Física I,
Química, Anatomía); Lenguaje( Antónimos, sinónimos, Caligrafía); Historia (
Historia del Perú, Historia Universal, Geografía), a cada libro colocarlo un precio
en la a través de un arreglo, al seleccionar un libro mostrara su precio.
Luego elegir el tipo de venta: Publico General, estudiante o Docente deberá
calcular un descuento de (0%, 10% y 30% respectivamente), mostrar también el
total a pagar.
Asp_net -14-

6.- Unir las paginas con un pagina tipo Índice tipo menú empleando el Framset
(división de ventanas) , el cual será mostrado en una pagina principal con dos
marcos de paginas para tener acceso a las demás paginas.
Asp_net -15-

CAPITULO 2

CREANDO UN SITIO WEB EN ASP.NET 2.0


Primero abrimos el Visual Studio .NET 2005
1.-Inicio Programas Microsoft Visual Studio 2005 Microsoft Visual Studio
2005.
2.- Observaremos la presentación del entorno, invitándonos a crear nuestro
proyecto, listo para desarrollar nuestras aplicaciones.
3.- Crearemos nuestro primer proyecto Web, para esto nos ubicamos en File
New Web Site [Click]
4.-Nos muestra un cuadro de dialogo, con plantillas definidas, para crear el tipo de
proyecto que vamos a desarrollar.

5. Seleccionamos la plantilla ASP.NET Web Site, Luego en etiqueta


Localizacion que esta asociado con un combobox, seleccionamos donde vamos a
alojar nuestro proyecto que vamos a crear, como los vamos a almacenar en
nuestro duro seleccionamos File System (Archivo del sistema).
6. Luego el tipo de lenguaje en el cual vamos a desarrollar nuestras paginas
Web, seleccionamos Visual
Basic.
7. Si hemos seleccionano File System, le damos un clic en Browse para
ubicar en una unidad el proyecto que vamos a almacenar. Asi pues le
damos un clic en Browse.
Asp_net -16-

8. Le damos un clic en el icono de la imagen para crear una nueva carpeta


para alojar nuestro proyecto
Web, y le damos como nombre WebPrueba1, y le damos un clic en el boton Open.

8. Le damos un clic para crear el proyecto Web WebPrueba1.

9.- Vamos a describir el explorador de soluciones


Almacena los archivos vinculados
a la conexión de la base de datos,

Este archivo Web contiene opciones de


configuraciones que el CLR
(Lenguaje en tiempo de ejecución-
Asp_net -17-

Ubicación fisica
12.- El Proyecto web creado en ASP NET 2.0 no incluye el tradicional Subfolder
BIN. Cuando generamos y ejecutamos nuestro proyecto Web, ASP NET genera
una colección de archivos temporales en la carpeta:
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET
Files\webprueba1

default.aspx.cdcab7d2_CBMResult.ccu => CodeCompileUnit (Contenedor


para un programa CodeDOM
grafico para la pagina.
default.aspx.cdcab7d2_CBMResult.compiled => Lista de archivos
dependendientes y valores hash para ek
CodeCompileUnit (XML).
hash.web => Valor hash hexadecimal de 16 byte (Seguridad de pagina).
default.aspx.cdcab7d2.compiled => Archivar las dependencias y los valores de
hash para la página.
App_Web_8wc-9q9i.dll => Código ensamblado de los archivos 0.vb,1.vb y 2.vb.
Asp_net -18-

TRABAJO 1: DESARROLLAR LAS SIGUIENTES PAGINAS WEB

Crear un proyecto Web la pagina Default.aspx, lo renombrara a webPrincipal.aspx,


luego agregara 2
paginas y le podrán como nombre se encuentra en la imagen.

La pagina WebPrincipal.aspx, lo usara como un menú principal, el cual llamara a


los demás formularios propuestos.

Cada HiperLink llamar a las paginas propuestas.


HiperLink1 => llamara a la pagina Web WebApli01.aspx
HiperLink2 => llamara a la pagina Web WebApli02.aspx
Cuando se le da un clic en el botón Salir de la aplicación, saldrá del proyecto Web.

APLICACIÌN WebApli01.aspx
Asp_net -19-

1. cuando cargue la página deberá de limpiar todas las cajas de textos, se deberá de
mostrar la fecha de sistema en el lblFecha.
2..-Cuando se ingrese una fecha inicial, en la caja de texto txtfechainicial, y
numero de incremento de meses en la caja de texto txtmes, y haga clic en el
botón Calcular, se deberá de mostrar la fecha incrementada en meses en la caja
de texto txtfechaRes, y además los días en letras correspondientes de la
fecha en los label lblDiaInicio y lblDiaFinal.
3.-Cuando ingrese una fecha Actual en txtfechaactual y una fecha previa o
anterior en txtfechaanterior y haga clic en el botón mostrar, se deberá de
mostrar los días en letras en los labels lblDiaFecActual y
LblDiaFechaAnterior. También se deberán de mostrar todos los parámetros de esa
diferencia de fechas, como cuantos días paso, meses años etc, e inclusive si esa
fecha actual es bisiesto es o no.
4.-cuando haga clic en el botón nuevo, se deberá de limpiar todos las cajas de
texto.
5.-cuando haga clic en el botón cerrar, nos deberá de permitir salir de la
aplicación.
1.-usara el Try catch, para controlar los errores producidos en el código que
programara, y mostrara el mensaje en el label lblerrores.

6.-cuando haga clic en hiperlink Menu principal, nos deberá de enviar a la pagina
Webprincipal.aspx.

WebApli01.aspx
Asp_net -20-

Resultado de la pagina

1.- Pagina Webapli02.aspx

a) Cuando cargue la pagina se deberán de mostrar los artefactos en el


control DropDownList y demás controles deberán de inicializarse con el valor de
0.
b) Cuando seleccione un artefacto, se deberá de mostrar automáticamente el
precio de ese artefacto seleccionado, luego agregara una cantidad de venta y el
número de cuotas a pagar.
c) Cuando haga clic en el botón mostrar cálculos se realizara los siguientes
cálculos, el pago del valor de la venta será (precio x cantidad). la cuota inicial
será (35% del valor de venta), el saldo será (valor de venta cuota inicial) así
como también el valor de cada cuota será (saldo/nro de cuotas).
d) Cuando haga clic en el botón Nuevo se deberá de inicializar las cajas a 0.
e) cuando haga clic en el botón salir, se deberá de poder salir de la aplicación
Web.
Asp_net -21-

f) usara el Try catch, para controlar los errores producidos en el código que
programara, y mostrara el mensaje en el label lblerrores.
g) cuando haga clic en hiperlink Menu principal, nos deberá de enviar a la pagina
Webprincipal.aspx.

Resultado de la pagina.
Asp_net -22-

CAPITULO 3.

VALIDACION DE ENTRADA DE USUARIO

Al crear un control de entrada de datos, como un control TextBox,


podemos tener ciertas expectativas del tipo de entrada que el usuario
introducirá en ese control. Una entrada de datos incorrecta, como mínimo,
retrasará al usuario, y puede incluso terminar nuestra aplicación Web. Para
verificar que la entrada de datos cumple nuestras expectativas, debemos
compararlo con el valor, intervalo o formato que esperamos recibir del usuario.
Para crear esta comprobación, enlazamos al menos un control de validación de
entrada de datos con el control de entrada de datos y comparamos la entrada de
datos de los usuarios con nuestras expectativas.

¿Qué es la validación de entrada de datos?


Asp_net -23-

La validación de entrada de datos es el proceso de verificar que la entrada


de datos de un usuario en un formulario Web Form concuerda con el valor,
ntervalo o formato de datos previsto. La validación de la entrada de datos mejora
la experiencia del usuario en el sitio Web reduciendo el tiempo de espera de
mensajes de error y la probabilidad de envíos incorrectos o caídas del sitio
Web debido a problemas con la entrada de datos del usuario. Cuando se
combinan con mensajes de error comprensibles y útiles, los controles
de validación de entrada de datos pueden mejorar enormemente el uso
de una aplicación Web, mejorando por tanto la percepción de usuario de la calidad
global del sitio Web.
Los controles de validación de entrada de datos actúan para verificar que el
usuario ha cumplimentado correctamente un control de entrada de datos, como
un control TextBox, antes de que la solicitud sea procesada en el servidor. Los
controles de validación de entrada de datos de un formulario Web Form
actúan como filtros de datos antes de que la página o la lógica de servidor
sea procesada.
En ASP.NET, la validación de entrada de datos siempre se ejecuta en el lado del
servidor, y puede ejecutarse en el lado del cliente si el navegador cliente
soporta la validación. Si el navegador soporta la validación del lado del
cliente, los controles de validación de entrada de datos realizan la comprobación
de errores en el cliente antes de enviar los datos al servidor. El usuario recibe
información inmediata sobre si los datos que ha introducido son válidos o no.
Por motivos de seguridad, toda validación de entrada de datos que se
ejecute en el lado del cliente se repite a continuación en el lado del servidor.
Verificar valores de control
La validación de entrada funciona comparando la entrada de datos del
usuario con el formato de entrada de datos predeterminado. Estos formatos
predeterminados de entrada de datos pueden incluir el número de
caracteres, el uso de dígitos y/o letras, el intervalo del valor, una cadena
específica de caracteres, o una fórmula matemática.
Por ejemplo, un control de entrada de datos que solicita al usuario que introduzca
su número de teléfono podría tener un control de validación de entrada de datos
adjunto que verificara que el usuario únicamente introduce números en un formato
basado en el número de teléfono. Introducir letras o muy pocos números
activaría el control de validación de entrada de datos para validar la entrada de
datos.(Validación lado cliente-servidor)
Asp_net -24-

La validación de entrada de datos puede tener lugar tanto en el servidor como en


el cliente. Aunque ASP.NET siempre requiere validación del lado del servidor, la
validación del lado del cliente es una opción con algunos navegadores.
Los controles de validación de ASP.NET disponen de soporte tanto del lado
del cliente como del lado del servidor. La validación del lado del cliente
utiliza JavaScript y scripts DHTML (HTML Dinámico). La validación del lado
del servidor puede ser desarrollada en cualquier lenguaje basado en
Microsoft .NET, y se compila a Microsoft Intermediate Language (MSIL).
Tanto la validación del lado del cliente como la validación del lado del
servidor utilizan el mismo modelo de programación, aunque algunas
variaciones entre los lenguajes pueden crear pequeñas diferencias en las
funciones de validación.

Validación del lado del cliente


La validación del lado del cliente mejora el uso del formulario Web Form
comprobando la entrada de datos del usuario mientras se produce. Al
comprobar si se generan errores mientras se introducen, la validación del
lado del cliente permite detectar errores antes de que el formulario Web
Form sea enviado, evitando así el viaje de ida y vuelta necesario para la
validación del lado del servidor.
Escribir múltiples versiones de código de validación para soportar tanto el
servidor como los diferentes navegadores puede exigir mucho tiempo al
desarrollador. Los controles de validación ASP.NET eliminan este problema
ya que la lógica de validación se encapsula en los controles. Los controles crean
código específico para los navegadores de forma que los usuarios con soporte
de scripts del lado del cliente tendrán validación de entrada de datos. Los
navegadores que no soporten scripts no recibirán los scripts de validación en el
lado del cliente.
Asp_net -25-

En versiones de navegador que soporten la validación de entrada de datos,


como Microsoft Internet Explorer 4 o posterior, la validación del lado del cliente
se produce cuando el usuario hace clic en el botón Submit. La página no se
publicará de nuevo en el servidor hasta que toda la validación del lado del cliente
sea correcta. En Internet Explorer 5 o posterior, el uso de la tecla
TABULADOR para moverse de un control de entrada de datos al siguiente
ejecuta la validación del lado del cliente para el control de entrada de datos
completo. Esta validación utilizando el TABULADOR ofrece al usuario
información inmediata sobre los datos que ha introducido.

Validación del lado del servidor


Todos los controles de validación de entrada de datos se ejecutan en el lado del
servidor. Las validaciones del lado del cliente se repiten en el lado del servidor
cuando la página se envía de nuevo al servidor. Esta repetición evita el
spoofing de usuarios que no ejecutan el script del lado del cliente e intentan
introducir datos no válidos.
Los controles de validación del lado del servidor pueden escribirse en cualquier
lenguaje basado en .NET, y se compilan en MSIL antes de ser ejecutados en el
servidor.
Además de validar el formato de los datos introducidos, los controles de
validación del lado del servidor pueden utilizarse para comparar la entrada de
datos del usuario con datos almacenados. Esta funcionalidad permite validación

contra diversos elementos, como contraseñas previamente almacenadas o


restricciones geográficas, incluyendo las leyes y los impuestos locales.

Controles de validación ASP.NET


ASP.NET incluye los controles de validación que se muestran en la siguiente
tabla.

ASP.NET PAG-LEVEL DIRECTIVES:

DIRECTIVE DESCRIPCION

@ Page Define atributos usados para compilar paginas ASP.NET

@ Control Define atributos usados para compilar controles de usuarios

@ Import Importa NAMESPACES desde la libreria de clases de .NET

@ Register Define alias, tags, y otros parametros para constroles de usuarios


y normales
Asp_net -26-

@ Assembly Identifica otros archivos ( assemblies) para enlazar a esta pagina

Aplicación.- Ingresando un radio muestra su area en una etiqueta e ingresando una


cadena o parrafo lo ordena de forma ascendente
Ejemplos:

Codigos
Public Class SystemClass
Inherits System.Web.UI.Page
Protected WithEvents txtRadius As
System.Web.UI.WebControls.TextBox
Protected WithEvents butCalculate As
System.Web.UI.WebControls.Button
Protected WithEvents txtSort As
System.Web.UI.WebControls.TextBox
Protected WithEvents butSort As
System.Web.UI.WebControls.Button
Protected WithEvents litResult As
System.Web.UI.WebControls.Literal

+ codigo Generado

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


As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
End Sub

Private Sub butCalculate_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles butCalculate.Click
' Declare variables.
Dim dblCircArea, dblRadius As Double
' Convert text input to a double (optional).
If txtRadius.Text <> "" Then _
dblRadius = System.Convert.ToDouble(txtRadius.Text)
' Calculate area.
Asp_net -27-

dblCircArea = System.Math.PI * System.Math.Pow(dblRadius,


2)
' Display result.

ShowResult(dblCircArea)
End Sub

Private Sub butSort_Click(ByVal sender As System.Object, ByVal


e As System.EventArgs) Handles butSort.Click
' Declare an array.
Dim arrSort As String()
' Place each word in an array element
arrSort = txtSort.Text.Split(" ")
' Sort the array.
System.Array.Sort(arrSort)
' Display result.
ShowResult(String.Join(" ", arrSort))
End Sub

Sub ShowResult(ByVal Result As String)


litResult.Text = "<h3>Results</h3>"
litResult.Text += "<p>Sorted string: <b>" + Result +
"</b>"
End Sub

Sub ShowResult(ByVal Result As Double)


litResult.Text = "<h3>Results</h3>"
litResult.Text += "<p>The circle's area is: <b>" +
Result.ToString() + "</b>"
End Sub
End Class

Controles de validación
Asp_net -28-

RequieredFieldValidator.-(valida2)
Errormensage Campo oblugatorio
ControlTovalidate:Txtmon
RangeValidator (Valida1)
ErrorMessage.- Mes entre 6- 18
Public Class WebForm3 ControlTovalidate.- Txtmes
Inherits System.Web.UI.Page
+codigo Generado ValidationSummary .- Resumen de errores
Dim dt As DataTable
Dim dr As DataRow

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


As System.EventArgs) Handles MyBase.Load
End Sub

Private Sub BtnCalcula_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles BtnCalcula.Click
Dim m, mes As Integer
Dim interes, monto, mactual As Double
Dim fecha As Date = Date.Now
mes = Val(txtmes.Text)
monto = Val(txtmon.Text)
dt = New DataTable()
dt.Columns.Add(New DataColumn("Mes"))
dt.Columns.Add(New DataColumn("Interes"))
dt.Columns.Add(New DataColumn("Monto"))
For m = 1 To mes
interes = monto * 0.01 * m
mactual = interes + monto
Asp_net -29-

fecha = DateAdd("m", 1, fecha)


dr = dt.NewRow()
dr(0) = Format(fecha, "dd/MM/yy")
' si escribe la m con minuscula asumira como m en minutos
dr(1) = interes.ToString()
dr(2) = mactual.ToString
'Adiciona una fila al datatable
dt.Rows.Add(dr)
Next

DataGrid1.DataSource = New DataView(dt)


DataGrid1.DataBind()
End Sub
End Class

Procesamiento en el Servidor

Existen varias tecnologías de procesamiento:

l CGI (Common Gateway Interface)


l Define una API de bajo nivel
l Popular en entornos UNIX, no tanto en Windows
l ISAPI (Internet Server Application Programming Interface)
l Son DLL Windows que corren bajo IIS. Escritas en C++
l Mejor performance que CGI
l ASP (Active Server Pages)
l Simple solución: HTML + Script del lado del servidor
l Programadas en JScript o VBScript
l Objetos intrínsecos que abstraen detalles de bajo nivel de
HTTP. Objetos Request y Response
l Permite usar ADO (ActiveX Data Object) para acceso a
datos

ASP.NET

• ASP.NET es el framework de programación web dentro de NET


• Permite desarrollar aplicaciones Web con un modelo similar al
utilizado para aplicaciones Windows
• El componente fundamental de ASP.NET es el WebForm
• Independencia del cliente (navegador, S.O., dispositivo
físico, etc.)
• Permite utilizar cualquier lenguaje .NET
• Permite desarrollar Servicios Web XML

ASP.NET - Ventajas

• La parte ejecutable de una aplicación ASP.NET es


COMPILADA
• Implementación y actualización de las aplicaciones sin
reiniciar el servidor!
Asp_net -30-

• Acceso a toda la .NET Class Library


• Independiente del lenguaje de programación
• Encapsulamiento de funcionalidad a través de controles de
servidor y controles de usuario

ASP.NET – Ventajas (Cont.)

• Permite usar ADO.NET para acceso a datos


• Soporta XML, Hojas de estilo CSS, etc.
• Detección automática del navegador cliente, generando el
lenguaje de marcas soportado por el mismo
• Mecanismo de Caching incorporado para páginas completa
o partes de la misma frecuentemente solicitadas

Componentes de una aplicación ASP.NET

1) WebForms (Formularios Web)


a) Uno o más archivos con extensión .aspx
2) Archivos Code-Behind
a) Archivos asociados a WebForms que contienen código del lado del
servidor (Ej. VB.NET, C#, etc.)
3) Archivos de configuración con formato XML
a) Un archivo Web.config por c/aplicación
b) Un único archivo Machine.config por servidor
4) Global.asax
a) Eventos a nivel de aplicación

Componentes de una aplicación ASP.NET

1) Directorio BIN
a) Contiene el assembly de la aplicación (Ej.: MiAplic.dll)
b) Cero o más assemblies (Componentes externos)
2) Enlaces a Servicios Web XML
a) Permiten a la aplicación ASP.NET enviar y recibir datos desde Servicios
Web

Practica 2.-

1.- Generación de los Números de RUC (estableciendo las validaciones)


Asp_net -31-

Ingrese Libreta Electoral El numero de Ruc se genera a partir


Tipo de Persona del numero de libreta electoral , en
Jurídica Natural el text1 solo se ingresara números,
luego este numero se descompone
Dirección de Correo de la sgte manera:
Sm= D1*1 + D2*2 + D3*3 +.....+D8*8
Fecha de Actualización Donde D1, D2 ...son los dígitos
Luego esta suma se divide entre 9,
Teléfono su residuo se le concatena con el
numero electoral al final.
Los dos primeros dígitos puden
RUC GENERADO ser:
10 = Persona natural
12= Persona Jurídica
Enviar
establecer las validaciones en cada

2.- El gobierno tiene un plan para vivienda para el sector privado, bajo las
siguientes condiciones: Si los ingresos del comprador son menores a $1000, dará
como cuota inicial del 2% del costo de la casa y el resto lo distribuirá en pago
mensuales constantes, a pagar en 5 años; Si los ingresos del comprador es
mayor a $1000 la cuota inicial será del 5% y el resto se pagara en pago
mensuales de 4 años
Se pide mostrar la cuota inicial y el pago mensual y el saldo respecto a cada mes
en una cuadricula de datos(grid) ; Los departamentos son seleccionados a través
de la tabla
area Costo Datos de ingreso:
85 Mts c $15000 Nombre del comprador, Sueldo ,el tipo de
departamento y la fecha de compra
. 95 Mts c $ 18000
Todos los datos deben ser validados
105 mts c. $ 21000

Nota.- El trabajador debe tener un ingreso mínimo de $500

3.- Elabore una pro forma de venta de computadoras ensamblada.


Condiciones: mediante un cuadro lista colocar tres monitores con sus precios
respectivos( Samsung 250, Compac 180 , IBM 280).
Una lista de discos duros( 20 GB 80, 30 GB 100, 40 GB 110)
Mediante opciones el procesador 800 MHZ 300 , 1 GHz 400, 2 GMz 600)
Mediante CheckBox colocar : Mouse 15, Teclado 20, estabilizador 25
Todos los precios están expresados en dolares, mediante una pagina Aspx,
coloque todo el diseño ( Puede colocar imágenes que representen cada
dispositivo) al elegir un dispositivo de mostrar su precio , además debe tener un
Asp_net -32-

boton general para visualizar el Precio Total, el IGV y el neto a pagar en dolores
y soles.
Asp_net -33-

CAPITULO 4
Acceso a datos

En nuestro caso, nos centraremos única y exclusivamente en ADO.NET como


modelo de objetos de acceso ADO.NET ha sufrido a lo largo de los últimos años
diferentes mejoras y actualizaciones, desde que .NET apareció.
El resumen de las diferentes versiones de ADO.NET podría quedar de la siguiente
forma.
ADO.NET 1.0 apareció con Microsoft .NET Framework 1.0. Posteriormente, ADO.NET
1.1 sufrió una pequeñas y casi inapreciables actualizaciones con la aparición de
Microsoft .NET Framework 1.1. En el caso del entorno Visual Studio 2005, éste trabaja
con Microsoft .NET Framework 2.0 y por lo tanto, utiliza ADO.NET 2.0, el cuál añade
algunas características nuevas adicionales.

ADO.NET
El acceso a fuentes de datos es algo indispensable en cualquier lenguaje o
plataforma de desarrollo. La parte de la BCL que se especializa en el acceso a
datos se denomina de forma genérica como ADO.NET.

ADO.NET ofrece una funcionalidad completamente nueva, que tiene poco que ver
con lo existente hasta la fecha en el mercado. Sin embargo, con el ánimo de retirar
barreras a su aprendizaje, Microsoft denominó a su nuevo modelo de acceso a
datos con un nombre similar y algunas de sus clases recuerdan a objetos de
propósito análogo en el vetusto ADO.

ADO.NET es un modelo de acceso mucho más orientado al trabajo desconectado


de las fuentes de datos de lo que nunca fue ADO. Si bien este último ofrecía la
posibilidad de desconectar los Recordsets y ofrecía una forma de serialización de
estos a través de las diferentes capas de una aplicación, el mecanismo no es ni de
lejos tan potente como el que nos ofrece ADO.NET.

Arquitectura de ADO.NET

El concepto más importante que hay que tener claro sobre ADO.NET es su modo
de funcionar, que se revela claramente al analizar su arquitectura:
Asp_net -34-

Figura 1.3.- Arquitectura de ADO.NET

Existen dos capas fundamentales dentro de su arquitectura: la capa conectada y


la desconectada.

Capa conectada

La primera de ellas contiene objetos especializados en la conexión con los


orígenes de datos. Así, la clase genérica Connection se utiliza para establecer
conexiones a los orígenes de datos. La clase Command se encarga de enviar
comandos de toda índole al origen de datos. Por fin la clase DataReader está
especializada en leer los resultados de los comandos mientras se permanece
conectado al origen de datos.

La clase DataAdapter hace uso de las tres anteriores para actuar de puente entre
la capa conectada y la desconectada.

Estas clases son abstractas, es decir, no tienen una implementación real de la que
se pueda hacer uso directamente. Es en este punto en donde entran en juego los
proveedores de datos. Cada origen de datos tiene un modo especial de Así, por
ejemplo, las clases específicas para acceder a SQL Server se llaman
SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se
encuentran bajo el espacio de nombres System.Data.SqlClient. Es decir, al
contrario que en ADO clásico no hay una única clase Connection o Command que
Asp_net -35-

se use en cada caso, si no que existen clases especializadas para conectarse y


recuperar información de cada tipo de origen de datos.

Existen proveedores nativos, que son los que se comunican directamente con el
origen de datos (por ejemplo el de SQL Server o el de Oracle), y proveedores
"puente", que se utilizan para acceder a través de ODBC u OLEDB cuando no
existe un proveedor nativo para un determinado origen de datos.

Capa desconectada

Una vez que ya se han recuperado los datos desde cualquier origen de datos que
requiera una conexión ésta ya no es necesaria. Sin embargo sigue siendo
necesario trabajar con los datos obtenidos de una manera flexible. Es aquí cuando
la capa de datos desconectada entra en juego. Además, en muchas ocasiones es
necesario tratar con datos que no han sido obtenidos desde un origen de datos
relacional con el que se requiera una conexión. A veces únicamente necesitamos
un almacén de datos temporal pero que ofrezca características avanzadas de
gestión y acceso a la información.

¿Qué capas o qué partes hay dentro de ADO.NET?

Dentro de ADO.NET tenemos dos partes importantes.


La primera de ellas es la que corresponde con el nombre de espacio System.Data y que
constituye los objetos y clases globales de ADO.NET.
La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una
determinada fuente de datos desde ADO.NET y que utilizan así mismo, las clases del
Nombre de espacio System.Data.
Esta última parte, queda constituida por las clases y objetos de los diferentes proveedores
de acceso a datos como se muestra en la figura.
Asp_net -36-

Visión general de las clases de ADO.NET

System.Data
Las clases del nombre de espacio System.Data son bastantes extensas y variadas.
Quizás las clases más importantes son la clase DataView, la clase DataSet y la clase
DataTable.

La clase DataSet

El DataSet es una representación de datos residente en memoria que proporciona


una modelo de programación relacional coherente independientemente del origen
de datos que contiene. El DataSet contiene en sí, un conjunto de datos que han
sido volcados desde el proveedor de datos.

Debemos tener en cuenta que cuando trabajamos con DataSets, el origen de


datos no es lo más importante, ya que éste, puede ser cualquier tipo de origen de
datos. No tiene porqué ser una base de datos.

Un DataSet contiene colecciones de DataTables y DataRelations.


El DataTable contiene una tabla o tablas, mientras que la DataRelation contiene
las relaciones entre las DataTables.
Sin embargo, no es necesario especificar todo esto hasta el último detalle como
veremos más adelante.

La clase DataView
Asp_net -37-

Este objeto nos permite crear múltiples vistas de nuestros datos,


además de permitirnos presentar los datos.
Es la clase que nos permite representar los datos de la clase DataTable,
permitiéndonos editar, ordenar y filtrar, buscar y navegar por un
conjunto de datos determinado.

La clase DataTable

Este objeto nos permite representar una determinada tabla en memoria,


de modo que podamos interactuar con ella.

A la hora de trabajar con este objeto, debemos tener en cuenta el


nombre con el cuál definamos una determinada tabla, ya que los objetos
declarados en en el DataTable es sensitivo a mayúsculas y minúsculas.

Los proveedores de acceso a datos


Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al
acceso de datos y es la responsable de establecer la comunicación con las fuentes de
datos.

En este conjunto de nombres de espacio, encontraremos casi siempre las clases


Connection, Command, DataAdapter y DataReader como las clases más generales, las
cuales nos permiten establecer la conexión con la fuente de datos.

Proveedores de acceso a datos de .NET Framework

Dentro del entorno .NET Framework, encontramos un nutrido conjunto de proveedores


de acceso a datos.
Estos son los siguientes:
ODBC .NET Data Provider
OLE DB .NET Data Provider
Oracle Client .NET Data Provider
SQL Server .NET Data Provider
Estos proveedores de acceso a datos incluidos en Microsoft .NET Framework, los
podemos encontrar en los nombres de espacio:
System.Data.Odbc
System.Data.OleDb
System.Data.OracleClient
System.Data.SqlClient
Asp_net -38-

El proveedor ODBC .NET permite conectar nuestras aplicaciones a fuentes de


datos a través de ODBC.

El proveedor OLE DB .NET permite conectar nuestras aplicaciones a fuentes de


datos a través de OLE DB.

Otros proveedores de acceso a datos

Si bien el proveedor de acceso a datos es el mecanismo a través del cuál


podemos establecer una comunicación nativa con una determinada fuente de
datos, y dado que Microsoft proporciona los proveedores de acceso a datos más
corrientes, es cierto que no los proporciona todos, si bien, con OLE DB y ODBC,
podemos acceder a la inmensa totalidad de ellos.
Sin embargo, hay muchos motores de bases de datos de igual importancia como
Oracle, MySql, AS/400, etc.
En estos casos, si queremos utilizar un proveedor de acceso a datos nativo,
deberemos acudir al fabricante o a empresas o iniciativas particulares para que
nos proporcionen el conjunto de clases necesarias que nos permitan abordar esta
acción.

El objeto Connection

Este objeto es el encargado de establecer una conexión física con una


base de datos determinada.
Para establecer la conexión con una determinada fuente de datos, no
sólo debemos establecer la cadena de conexión correctamente, sino que
además deberemos usar los parámetros de conexión y el proveedor de
acceso a datos adecuado.
Con este objeto, podremos además abrir y cerrar una conexión.

El objeto Command

Este objeto es el que representa una determinada sentencia SQL o un


Stored Procedure.
Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos
conjuntamente con el objeto DataAdapter que es el encargado de
ejecutar la instrucción indicada.

El objeto DataReader

Este objeto es el utilizado en una sola dirección de datos.


Se trata de un objeto de acceso a datos muy rápido.
Este objeto puede usar a su vez el objeto Command o el método ExecuteReader.
Asp_net -39-

El paradigma de la conexión
Cuando abordamos un proyecto de acceso a fuentes de datos, siempre
nos encontramos con una duda existencial.
¿Debemos crear una conexión con la base de datos al principio de
nuestra aplicación y cerrarla cuando la aplicación se cierre?, ¿o debemos
crear una conexión con la base de datos sólo cuando vayamos a trabajar
con la fuente de datos?. ¿Y si estamos trabajando continuamente con
una fuente de datos?, ¿cómo penalizarían todas estas acciones?.
Es difícil de asumir que acción tomar en cada caso, y es que
dependiendo de lo que vayamos a realizar, a veces es más efectiva una
acción que otra, y en otras ocasiones, no está del todo claro, ya que no
existe en sí una regla clara que especifique qué acción tomar en un
momento dado.
Lo que sí está claro es que el modelo de datos de ADO.NET que hemos
visto, quedaría resumido en cuanto a la conectividad de la manera en la
que se representa en la figura 1.

Visión general de ADO.NET respecto a la conectividad con bases de datos

Figura 1

El objeto DataSet nos ofrece la posibilidad de almacenar datos, tablas y


bases de datos de una determinada fuente de datos.
De esta manera, podemos trabajar con las aplicaciones estando
desconectados de la fuente de datos.
Sin embargo, a veces necesitamos trabajar con la fuente de datos estando
conectados a ella.
El objeto DataReader nos ofrece precisamente la posibilidad de trabajar con
fuentes de datos conectadas.
Por otro lado, el objeto DataReader tiene algunas particularidades que
conviene conocer y que veremos a continuación.
Asp_net -40-

Conociendo el objeto DataReader


El objeto DataReader nos permite como hemos indicado anteriormente,
establecer una conexión con una fuente de datos y trabajar con esta fuente
de datos sin desconectarnos de ella, sin embargo, hay diferentes
cualidades y particularidades que conviene conocer.

DataReader es de solo lectura

Lo que hemos dicho anteriormente, requiere sin embargo, que esta


conexión se establezca en un modo de sólo lectura, al contrario de lo que
se puede hacer con el objeto DataSet, con el que podemos interactuar con
la fuente de datos en modo lectura y modo escritura.

DataReader se maneja en una sola dirección

El objeto DataReader sólo permite que nos desplacemos por los datos en
una sola dirección, sin vuelta atrás.
Por el contrario, el objeto DataSet nos permite movernos por los registros
para adelante y para atrás.
Además, sólo podemos utilizar el objeto DataReader con conexiones
establecidas en una sentencia SQL por ejemplo, pero no podemos variar
esta.
Para hacerlo, debemos entonces modificar la conexión con el comando
establecido.

DataReader es rápido

Debido a su naturaleza y características, este objeto es bastante rápido a la


hora de trabajar con datos.
Como es lógico, consume además menos memoria y recursos que un
objeto DataSet por ejemplo.
Sin embargo, dependiendo de las necesidades con las que nos encontremos, puede que
este método de acceso y trabajo no sea el más idóneo.

Analizando el flujo de trabajo de DataReader

Cuando trabajamos con fuentes de datos conectadas, trabajaremos con el objeto


DataReader.
Asp_net -41-

Para trabajar con este objeto, utilizaremos los objetos siguientes del proveedor de
acceso a datos:
Connection
Command
DataReader
Un resumen gráfico de esto es lo que podemos ver en la figura 1.

El flujo de conectividad de DataReader

Objetivo: Construir un formulario con un control GridView para visualizar,


modificar y eliminar datos de la tabla “Products” de la base de datos
Northwind.
NOTA: La serie de pasos utilizada en la resolución del presente ejercicio no
necesariamente refleja las mejores prácticas de Desarrollo y Arquitectura de
aplicaciones empresariales establecidas por Microsoft.

1. Abra el Visual Web Developer 2005 Express Edition. Seleccione el menú


File / New Web Site para crear un nuevo Web Site, según la siguiente
figura. Note que el lenguaje es el Visual Basic, pero si usted desea cambiarlo a
Visual C# no hay ningún problema, ya que los pasos son los mismos.
Asp_net -42-

2. Luego presione el botón OK. Se abrirá una ventana conteniendo la página


Default.aspx con el HTML que se mostrará. A los efectos del ejercicio, vamos a
crear páginas relativas al tópico abordado, por lo tanto, abra el Solution Explorer
(Ctrl + Alt + L) y excluya esta página. Para agregar una nueva página al Solution
Explorer, haga click con el botón derecho sobre C:\WebSite\DCE20005 y
seleccione Add New Item. Escriba GridView.aspx en el nombre de la página y haga
click en Add.
Asp_net -43-

3. En caso de que quiera escribir los Tags HTML directamente en esta ventana,
siéntase a gusto, sin embargo, le mostraré los controles en la ventana de Design.
Siendo así, haga click en el botón Design en el pie de la página.

4. Abra la Toolbox y arrastre un control GridView hacia el formulario. Se abrirá una


Smart Tag conteniendo diversas opciones.
Asp_net -44-

5. Seleccione Auto Format y aplique un formato de acuerdo con su gusto.

6. Para definir la fuente de datos, en Choose Data Source seleccione New Data Source.
Asp_net -45-

Usted puede seleccionar cualquier fuente de datos, pero en este caso elija Database.
Note que ya se define un ID (SqlDataSource1), y en caso de que quiera alterarlo bastará
con escribirlo. Como vamos a utilizar esta conexión en varios ejercicios, deje el
checkbox de conexión seleccionado para que la string de conexión sea almacenada en el
archivo Web.Config.

7. Se abrirá un “wizard” por el cual se configura la base de datos y se arma la cadena


de conexión, le dejamos ese paso para que lo configure de acuerdo a sus
necesidades.

8. Una vez configurada la cadena de conexión necesita identificar cuál es la tabla que
será usada como fuente de datos. Seleccione Productos y algunos campos.
Asp_net -46-

9. Como permitiremos la edición de datos en el GridView, haga click en el botón


Advanced para abrir esta ventana, donde seleccionará las dos opciones para incluir
en el control SqlDataSource todas las instrucciones SQL que hacen efectivas estas
operaciones.
Asp_net -47-

10. En la Smart Tag se muestran los checkboxes para que active las operaciones.
Seleccione:
• Enable Paging, para permitir la paginación.
• Enable Sorting, para permitir el ordenado por columna.
• Enable Editing, para permitir la edición de datos directamente en el GridView.
• Enable Deleting, para permitir la exclusión de datos.

11. Si desea editar las columnas, seleccione Edit Columns. Primero deberá “de
seleccionar” el tilde campo “Auto generate Columns”, y luego añadir las columnas
que desee
Asp_net -48-

12. Puede aplicar el formato que desee en los campos, por ejemplo configure el
formato en el campo “ProductNumber para que sea exhibido como numérico, sin
decimales (DataFormatString = {0:n0}).
Se puede aplicar cualquier formato a las columnas.

13. Como fue permitida la edición de datos en el control, personalice los botones al
idioma en el que el control será utilizado. Para ello, seleccione el Command Field,
localice las propiedades Text de cada botón y modifique el texto.
Asp_net -49-

14. Seleccione Auto Format en el Smart Tag, y aplique un formato de acuerdo con su
agrado. (en el ejemplo adjunto en el material se utiliza un Theme para la definición
del estilo)

15. Guarde el proyecto y presione CTRL + F5 para ejecutarlo en el navegador.


Es importante destacar que el ASP.NET 2.0 no necesita tener un IIS instalado en la
máquina, ya que trabaja con su propio servidor web de desarrollo.
Asp_net -50-

Empleando la BDD Northwind


1.-Ingrese el código del cliente en caso que exista muestre sus pedidos de lo contrario en
una una ventana muestre código no existe.

Código de Cliente Pedidos del Cliente


Compañía
Enviar Ciudad
OrderId OrderDate Freight

Cantidad de Pedidos
<<Retorno

2.-Seleccione una categoría desde un combo , seleccionando una categoría muestre todos
los productos de esa categoría

3.- Consulta por opciones

1.1 Pedidos Por Mes del Año

Mes Total
Enero
Febrero

Total Monto

Retorno
Asp_net -51-

Pedidos por Cliente En ambos casos emplear


Customerid Companyname Total agrupamientos las tablas a emplear
son Order y [order Details]
El Primero agrupe por mes y el
segundo por código y nombre del
<<Retorno cliente

4.- Ingresando el Nro de pedido que muestre Su detalle correspondiente:


Emplear las tablas: Products (ProductId, Productname, Quantity,UnitPrice , Total)
ademas al final debe sumar la columna total.

5.- Consulta en Cascada .- Ingrese dos rangos de fecha (fecha inicial y fecha final ) validar
para que la fecha final sea mayor al inicial , debe mostrar todos los pedidos en esa fecha
(OrederId, Companyname y fecha ) ademas en el detalle habra un hipervínculo para
mostrar su detalle correspondiente en ota pagina similar a la pregunta nro 4.

6- Mantenimiento general de una tabla , mostrar en un Datagrid la lista de productos


(Idproducto, ProductName , UnitPrice y hipervínculo para editar (Modificar de los datos)
como se muestra en la grafica .
Ademas tendrán un botón para agregar nuevos productos.

Edición de Campos ( para Modificación de registros) y Nuevos registros


Asp_net -52-

El código no se ingresa, se genera


o se incrementa a la hora de grabar
un dato
Asp_net -53-

CAPITULO 5

PAGINAS MAESTRAS (MASTER PAGES)

Vamos a aprender ciertas cuestiones avanzadas de ASP.NET 2.0 que nos


ayudarán a crear aplicaciones más potentes y con menos esfuerzo que con cualquier otra
herramienta de desarrollo, incluyendo versiones anteriores de .NET

Páginas principales o Master Pages

Lo más habitual cuando se crea una aplicación o un sitio Web es que las
páginas que lo conforman sean todas bastante parecidas o al menos que
existan varios grupos de páginas similares que sólo varían ciertos contenidos
entre ellas. Por ejemplo, puede haber una categoría de páginas para
mostrar artículos en el que todas son iguales excepto por el contenido del
propio artículo en su parte central, mientras que en otra zona de la
aplicación el diseño es completamente diferente pero sus páginas se parecen
todas entre sí
Por ejemplo, la siguiente figura muestra capturas de dos páginas pertenecientes al
portal MSDN:
Asp_net -54-

Tradicionalmente para conseguir esta similitud entre páginas había que


crearlas individualmente o recurrir a artificios propios como por ejemplo el
de utilizar archivos de inclusión para renderizar ciertas partes de las
páginas desde un mismo origen en disco. Aún en este último caso
la capacidad de modificación era limitada y normalmente se reducía a las
cabeceras y pies de las páginas y poco más. En el primero de los casos
(retocar una a una) cualquier cambio estético de un sitio medianamente
grande era poco menos que una locura de realizar

ASP.NET 2.0 ofrece una nueva característica destinada a paliar esta


tradicional carencia y permite definir páginas cuyo aspecto y funcionalidad
deriva de unas páginas especiales comunes llamadas Páginas principales o
Master Pages

¿Qué son las Master Pages?

Una Master Page proporciona una forma de definir una estructura e interfaz
comunes para un grupo de páginas pertenecientes a un mismo sitio Web.
Esta estructura común se almacena en un único archivo independiente. Ello
facilita mucho su mantenimiento puesto que, para actualizar todas las
páginas que lo utilizan, basta con editar dicho archivo
Asp_net -55-

Una MP es en realidad como una página ASPX normal que contiene


código, elementos HTML y controles Web de servidor. Sin embargo posee
una extensión diferente (.master) y utilizan una

directiva <% @ master %> en lugar de una directiva <% @ page %>. Por lo
demás se pueden considerar prácticamente equivalentes. Esto es importante
porque significa que ya sabemos todo lo necesario para crearlas.

Una página ASPX normal puede derivar su estructura a partir de una MP


simplemente añadiendo un atributo MasterPageFile a su directiva de página, así:

Definición de una Master Page

Para agregar una Master Page a nuestro proyecto sólo hay que elegir el
icono Página Principal en el diálgo de agregar nueva referencia de cualquier
carpeta del mismo:

Al abrir una MP aparece un diseñador idéntico al de una página ASPX


normal. Podemos arrastrar sobre su superficie cualquier control así como
editar su HTML de la manera usual. También lleva un archivo de código
asociado en el que se puede responder a sus diversos eventos. La única
diferencia apreciable a simple vista respecto a una página normal es que
contiene por defecto un control de tipo ContentPlaceHolder. La sintaxis de este
control es análoga a la siguiente:
Asp_net -56-

Su única propiedad interesante es precisamente su identificador ya que este


tipo de control se utiliza para marcar las posiciones en las que irán
los diferentes contenidos de las páginas derivadas dentro de la plantilla de
estructura que es una Master Page.

De este modo, cuando una página normal derive de una MP, sólo se podrá
introducir código dentro de las zonas definidas por estos comodines de contenido
Cuando añadimos una nueva página ASPX a nuestro proyecto y existe al
menos una Master Page, podemos marcar una opción para que, antes
de crearla, nos permita seleccionar de qué MP derivará:

Master Pages anidadas


Una Master Page a su vez puede derivar de otra que previamente
hayamos definido, por lo que heredará la estructura y contenidos de ésta.
Al igual que en el caso de las páginas normales sólo hace falta establecer
el atributo MasterPageFile.

Esta característica se suele utilizar para definir en una de ellas la estructura


general del sitio Web. En otra de las MP se define únicamente la estructura
de los contenidos que contiene la estructura general.
Asp_net -57-

La única "pega" que tiene el uso de Master Pages anidadas es que no


están soportadas por el diseñador de Visual Studio, por lo que habrá que
añadir los controles directamente a mano desde la vista de marcado de la
página. Siempre podremos diseñarlas visualmente antes de hacerlas derivar
de una Master Page anidada y así salvar esta limitación.

Acceso a los elementos de una Master Page


Es posible acceder a los controles y elementos de una página principal
desde el código de una página derivada a través de una directiva especial
llamada MasterType. Sólo hay que indicar la ruta de la Master Page a la que
queremos acceder, así:

Por ejemplo, si nuestra Master Page tiene un elemento de imagen llamado


'Logo' y queremos variarlo en cada página mediante código sólo habría que
escribir:
Nota: Master.FindControl("Logo")
Lo mejor, sin embargo, es definir propiedades en la Master Page que
encapsulen el acceso a sus elementos. El código anterior devuelve un
objeto de tipo Control que deberemos convertir en un control de imagen y
asignarle la ruta al logo a utilizar. Es más mucho más fácil, menos propenso a
errores y de mejor mantenimiento futuro el definir una propiedad 'Logo' en
nuestra Master Page y acceder a ella escribiendo, por ejemplo:
Nota: Master.Logo = "http://www.microsoft.com/logo_msdn.gif"
que nos aislará de lo que ocurra debajo para gestionar ese logo.

Temas y skin
Asp_net -58-

Gracias a las Master Pages podemos definir una estructura común para las
páginas de nuestra aplicación Web. Sin embargo aún no hemos resuelto
todas las cuestiones sobre el mantenimiento de la interfaz que habíamos
planteado. Los controles que añadamos a las zonas de contenido de
nuestras páginas todavía tendrán el aspecto predeterminado. Podemos
configurar su aspecto estableciendo las propiedades de apariencia del
control (como BackColor, Font, etc...). El problema que tiene este método
es que, si deseamos cambiar por completo la apariencia de estos controles,
tendríamos que tocar una por una todas las páginas. Esta no es una opción
admisible en cuanto la aplicación dispone de más de unas pocas página

Temas y máscaras (Skins)


La carpeta App_Themes
Estructura de un archivo .skin
Propiedades que se pueden personaliza
Asignación de temas
Asignación global de temas
Precedencia de propiedades
Deshabilitar temas en controles concretos
Clases de un mismo tipo de control
Inclusión automática de hojas de estilo
Rutas de imágenes

HOJAS DE ESTILO

HTML ofrece una interesante opción para independizar el aspecto de sus


elementos del contenido de las páginas a través del uso de las hojas de
estilo en cascada (Cascading Style-Sheets o CSS). Las hojas CSS permiten
definir el aspecto de cualquier elemento HTML contenido en una página.
Aunque se pueden definir dentro de la propia página, hacerlo así les hace
perder su verdadero sentido que no es otro que el de separar la definición
del aspecto. Así, es posible crear archivos con extensión '.css' que se vinculan
a las diferentes páginas de un sitio y definen el aspecto de sus elementos.

Dentro de una hoja CSS se definen fundamentalmente dos tipos de estilos:

Redefinición de etiquetas: indican qué aspecto deben tener todas las


etiquetas de un determinado tipo en las páginas a las que esté vinculado el
archivo. Por ejemplo:

text-decoration: none;
color: #DBB94F;}
Asp_net -59-

body { background-color: #656565;


background-image: url(Images/background.gif);
background-repeat: repeat;
margin: 0;
padding: 0;
text-align: center;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 0.7em;
color: #FFFFFF;}

En este fragmento, las etiquetas definen el aspecto que deben tomar los enlaces y
el cuerpo de la página.

Clases: definen aspectos que no están asociados a una etiqueta


HTML concreta sino que se pueden asignar mediante el atributo class a cualquiera
de ellas. Por ejemplo:

EstiloSimple { text-decoration: none; color: #DBB94F;}

La gran ventaja de esta técnica es que basta con tocar el archivo CSS
para que todas las páginas que lo utilizan vean su aspecto modificado de
manera acorde a los cambios. Da igual que sea sólo una o haya miles. Al
tener el aspecto centralizado en una ubicación única el mantenimiento es
muy sencillo.

Soporte de estilos en ASP.NET


Lo anterior es una característica de HTML independiente de lenguajes de
programación como

ASP.NET. Por supuesto ASP.NET tiene en cuenta y soporta perfectamente las


hojas CSS.

Se puede añadir una etiqueta <LINK> a la cabecera de una página ASPX


y los elementos HTML que se generan a partir de los controles que contiene se
mostrarán siguiendo las indicaciones de la misma.

El entorno de desarrollo de Visual Studio permite definir los estilos de los


controles HTML de servidor de ASP.NET utilizando su propiedad Style, tanto
en tiempo de diseño como durante la ejecución. El diseñador de páginas
ASPX incluso ofrece un diálogo especializado para crear los estilos.
Asp_net -60-

La gran ventaja de esta técnica es que basta con tocar el archivo CSS
para que todas las páginas que lo utilizan vean su aspecto modificado de
manera acorde a los cambios. Da igual que sea sólo una o haya miles. Al
tener el aspecto centralizado en una ubicación única el mantenimiento es
muy sencillo.

Soporte de estilos en ASP.NET


Lo anterior es una característica de HTML independiente de lenguajes de
programación como

ASP.NET. Por supuesto ASP.NET tiene en cuenta y soporta perfectamente las


hojas CSS.

Se puede añadir una etiqueta <LINK> a la cabecera de una página ASPX


y los elementos HTML que se generan a partir de los controles que contiene se
mostrarán siguiendo las indicaciones de la misma.

El entorno de desarrollo de Visual Studio permite definir los estilos de los


controles HTML de servidor de ASP.NET utilizando su propiedad Style, tanto
en tiempo de diseño como durante la ejecución. El diseñador de páginas
ASPX incluso ofrece un diálogo especializado para crear los estilos.
Asp_net -61-

TRABAJO 3: MASTER PAGES Y EL CONTROL SQLDATASOURCE

Proyecto 1: Creara un proyecto con una página Maestra.


Las imágenes serán proporcionadas por el profesor.
Creara una carpeta principal y 3 subcarpetas con los nombres asignados en la
imagen mostrada. En cada carpeta ubicara las imágenes que el profesor le
proporcionara.
Asp_net -62-

Creara una Página Maestra y creara tal como se muestra en el diseño mostrado.
El Diseño del Master Page (MasterPage.Master)

HyperLink1 = Llama a la pagina MisEmpleados.aspx


HyperLink2 = Llama a la pagina ZonasTuristicas
HyperLink3 = Llama a la pagina Expositores.aspx

Al hacer un clic en cualquier imagen, la imagen se deberá de mostrar en un


tamaño de 300 * 250. el cual se mostrara en otra pagina .aspx.
Imágenes.aspx
Asp_net -63-

Ejecución de la Pagina Expositores.apx

En esta pagina Web, realizara el mismo diseño y enlazara las imágenes en


cada control LinkButton, también cuando se de Clic se deberá de mostrar
en otra pagina Web, con un tamaño de 350*250.
MisEmpleados.aspx
Asp_net -64-

Proyecto 2: Manejo de Datos, utilizando una página maestra llamara a cuatro


páginas Web en el cual se mostraran un listado del contenido de cada tabla.

Creara un Master Page, que se diseño único que tomaran todas las paginas Web
que vienen a continuación.
Asp_net -65-

Customers.Aspx

La ejecución sera:
Asp_net -66-

Similar para la pagina de empleados.aspx

Similar para la El WebProducts.aspx

Y para el formulario WebOrden.aspx :


Asp_net -67-

CAPITULO 6

DetailsView
Construir un formulario con el control DetailsView para visualizar y
modificar los registros de la tabla “Employes” de la base de datos
AdventureWorks.
1. Agregue un nuevo Web Form al Solution Explorer, llámelo DetailsView.aspx.
2. Abra la Toolbox y arrastre un control DetailsView hacia el formulario. Se abrirá una
ventana con la Smart Tag para informar la fuente de datos. Seleccione New data
source:

3. Informe cuál es la fuente de datos, en este caso es una Database.


Asp_net -68-

4. Seleccione la tabla Employees con algunos campos.


Asp_net -69-

5. Haga click en el botón Advanced Options y seleccione los dos checkboxes para que
sean creados los métodos para soportar la inserción y edición de datos.

6. Volviendo al Smart Tag, seleccione todos los checkboxes para activar la paginación
y el mantenimiento de datos.
7. .Ingrese a la opción “EditFields…” y des seleccione la opción “Auto generate
columns”. Del mismo modo que hizo con la grilla, añada los campos que desee por
medio de la opción “Add New Field…”

8. Personalice el campo “Fecha Finalización” para que quede con el formato de


acuerdo con la propiedad DataFormatString, que es {0:dd/MM/yyyy}. El “0:”
indica que será el campo actual y el formato viene a continuación.
Asp_net -70-

9. analiza el código HTML generado, notará que el contenido de la fuente de datos


está declarado dentro del HTML a través de la Tag asp:SqlDataSource.

<form id="form1" runat="server">


<asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True"
AutoGenerateRows="False" BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None"
BorderWidth="1px" CellPadding="3" CellSpacing="2" DataSourceID="SqlDataSource1"
Height="50px" Width="125px">
<FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
<EditRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
<PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
<Fields>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True"
/>
<asp:BoundField DataField="ProductId" HeaderText="Codigo" SortExpression="ProductId" />
<asp:BoundField DataField="Name" HeaderText="Nombre" SortExpression="Name" />
<asp:BoundField DataField="ProductNumber" HeaderText="Producto"
SortExpression="ProductNumber" />
<asp:BoundField DataField="DaysToManufacture" HeaderText="Demora en Dias"
SortExpression="DaysToManufacture" />
<asp:BoundField DataField="ListPrice" HeaderText="Precio" SortExpression="ListPrice" />
<asp:BoundField DataField="DiscontinuedDate" DataFormatString="{0:dd/MM/yyyy}"
HeaderText="Fecha Finalizacion" SortExpression="DiscontinuedDate" /> </Fields>
<HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
</asp:DetailsView>
<asp:SqlDataSource ID="sqlDataSource" runat="server" ConnectionString="<%$
ConnectionStrings:ADVENTUREWORKSConnectionString %>"
ConflictDetection="CompareAllValues"
SelectCommand="SELECT [ProductID], [Name], [ProductNumber], [Color], [DaysToManufacture],
[ListPrice], [DiscontinuedDate] FROM [Production].[Product]"
Asp_net -71-

DeleteCommand="DELETE FROM [Production].[Product] WHERE [ProductID] =


@original_ProductID AND [Name] = @original_Name AND [ProductNumber] =
@original_ProductNumber AND [Color] = @original_Color AND [DaysToManufacture] =
@original_DaysToManufacture AND [ListPrice] = @original_ListPrice AND [DiscontinuedDate] =
@original_DiscontinuedDate"
InsertCommand="INSERT INTO [Production].[Product] ([Name], [ProductNumber], [Color],
[DaysToManufacture], [ListPrice], [DiscontinuedDate]) VALUES (@Name, @ProductNumber,
@Color, @DaysToManufacture, @ListPrice, @DiscontinuedDate)"
OldValuesParameterFormatString="original_{0}"
UpdateCommand="UPDATE [Production].[Product] SET [Name] = @Name, [ProductNumber] =
@ProductNumber, [Color] = @Color, [DaysToManufacture] = @DaysToManufacture, [ListPrice] =
@ListPrice, [DiscontinuedDate] = @DiscontinuedDate WHERE [ProductID] = @original_ProductID
AND [Name] = @original_Name AND [ProductNumber] = @original_ProductNumber AND [Color] =
@original_Color AND [DaysToManufacture] = @original_DaysToManufacture AND [ListPrice] =
@original_ListPrice AND [DiscontinuedDate] = @original_DiscontinuedDate">
<DeleteParameters>
<asp:Parameter Name="original_EmployeeID"></asp:Parameter>
...
<asp:Parameter Name="original_Photo"></asp:Parameter>
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Type="String" Name="LastName"></asp:Parameter>
...
<asp:Parameter Name="original_Photo"></asp:Parameter>
</UpdateParameters>
<InsertParameters>
<asp:Parameter Type="String" Name="LastName"></asp:Parameter>
...
<asp:Parameter Name="Photo"></asp:Parameter>
</InsertParameters>
</asp:SqlDataSource>
</form>

10. Guarde el proyecto y ejecútelo en el navegador. Incluya un nuevo registro y


guárdelo. Enseguida, modifique el contenido y guarde nuevamente.
Asp_net -72-
Asp_net -73-

Capitulo 7

FormView
Objetivo: Construir un formulario con el control FormView para visualizar
los registros de la tabla “Customers” de la base de datos NorthWind.

1. Agregue un nuevo Web Form en el Solution Explorer. Arrastre el control


FormView hacia el formulario.

2. La fuente de datos será un Database. Seleccione la tabla Customers de la base de


datos Northwind y todos los campos.

3. Aplique un Auto Format según la opción.

4. Ajuste el layout de manera que quepan todos los datos.


Asp_net -74-

5. Guarde el proyecto y ejecútelo en el navegador. Navegue en las páginas para


visualizar los registros.

DataList
Construir un formulario con el control DataList. Este control muestra diversos
registros en la misma página en la que usted debe determinar el área de datos
y el respectivo layout.
1. Agregue un nuevo Web Form al Solution Explorer.
Arrastre el control DataList hacia el formulario.
Como en los ejercicios anteriores seleccione el DataSource, en este caso seleccione
la tabla Orders.

2. Configure con AutoFormat para que el control tenga un aspecto de su agrado.


Asp_net -75-

3. Personalice el campo OrderDate para que la fecha sea mostrada en el formato


adecuado.
Para ello, seleccione el OrderDateLabel y el enlace Edit DataBindings.
Configure el formato para Short Date.

Note que en el HTML, la propiedad clave para exhibir los datos es la Text donde usa el Eval(field).

<asp:DataList ID="DataList1" Runat="server


DataSourceID="SqlDataSource1" RepeatColumns="3">
<ItemTemplate>
<b>OrderID: </b>
<asp:Label ID="OrderIDLabel" Text='<%# Eval("OrderID") %>'/>
OrderDate:
<asp:Label ID="OrderDateLabel" Text='<%# Eval("OrderDate", "{0:d}")
...
ShipCountry:
<asp:Label ID="ShipCountryLabel" Text='<%# Eval("ShipCountry")%>'/>
</ItemTemplate>
</asp:DataList>
Asp_net -76-

<asp:SqlDataSource ID="SqlDataSource1" Runat="server


SelectCommand="SELECT [OrderID], [OrderDate], [ShipName],
[ShipAddress], [ShipCity], [ShipCountry] FROM [Orders]
ConnectionString="<%$ ConnectionStrings:AppConnectionString1 %>">
</asp:SqlDataSource>

Guarde el proyecto y ejecútelo en el navegador.

Ejemplos Básicos con ADO NET

La BDD a emplear es BDVENTA y en otros casos será Northwind.


Sus tablas:
Asp_net -77-

La conexión puede efectuarse con SqlServer o con cualquier otro Proveedor de BDD
Como se muestra en la figura.

Imports system.data.sqlClient
Imports System.data.OleDb
Imports system.data
Public Class WebApli01
Inherits System.Web.UI.Page
Dim CnSql As New SqlConnection("Server=localhost;uid=sa;database=BDventas")
Dim CnOle As New OleDbConnection("Provider=SQlOLEDB;uid=sa;database=ventas")

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


MyBase.Load
If Not Page.IsPostBack Then
lblfecha.Text = Now.ToShortDateString
End If
2 End Sub
Private Sub CmdSQLClient_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CmdSQLClient.Click
Dim da As New SqlDataAdapter("Select * From Clientes", CnSql) Dim ds As New
DataSet
da.Fill(ds)
GridView1.DataSource = ds.Tables(0)
GridView1.DataBind()
End Sub

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


System.EventArgs) Handles CmdOLEDB.Click
Dim da As New OleDbDataAdapter("Select * from Empleado", CnOle)
Dim ds As New DataSet
da.Fill(ds, "Vendedor")
Grid1View1.DataSource = ds.Tables(0)
Grid1View1.DataBind()
Asp_net -78-

End Sub
End Class

Empleando conexiones conectadas

Su diseño

Txtlist1 TxtList2 TxtList3

Codificación de la pagina Web02.aspx

Imports System.Data
Imports System.Data.sqlclient
Public Class Web02
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=(Local);Uid=sa;database=Bdventas")
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
If Not Page.IsPostBack Then
Dim dr As SqlDataReader
Dim sql1 As String = "Select * From Clientes"
Dim sql2 As String = "Select * From Fac_Cabe"
Asp_net -79-

Dim sql3 As String = "Select * From Articulos"


Dim cmd As New SqlCommand(sql1 + ";" + sql2 + ";" + sql3, cn)
cn.Open()
cmd.CommandType = CommandType.Text
dr = cmd.ExecuteReader ‘Lectura de un solo sentido hacia adelante
While dr.Read
ListBox1.Items.Add(dr("Cli_Nom"))
End While
'Desplaza al lector al siguiente resultado
'de la sentencoa SQL
dr.NextResult()
While dr.Read
ListBox2.Items.Add(dr("Fac_Num") & Space(2) & dr("fac_Fec"))
End While
dr.NextResult()
While dr.Read
ListBox3.Items.Add(dr("Art_nom")) ‘nombre de Articulo
End While
dr.Close()
cn.Close()
txtList1.Text = ListBox1.Items.Count ‘Muestra las cantidades
txtList2.Text = ListBox2.Items.Count
txtList3.Text = ListBox3.Items.Count
End If
End Sub
End Class

Aplicación 03.- Empleando GridView con Vínculos y relaciones de Tablas

Empleando la BDD NOrthwind


Codificación de la pagina Web03.aspx
Imports System.data
Imports System.Data.SqlClient
Asp_net -80-

Public Class Web03


Inherits System.Web.UI.Page
‘variables Generales
Dim cn As New SqlConnection("Server=localhost;uid=sa;database=Northwind") Dim ds
As New DataSet
Dim da As New SqlDataAdapter("Select CategoryID,CategoryName From Categories", cn)
Dim db As New SqlDataAdapter("Select ProductID,ProductName,CategoryID From
Products", cn)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
da.Fill(ds, "Categoria")
db.Fill(ds, "Productos")

'Relacionando las tablas con el objeto DateRelation


Dim colP As DataColumn = ds.Tables("Categoria").Columns("CategoryID")
Dim colH As DataColumn = ds.Tables("Productos").Columns("CategoryID")
Dim rl As DataRelation
rl = New DataRelation("Relacion", colP, colH)
ds.Relations.Add(rl)
GridView1.DataSource = ds.Tables("Categoria").DefaultView
Grid1View1.DataBind()
End Sub
Private Sub Grid1View1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles GridView1.SelectedIndexChanged
Dim dv As New DataView(ds.Tables("Categoria"))
Dim dr As DataRowView
dr = dv(Grid1View1.SelectRow.Index)
GridView2.DataSource = dr.CreateChildView("Relacion")
GridView2.DataBind()
End Sub
End Class

4.- Aplicación en cascada , al seleccionar un cliente que muestre todas sus facturas:
Asp_net -81-

Para no hacer redundancia con sqldataAdapter , dataset y el llenado del dataset en memoria,
seria ideal de realizar una función, de tal modo que cada vez que se desea tener acceso a
una tabla de BDD o consulta invocamos a la funcion.

Nos da una Tabla

RUNSQL
CadSql

Puede ser :
Select * from Cliente

Codificación de la pagina web04.aspx


Imports System.Data
Imports System.Data.SqlClient
Imports System.Drawing
Public Class WebApli04
Inherits System.Web.UI.Page
‘Cadena de conexion
Const cn ="Server=(local);uid=sa;database=Bdventas"

Function Runsql(Cad as string) as DataTable


Dim Da as new SqldataAdapter(cad,cn)
Dim Dt as New DataTable
Da.Fill(Dt)
Return Dt
Da.dispose() ‘ Liberar memoria
End Function
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Introducir aquí el código de usuario para inicializar la página
If Not Page.IsPostBack Then
DropDownList1.Datasource=Runsql(“Select * From Clientes”)
DropDownList1.DataTextField=”Cli_Nom” ‘ Que muestre el nombre
DropDownList1.DataValueField=”Cli_Cod” ‘Pero se puede acceder a su código
DropDownList1.Databind()
End If
End Sub
Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged
Asp_net -82-

Try
Dim codigo As String =chr(39)+ DropDownList1.SelectedValue+ chr(39)
Dim strsql As String
strsql = "Select Fac_num From Fac_Cabe where Cli_cod=" & codigo
DropDownList2.Datasource=Runsql(Strsql)
DropDownList2.Databind()
If DropDownList2.items.count=0 then
lblMensaje.Text = " * No tiene Facturas"
lblMensaje.ForeColor = Color.Red
'Ocultando la respuesta del datagrid
Panel1.Visible = False
Exit Sub
Else
lblMensaje.Text = ""
Panel1.Visible = True
End If
Catch ex As SqlException
Response.Write(ex.Message)
End Try
End Sub
Private Sub DropDownList2_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles DropDownList2.SelectedIndexChanged
Try
Dim factura As String = chr(39)+DropDownList2.SelectedItem.Text+chr(39)
Dim strsql As String
strsql = "Select Art_nom,P.Art_Pre,Art_Can,Total=(P.Art_Pre*Art_can) " & _
" From Fac_deta d, Articulos p where d.Art_cod=p.Art_cod " & _
" and Fac_Num=" & factura
Dim da As New SqlDataAdapter(strsql, cn)
Dim ds As New DataSet
da.Fill(ds, "Detalle")
GridView1.DataSource = ds.Tables("Detalle")
DataGrid1.DataBind()
'Obteniendo la suma total del detalle
txtTotal.Text = Format(ds.Tables("Detalle").Compute("Sum(Total)", ""), "##0.##") Catch
ex As SqlException
Response.Redirect(ex.Message)
End Try
End Sub
End Class
Asp_net -83-

Aplicacion 5.-

La salida será

Aplicación 05.aspx
Imports System.Data
Imports System.Data.SqlClient
Public Class Web05
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=localhost;uid=sa;database=bdventas")

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


As System.EventArgs) Handles txtdatos.TextChanged
Dim strsql As String
strsql = "Select cli_nom, cli_nom From clientes " & _
" where Cli_nom like '" & RTrim(txtdatos.Text) & "%'"
Dim da As New SqlDataAdapter(strsql, cn)
Dim ds As New DataSet da.Fill(ds)
ListBox1.DataSource = ds.Tables(0)
ListBox1.DataTextField = "Cli_nom"
Asp_net -84-

ListBox1.DataValueField = "Cli_cod"
ListBox1.DataBind()
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Try
Dim codigo As String = chr(39) & ListBox1.SelectedItem.Value & chr(39)
Dim strsql As String

strsql = "Select Top 5 A.Fac_Num,Fac_fec, Total=sum(Art_pre*Art_can) “ & _


“ From Fac_Cabe A, Fac_deta B, Articulos C Where a.Fac_num=B.fac_num " & _
" And B.art_cod=C.Art_cod and Cli_cod=" & codigo & “ Order by Total desc"
Dim da As New SqlDataAdapter(strsql, cn)
Dim ds As New DataSet
da.Fill(ds, "Facturas")
GridView1.DataSource = ds.Tables("Facturas")
GridView1.DataBind()
Catch ex As SqlException
Response.Write(ex.Message)
End Try
End Sub
End Class

6.- Búsqueda de rangos por letras.-

RadioButtonList
Rbletras
TxtTotal

En el primer radioList llamado (opciones)


Asp_net -85-

Codificación web06.aspx
Imports System.Data
Imports System.Data.SqlClient
Public Class Web06
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=localhost;uid=Sa;database=Northwind") Dim ds
As New DataSet
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
If Not Page.IsPostBack Then
Dim da As New SqlDataAdapter("Select CustomerID,CompanyName,ContactName From
Customers", cn)
da.Fill(ds, "Clientes")
GridView1.DataSource = ds.Tables("Clientes")
GridView1.DataBind()
txtTotal.Text = ds.Tables(0).Rows.Count
Dim i As Integer
For i = 65 To 90 ‘para llenar las opciones como letras
Rbletras.Items.Add(Chr(i)) Next
End If
End Sub
Private Sub Opciones_SelectedIndexChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Opciones.SelectedIndexChanged
Try
Dim letras As String = Opciones.SelectedItem.Text
Asp_net -86-

Dim strsql As String


strsql = "Select CustomerID,CompanyName,ContactName From Customers " & _
" where CompanyName Like '[" & letras & "]%'"
Dim da As New SqlDataAdapter(strsql, cn)
Dim dsF As New DataSet
da.Fill(dsF)
Session("Pagina") = dsF.Tables(0)
GridView1.CurrentPageIndex = 0
Grid1View1.DataSource = dsF.Tables(0)
GridVew1.DataBind()
txtTotal.Text = dsF.Tables(0).Rows.Count
Catch ex As SqlException
lblmensaje.Text = ex.Message
End Try
End Sub
Private Sub Grid1View1_PageIndexChangind(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles
GridView1.PageIndexChanged
GridView1.CurrentPageIndex = e.NewPageIndex
Grid1View1.DataSource = Session ("Pagina")
DataGrid1.DataBind ()
End Sub

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


System.EventArgs) Handles Rbletras.SelectedIndexChanged
Try
Dim strsql As String
strsql = "Select CustomerID,CompanyName,ContactName From Customers " & _
" where CompanyName Like '" & Rbletras.SelectedItem.Text & "%'" Dim da As New
SqlDataAdapter(strsql, cn)
Dim dsU As New DataSet
da.Fill(dsU)
Session("Pagina") = dsU.Tables(0)
GridView1.CurrentPageIndex = 0
GridView1.DataSource = dsU.Tables(0)
GridView1.DataBind()
txtTotal.Text = dsU.Tables(0).Rows.Count
Catch ex As Exception
lblmensaje.Text = ex.Message
End Try
End Sub
End Class
Asp_net -87-

Eliminación de registros empleando El Control Datalist


Arrastrar el DataList hacia el formulario:

Los Items que serán colocados


en el datalist tienen que
realizarse a traves de plantillas
Como se muestra en la Figura:
En la sección Item template
primero colocar:

- Insertar una tabla 4 filas por dos columnas


- Colocar los títulos correspondientes y arrastrar tres label , una imagen y un checbox
- En la etiqueta código dar el nombre Lbcod
- Y al checkbox dar el nombre Ck1
-
Enlazar cada etiqueta con el capo que estará
en memoria cuando se ejecute la pagina:
Hacer clic derecho :

luego en la caja de propiedades , asignar el


campo al objeto correspondiente

Repetir para la etiqueta


apellido :
Eval(“Apealumno”)
Para el nombre:
Eval(“Nomalumno”)
La imagen esta sujeta al
codigo y relacionado con la
carpeta Fotos:
Eval(“Idalumno”,”fotos/{0}.j
pg”)

{0}=hace referencia al
campo.
Asp_net -88-

Cuando se termina de Editar las plantillas para el datalist quedara como se muestra:

El boton eleminar , realizara la accion de borrar físicamente todos los registros que haya
marcado con el Checkbox (Ck1=> nombre que se dio en la plantilla)

Imports System.Data
Imports System.Data.SqlClient
Partial Class lista
Inherits System.Web.UI.Page
Const cadcon = "Server=(Local); DataBase=BDInstituto; Uid=sa
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
If Not Page.IsPostBack Then
listado()
End If
End Sub
Sub listado()
Dim da As New SqlDataAdapter("select * from alumno", cadcon)
Dim dt As New DataTable
da.Fill(dt)
DataList1.DataSource = dt
DataList1.DataBind()
End Sub
Asp_net -89-

Protected Sub BtnDel_Click(ByVal sender As Object, ByVal e As System.EventArgs)


Handles BtnDel.Click
Dim f As Integer
Dim ck As CheckBox
Dim cad As String = ""
For f = 0 To DataList1.Items.Count - 1
ck = CType(DataList1.Items(f).FindControl("ck1"), CheckBox)
If ck.Checked = True Then
cad = cad + Chr(39) + CType(DataList1.Items(f).FindControl("LABEL1"),
Label).Text + Chr(39) + ","
End If
Next Dar forma a la lista de
cad = "(" + Left(cad, Len(cad) - 1) + ")" codigos que se ha de
Label4.Text = cad ' muestra los codigos anulados anular, colocar los
Dim cn As New SqlConnection(cadcon) parentesis y quitar la ultima
Dim sql As String coma asignada en la
sql = "Delete From Alumno where idalumno In " + cad cadena de esta forma
Dim cmd As New SqlCommand(sql, cn) quedaria
cn.Open() ('A0002','A0004','A0009') en
cmd.ExecuteNonQuery() caso que se haya
cn.Close() selccionado estos tres
listado() codigos

End Sub
End Class
La presentacion final sera:

INTRODUCCIÓN A LOS SERVICIOS WEB


Asp_net -90-

TRABAJO Nro4: ADO.NET ASP.NET 2.0

Empleando la base de datos BDFACTURA


Creara un Master Page o pagina maestra, el cual será la base de todo el proyecto
que va a crear.
Creara un menú, y en el archivo Web.SiteMap creara todos los enlaces
que llamara a cada página Web que usted creara y llamara.
APLICACION 1:
En esta primera aplicación mostrara los registros paginados de 10 en 10, todos
los clientes de la base de datos ventas.
Cuando haga clic en un enlace, deberá de ir a la siguiente pagina llevando el
código como parámetro.
WebApli01.aspx

Este campo Hipervínculo apuntara a la pagina WebApli02.aspx con una variable


que usted creara, para que lo obtenga en el formulario siguiente donde realizara
un mantenimiento de datos de la tabla Clientes. WebApli02.aspx
Asp_net -91-

Cuando llama a la pagina WebApli02.aspx con el parámetro de envió, deberá de


mostrarse todos los datos cliente seleccionado en el formulario anterior.
Asp_net -92-

Realizara los procesos de mantenimiento de datos con los siguientes botones:


El botón nuevo: generara el código del cliente de forma automática con el formato
de código C0000. Por mas que se elimine un registre deberá de generarse el
siguiente código, tomando el ultimo registro ingresado de la tabla Clientes.
El botón grabar: Antes de ingresar el nuevo registro deberá de validar si todos los
datos están completos en las cajas de texto, use los controles de validación de acuerdo a
cada campo requerido.

El botón Actualizar: Cuando haga clic en el código de la pagina Web


WebApli01.aspx y muestre los datos del cliente en la pagina WebApli02.aspx, podrá
hacer la actualización del cualquier datos de la tabla cliente.
El botón Eliminar: Usted podrá eliminar cualquier registro que haya realzado la búsqueda.

APLICACION 2: (WebApli02.aspx)
Para realizar esta aplicación usara 2 Listboxs, un DropDownList1 donde
agregara como ítems
(>,<,>=,<=,=) y una caja de texto donde se podrá filtrar el la carga ingresada y se mostrara
en Listbox2.
Diseño:
Colocar Tres controles Textbox para Cuastomers, Ordenes (la BDD para este proyecto es
el NorthWind)
Asp_net -93-

Desarrollara el programa bajo las siguientes consideraciones:


1. Cuando cargue el programa se debera de mostrar en el Listbox1, todos los registros
de la tabla
Customers, y en la caja de texto TxtxNCustomers se deberá de mostrar el total de
Customers.
2. Cuando haga un clic en cualquier Customers del Listbox1, se deberá de mostrar en
el GridView1 todas las órdenes del Customers seleccionado. Los datos en el GridView1 se
mostrara los datos en paginación de 5 en 5.
3. Se mostrara en la caja de texto LblTotal el total de órdenes emitidas por cliente
seleccionado.
4. En el label Lblcarga se mostrara el total de carga emitida por cliente seleccionado.
5. seleccione un operador en el DropDowlist1(>,<,>=,<=,=) y agregue en la caja de
texto Txtdato una carga, y haga clic en el boton Filtrar carga se deberá de mostrar en el
Listbox2, todas las ordenes emitidas por dicha carga filtrada, que muestran actualmente en
el GridView1.
Tip: Para mantener en memoria los datos que se muestran en el GridView1, usara
una variable session(Nombre de variable de session). Usted llenara la variable sesión de
esta manera.
Session(—Paginar“) = tbl ” este DataTable ya tiene datos.
Si crea un nuevo DataTable, puede llenar de datos desde una variable session que
tiene datos guardados en memoria de esta manera:
Dim tbl1 as new DataTable= Session(—Paginar“)
Si desea filtrar los datos del DataTable y mostrarlo en otro control puede usar el metodo
Select.
Tbl1.Select(Expresión, El campo a ordenar) Una expresión puede ser por ejemplo:
OrderID = 10248.
6. A la vez de deberá de mostrar en la caja de texto TxtNOrden, el total de ordenes
mostradas en el
Listbox2.
El resultado final será:
Asp_net -94-

CAPITULO 8

Introducción:

Acceder y manipular datos directamente en una base de datos desde un formulario Web
Form puede constituir un uso muy ineficaz de los recursos, y puede crear riesgos de
seguridad. Una forma de mejorar la eficacia y seguridad del acceso a las bases de datos
es crear procedimientos almacenados en el servidor de la base de datos, e invocar
estos procedimientos almacenados desde nuestro formulario Web Form. Acceder a una
base de datos a través de un procedimiento almacenado limita el código del formulario
Web Form y el ancho de banda de la red que debemos utilizar cuando realizamos
tareas complicadas. Acceder a una base de datos mediante un procedimiento
almacenado también protege la base de datos al limitar el acceso directo a la base de
datos a procedimientos almacenados locales y de confianza.

Una alternativa al acceso directo a bases de datos desde nuestra aplicación Web es
invocar un procedimiento almacenado que accederá a la base de datos por nosotros.
El uso de procedimientos almacenados tiene varias ventajas respecto al acceso
directo a bases de datos, incluyendo la eficacia, seguridad y la protección de la base de
datos.
Asp_net -95-

¿Qué es un Procedimiento Almacenado?

Un procedimiento almacenado es un procedimiento escrito por un desarrollador de


aplicaciones para bases de datos y que está asociado a una base de datos específica. A
continuación, otras aplicaciones Web pueden invocar estos procedimientos almacenados
para acceder y manipular datos de la base de datos.

Acceso programático a una base de datos

Los procedimientos almacenados permiten el acceso a una base de datos mediante


la invocación de un procedimiento existente en lugar de tener que escribir
nuestras propias instrucciones SQL. Los procedimientos almacenados están
formados por secuencias de instrucciones Transact-SQL, y funcionan de modo similar a los
procedimientos de una aplicación Web en cuanto a que las instrucciones se invocan
por su nombre, y pueden tener tanto parámetros de entrada como de salida.

Los tres tipos de procedimientos almacenados son:

• Procedimientos almacenados que devuelven registros.-Los procedimientos


almacenados que devuelven registros se utilizan para encontrar registros específicos,
clasificar y filtrar esos registros, y devolver el resultado de las operaciones de búsqueda,
clasificación y filtrado a un objeto DataSet o un control enlazado a lista. Estos
procedimientos almacenados se basan en instrucciones Select de SQL. Un ejemplo de
un procedimiento almacenado que devuelve registros es una petición de la cantidad, fecha y
receptor de los tres últimos movimientos procesados en una cuenta bancaria. Estos datos
podrían cargarse en un objeto DataSet para su posterior procesamiento, o mostrarse
directamente al usuario en un control ListBox.

• Procedimientos almacenados que retornan un valor, también denominados


procedimientos almacenados escalares Los procedimientos almacenados que retornan un
valor se utilizan para ejecutar un comando o función de la base de datos que devuelve un
único valor. Debido a que sólo se devuelve un valor, los procedimientos
almacenados que retornan un valor a menudo se utilizan en el código y, a continuación, el
resultado se muestra a los usuarios. Un ejemplo de procedimiento almacenado que
Asp_net -96-

retorna un valor es devolver el valor total de los tres últimos movimientos que se
han procesado en una cuenta bancaria.

• Los procedimientos almacenados de acción .-Los procedimientos almacenados de


acción se utilizan para realizar algunas funciones en la base de datos, pero no devuelven un
registro o un valor. Estas funciones de la base de datos pueden incluir actualizar, editar o
modificar los datos. Un ejemplo de un procedimiento almacenado de acción es una
petición para actualizar una sola dirección de correo en la base de datos de clientes de
una compañía.

Invocar procedimientos almacenados:

Antes de poder invocar un procedimiento almacenado, debemos identificar el nombre


del procedimiento y los parámetros que utiliza. Una vez identificado el procedimiento
almacenado, podemos invocarlo, pasarle los parámetros de entrada que se requieran para
procesar nuestra petición y gestionar los parámetros de salida incluidos en la respuesta.

Para invocar un procedimiento almacenado, en primer lugar debemos identificarlo,


crear un objeto DataAdapter, y configurar el objeto DataAdapter para que apunte a
la conexión de la base de datos. Seguidamente, establecer la propiedad
CommandText al nombre del procedimiento almacenado identificado y, finalmente,
establecer la propiedad CommandType en CommandType.StoredProcedure.

Identificar el procedimiento almacenado:

El primer paso para utilizar un procedimiento almacenado es identificar el tipo y el nombre


del mismo. Podemos utilizar un objeto DataAdapter o un objeto DataReader para invocar
los tres tipos de procedimientos almacenados. El método que invoquemos para ejecutar
el procedimiento almacenado variará dependiendo del tipo de procedimiento
almacenado que invoquemos:

• Procedimientos almacenados que devuelven registros

Cuando invocamos un procedimiento que devuelve un conjunto de registros, necesitamos


almacenar ese conjunto de registros en un DataSet, o directamente en un control
enlazado a lista utilizando un DataReader. Si deseamos utilizar un DataSet,
debemos utilizar un DataAdapter y el método Fill. Si deseamos utilizar un
DataReader, debemos utilizar un objeto Command y el método ExecuteReader, y vincular
el registro devuelto al control enlazado a lista.

• Procedimientos almacenados que retornan un valor

Cuando invocamos un procedimiento almacenado que devuelve un valor, invocamos


el método ExecuteScalar

del objeto Command, y guardamos el resultado en una variable del tipo de datos apropiado.
Asp_net -97-

• Procedimientos almacenados que realizan una acción

Cuando invocamos un procedimiento almacenado que realiza alguna acción en la base de


datos pero no devuelve un conjunto de registros o un valor, utilizamos el método
ExecuteNonQuery del objeto Command.

Establecer la propiedad SelectCommand

Para configurar la llamada al procedimiento almacenado, debemos crear un objeto


SqlCommand y guardarlo como la propiedad SelectCommand de un DataAdapter. A
continuación, debemos establecer las propiedades Connection, CommandText y
CommandType.

Ejemplo: Creando un procedimiento Almacenado: Create Procedure Sp_ListadoClientes


As

Select * From Clientes

Go

Podemos invocar al procedimiento desde código de la siguiente manera: Dim daClientes as


New SqlDataAdapter()

daClientes.SelectCommand = New SqlCommand()

daClientes.SelectCommand.Connection = conn

daClientes.SelectCommand.CommandText = "Sp_ListadoClientes"

daClientes.SelectCommand.CommandType = CommandType.StoredProcedure

También podemos establecer directamente la conexión y el texto del comando cuando


creamos el objeto SqlDataAdapter. El siguiente código realiza la misma tarea que el código
anterior:

Dim daClientes As New SqlDataAdapter("Sp_ListadoClientes", conn)

daClientes.SelectCommand.CommandType =CommandType.StoredProcedure

Ejecutar el Procedimiento Almacenado:

Para ejecutar el procedimiento almacenado y guardar los registros devueltos en un


DataSet, invocar el método Fill del objeto SqlDataAdapter. Este método rellena
un objeto DataTable con los registros devueltos del procedimiento almacenado.
Asp_net -98-

Por ejemplo, el siguiente código rellena el objeto DataSet ds con los


registros devueltos desde el procedimiento almacenado Sp_ListadoClientes utilizando
el daClientes SqlDataAdapter:

daClientes.Fill(ds, "Categories")

Utilizando parámetros

Cuando utilizamos procedimientos almacenados en una base de datos SQL Server o en


cualquier otra base de datos basada en procedimientos, se pueden utilizar parámetros para
pasar información y recuperar datos del procedimiento almacenado. Cuando utilizamos
parámetros con una base de datos SQL Server, los nombres de los parámetros que
se agregan a la colección Parameters del objeto Command deben coincidir con los
nombres de los parámetros del procedimiento almacenado; no obstante, el orden de los
parámetros es flexible.

La siguiente tabla describe los tipos de parámetros disponibles en los procedimientos


almacenados.

Parámetro Uso

Input.- Utilizado por la aplicación Web para enviar valores de datos


específicos a un procedimiento almacenado.

Output.-Utilizado por un procedimiento almacenado para enviar valores específicos de


retorno a la aplicación

Web que lo invoca.

InputOutput.- Utilizado por un procedimiento almacenado tanto para recuperar


información enviada por nuestra aplicación Web como para enviar valores de retorno
específicos a la aplicación Web.

ReturnValue Utilizado por un procedimiento almacenado para enviar un valor de retorno a


la aplicación Web que lo invoca.
Asp_net -99-

Aplicaciones con Store Procedure.-Crearemos 2 paginas webApli01.aspx

Personalizamos nuestro DataGrid1:


Clic derecho Generador de
Propiedades:
Tab Columnas Agregamos 2
Columnas: Crear Columnas
automáticamente en tiempo de
ejecución: Quitar el Checkl.

Campo de texto: Cod_Cli

Texto Encabezado: Codigo


Campo de texto: Cod_Cli
Campo de Direccion URL: Cod_Cli Cadena de
formato de direccion: WebApli02.aspx?Codigo={0}

Texto Encabezado: Clientes


Campo de Datos: Nom_Cli
Tab Paginación:
Permitir Paginación: Activado
Tamaño de Paginación: 7 Filas

Creando el Procedimiento Almacenado:


Create Procedure Sp_ListClientes
As
Select Cod_Cli,Nom_Cli From Clientes
Go
Programando en el WebApli01.Aspx
Codigo Fuente:
Imports System.Data.sqlclient
Public Class WebApli01
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=localhost;uid=sa;Database=Ventas")
Asp_net -100-

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles MyBase.Load
'Introducir aquí el código de usuario para inicializar la página
If Not Page.IsPostBack Then
Call MostrarDatos() End If
End Sub
Sub MostrarDatos()
Dim da As New SqlDataAdapter("Sp_ListClientes", cn) Dim ds As New DataSet
da.Fill(ds, "Clientes")
DataGrid1.DataSource = ds.Tables("Clientes") DataGrid1.DataBind()
End Sub
Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles
DataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex = e.NewPageIndex
Call MostrarDatos()
End Sub
Private Sub CmdSalir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
CmdSalir.Click
Response.Write("<script>window.close();</script>")
End Sub
End Class

WebApli02.aspx

Controles Web usados:


HyperLink
ID=HyperLink1
NavigateUrl=WebApli01.as
px
6 Controles de textos
1 label:
ID= lblmensaje.
Asp_net -101-

Procedimientos Almacenados:

Create Procedure Sp_BuscarCliente


@Cod_Cli char(5) As
Select Cod_Cli,Nom_Cli,Direccion,Telefono,Ruc,Fecha_ing From
Clientes Where Cod_Cli=@Cod_Cli
Go

Create Procedure Sp_GenCodigo


@Cod_Cli char(5) Output
As
Declare @Total int ,@mayor Char(5)
Select @Mayor=Select Isnull(Max(Cod_Cli),’0000’) From Clientes
Set @total=right(@mayor,4)+1
Set @Cod_Cli='C'+right('0000'+ltrim(@Total),4)
Go

Create Procedure Sp_IngClientes


@Cod_Cli char(5),
@Nom_Cli varchar(50),
@Direccion varchar(50),
@Telefono char(8),
@ruc char(11),
@Fecha_ing char(12) As

Insert Into Clientes (Cod_Cli,Nom_cli,Direccion,Telefono,ruc,Fecha_ing)


values(@Cod_Cli,@Nom_cli,@Direccion,@Telefono,@ruc,@Fecha_ing) Go

Create Procedure Sp_UpdClientes


@Cod_Cli char(5),
@Nom_Cli varchar(50),
@Direccion varchar(50),
@Telefono char(8),
@ruc char(11),
@Fecha_ing char(12) As

Update Clientes Set Nom_cli=@Nom_cli,Direccion=@Direccion,ruc=@ruc,


Fecha_ing=@Fecha_ing Where Cod_Cli=@Cod_Cli

Go

Create Procedure Sp_EliClientes


@Cod_Cli char(5) As
Delete From Clientes Where Cod_Cli=@Cod_Cli
Go
Asp_net -102-

Programando la Pagina WebApli02.aspx


Codigo Fuente:

Imports System.Data
Imports System.Data.SqlClient
Public Class WebApli02
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=localhost;uid=sa;database=Ventas")
Sub LimpiarControles()
txtcodigo.Text = ""
txtnombres.Text = "" txtdireccion.Text = "" txtTelefono.Text = "" txtruc.Text = ""
txtfechaing.Text = Now.ToShortDateString 'Fecha del Sistema
End Sub
Sub GenerarCodigo()
Dim cmd As New SqlCommand("Sp_GenCodigo", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Cod_Cli", SqlDbType.Char, 5).Direction =
ParameterDirection.Output cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
txtcodigo.Text = cmd.Parameters("@Cod_Cli").Value
End Sub

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


System.EventArgs) Handles MyBase.Load
'Introducir aquí el código de usuario para inicializar la página
If Not Page.IsPostBack Then
Dim codigo As String = Request.Params("Codigo") If Len(codigo) > 1 Then
Dim cmd As New SqlCommand("Sp_BuscarCliente", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Cod_Cli", SqlDbType.Char, 5).Value = codigo
cn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
While dr.Read
txtcodigo.Text = dr("Cod_Cli")
txtnombres.Text = dr("Nom_Cli") txtdireccion.Text = dr("Direccion")
txtTelefono.Text = dr("Telefono") txtruc.Text = dr("ruc")
txtfechaing.Text = dr("fecha_ing")
End While
cn.Close() Else
Call LimpiarControles() Call GenerarCodigo()
End If
End If
End Sub
Asp_net -103-

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


System.EventArgs) Handles
CmdNuevo.Click
Call LimpiarControles() Call GenerarCodigo()
End Sub

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


System.EventArgs) Handles
CmdGrabar.Click
Try
If txtnombres.Text = "" Or txtdireccion.Text = "" Or _
txtTelefono.Text = "" Or txtruc.Text = "" Or _

txtfechaing.Text = "" Then


lblmensaje.Text = "Falta Datos"
lblmensaje.ForeColor = Color.Red
Exit Sub
End If
Dim cmd As New SqlCommand("Sp_IngClientes", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Cod_Cli", SqlDbType.Char, 5).Value = txtcodigo.Text
cmd.Parameters.Add("@Nom_Cli", SqlDbType.VarChar, 50).Value = txtnombres.Text
cmd.Parameters.Add("@Direccion", SqlDbType.VarChar, 70).Value = txtdireccion.Text
cmd.Parameters.Add("@Telefono", SqlDbType.Char, 5).Value = txtTelefono.Text
cmd.Parameters.Add("@ruc", SqlDbType.Char, 11).Value = txtruc.Text
cmd.Parameters.Add("@fecha_ing", SqlDbType.Char, 12).Value = txtfechaing.Text
cn.Open()
Dim i As Integer = cmd.ExecuteNonQuery
If i = 1 Then
lblmensaje.Text = "Cliente Registrado"
lblmensaje.ForeColor = Color.Blue
End If
Catch ex As SqlException
lblmensaje.Text = ex.Message
Finally
cn.Close() End Try
End Sub

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


System.EventArgs) Handles
CmdActualizar.Click
Try
If txtnombres.Text = "" Or txtdireccion.Text = "" Or _
txtTelefono.Text = "" Or txtruc.Text = "" Or _
txtfechaing.Text = "" Then
lblmensaje.Text = "Falta Datos"
lblmensaje.ForeColor = Color.Red
Asp_net -104-

Exit Sub
End If
Dim cmd As New SqlCommand("Sp_UpdClientes", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Cod_Cli", SqlDbType.Char, 5).Value = txtcodigo.Text
cmd.Parameters.Add("@Nom_cli", SqlDbType.VarChar, 50).Value = txtnombres.Text
cmd.Parameters.Add("@Direccion", SqlDbType.VarChar, 100).Value = txtdireccion.Text
cmd.Parameters.Add("@Telefono", SqlDbType.Char, 8).Value = txtTelefono.Text
cmd.Parameters.Add("@Ruc", SqlDbType.Char, 18).Value = txtruc.Text
cmd.Parameters.Add("@fecha_ing", SqlDbType.Char, 12).Value = txtfechaing.Text
cn.Open()
Dim i As Integer = cmd.ExecuteNonQuery() If i = 1 Then
lblmensaje.Text = "Registro Actualizado"
lblmensaje.ForeColor = Color.Blue
End If
Catch ex As SqlException
lblmensaje.Text = ex.Message
Finally
cn.Close() End Try
End Sub
Private Sub CmdEliminar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
CmdEliminar.Click
Try
Dim cmd As New SqlCommand("Sp_EliClientes", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Cod_Cli", SqlDbType.Char, 5).Value = txtcodigo.Text cn.Open()
Dim i As Integer = cmd.ExecuteNonQuery
If i = 1 Then
lblmensaje.Text = "Registro Eliminado"
lblmensaje.ForeColor = Color.Blue
End If

Catch ex As SqlException
lblmensaje.Text = ex.Message
Finally
cn.Close() End Try
End Sub
End Class
Asp_net -105-

Resultado:
Asp_net -106-

Ejercicios emplando Store Procedure con la BDD Northwind:

1.-Pasando dos fechas que muestre la lista de pedidos entre ambas fechas (Orderid ,
Companyname, Freight, Total Pedido y un Hipervínculo en el Grid para ver su detalle),
el detalle sera colocado en otro GridView2 que tendra las siguientes
columnas(Productid, Productname,Quantity, UnitPrice y Total)

2.- Realizar el Matenimiento de la Tabla Producto primero seleccione el tipo de


categoría para ingresar el producto; el codigo de producto no se ingresa se visualiza

3.- Colocar una lista de opciones ( Clientes que tengan pedido y Clientes que no hayan
hecho pedido) y un combo que visualiza los años ; entoces al seleccionar una opcion y
escoger un año que muestre en el Gridview su resultado

4.- En un DropDownListBox colocar el pais y en otra lista (listbox) colocar sus


ciudades este ultimo depende del primero ademas el control sera de selección multiple ,
al seleccionar uno o varias ciudades que muestre en un gridView la lista de clientes con
la cantidad de Pedidos y el total correspondiente .

5.- Elobrar un SiteMenu y un master Page para unir todos los formularios anteriores

Nota.- El diseño de lso formularios y la presentacion sera tomado en cuenta para la


presentacion.
Asp_net -107-

Capitulo 9
¿Qué es un control de usuario?

Los controles de usuario simplifican la reutilización de código y componentes de la


IU en una aplicación Web

Un control de usuario es un control de servidor Web definido por el usuario con


una extensión .ascx

Contiene HTML, pero no las etiquetas <HTML>,

<BODY>, o <FORM>

Los controles de usuario pueden simplificar la reutilización de código y


componentes habituales de la interfaz de usuario; por ello, saber qué son y cómo
funcionan es una parte importante del aprendizaje del desarrollo con ASP.NET.

Los controles de usuario son páginas ASP.NET con una extensión de archivo

.ascx. Los controles de usuario ofrecen un modo fácil de particionar y reutilizar


funcionalidades habituales de la interfaz de usuario en nuestras aplicaciones Web
ASP.NET. Similar a una página de un formulario Web Form, podemos crear estos
controles con cualquier editor de texto, o desarrollarlos utilizando clases de código
subyacente. Además, de forma similar a un formulario Web Form, los controles de
usuario se compilan cuando se solicitan por primera vez y se almacenan en
memoria del servidor para reducir el tiempo de respuesta de las siguientes
peticiones. Sin embargo, a diferencia de los formularios Web Form, los controles
de usuario no pueden ser solicitados de modo independiente; deben estar
incluidos en una página Web Form para que puedan funcionar.

El Microsoft .NET Framework impide que archivos con la extensión de archivo


.ascx puedan ser visualizados en un navegador Web. Es una medida de seguridad
que asegura que el control de usuario no puede ser visualizado como una página
ASP.NET independiente.
Asp_net -108-

Que hay en un Control de Usuario?

Un control de usuario está formado por HTML y código, pero como los controles
de usuario son utilizados por formularios Web Forms, no contienen las etiquetas
HTML <HEAD>, <BODY> ni <FORM>. En lugar de ello, estas etiquetas se
incluyen en cada formulario Web Form que utilice el control de usuario.

Cuando un formulario Web Form utiliza un control de usuario, éste último participa
en el ciclo de vida del evento del formulario Web Form. Además, como un control
de usuario es una página ASP.NET, tiene su propia lógica de página. Por ejemplo,
un control de usuario puede gestionar su propio postback en su procedimiento de
evento Page_Load.
Asp_net -109-

Controles de Usuario asociados a la pagina subyacente:

Al igual que los formularios Web Forms tienen páginas de código subyacente, los
controles de usuario también tienen una página de código subyacente asociada.
La directiva @ Page se utiliza en los formularios Web Forms para asociar una
página de código subyacente, mientras que la directiva @ Control se utiliza para
hacer referencia a una página de código subyacente desde una página de control
de usuario. La directiva @ Control sólo puede utilizarse con controles de usuario, y
únicamente podemos incluir una directiva @ Control por cada archivo .ascx. Por
ejemplo, para hacer referencia a una página de código subyacente de un control
de usuario denominada WebUserControl1, en un proyecto de aplicación Web
denominado test, utilizamos la siguiente directiva @ Control:

<%@ Control Language="vb" Codebehind="WebUserControl1.ascx.vb"


Inherits="test.WebUserControl1" %>

<%@ Control Language="c#" Codebehind="WebUserControl1.ascx.cs"


Inherits="test.WebUserControl1" %>

Agregar un control de usuario

Utilizar la directiva @ Register para incluir un control de usuario en una página ASP.NET

<%@ Register TagPrefix="demo" TagName="validNum" Src="numberbox.ascx" %>

„ Insertar el control de usuario en un formulario Web Form

<demo:validNum id="num1" runat="server"/>

Podemos ubicar un control de usuario en cualquier formulario Web Form


ASP.NET. La página que hace referencia al control de usuario se denomina host,
y el control se incluye en ella.

Los controles de usuario se incluyen en un formulario Web ASP.NET

utilizando la directiva @ Register, como muestra el siguiente código:

<%@ Register TagPrefix="demo" TagName="validNum"

Src="numberbox.ascx" %>

El atributo TagPrefix determina un espacio de nombres único para el control de


usuario de forma que múltiples controles de usuario con el mismo nombre pueden
diferenciarse entre sí. El atributo TagName es el único nombre para el control de
usuario. El atributo Src es la ruta virtual al archivo del control de usuario.
Asp_net -110-

Aplicaciones.-

Crear un nuevo proyecto Web.


Hacer clic derecho en el proyecto agregar - Agregar un control e usuario Web
Ponga como nombre WebuserApli01.ascx

Para tener este resultado, tiene que agregar


un tabla, 1 columna y 5 Filas
En la primera Fila agregar un label que
muestre el mensaje
Consulta de Datos.
En la Segunda Fila agregar un
HyperLink1:
Text= Aplicación Nro.1
NavigateUrl= WebApli01.aspx
En la tercera Fila agregar un
DataGrid1,click derecho
propiedades/generador de propiedades.
En el Tab Columnas=> Quitar el check
Crear columnas automáticamente en
tiempo de ejecución.
Agregar en columnas disponible una
columna plantilla.
En el Tab Paginación => Permitir la
paginación, Tamaño de pagina 5 filas.
En la Cuarta Fila agregar un
Hyperlink2:
Text=Aplicación Nro.2
NavigateURL=WebApli02.aspx
En la quinta columna agregar un
DataGrid2,click derecho propiedades /
generador de propiedades.

En el Tab Columnas=> Quitar el check Crear columnas automáticamente en tiempo de


ejecución.
Agregar en columnas disponible una columna plantilla.
En el Tab Paginación => Permitir la paginación, Tamaño de pagina 5 filas.
Configurando el DataGrid1:
Click derecho Editar Plantilla Columns[0]
Asp_net -111-

En HeaderTemplate: Agregar un label con el


mensaje Customers.
En ItemTemplate
Agregar un HiperLink3:
DataBinding2:
Text:
DataBinder.Eval(Container.
DataItem,"CompanyName"
)
NavigateURL=
"WebApli01.aspx?Custome rID="&
DataBinder.Eval(Container.
DataItem,"CustomerID")

La configuración del DataGrid2, tiene los mismo

Parámetros, solo el HyperLink4, tiene que Modificar los siguientes parámetros en


el DataBindings:

Text: Databinder.Eval(Container.dataItem, CategoryName )

NavigateURL= "WebApli02.aspx?CategoryID="&
DataBinder.Eval(Container.DataItem,"CategoryID")

Codificacion del Control WebUserAplicacion1.ascx


Imports System.Data
Imports System.Data.SqlClient
Partial Class WebControlMenu
Inherits System.Web.UI.UserControl
Dim cn As New SqlConnection("Server=localhost;Integrated
Security=SSPI;database=NorthWind")
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
If Not Page.IsPostBack Then
Dim da As New SqlDataAdapter("Select CompanyName,CustomerID From
Customers", cn)
Dim tbl As New DataTable
da.Fill(tbl)
GridView1.DataSource = tbl
GridView1.DataBind()

Da= New SqlDataAdapter("Select CategoryId,CAtgoryName From Categories", cn)


Asp_net -112-

Tbl= New DataTable


da.Fill(tbl)
GridView2.DataSource = tbl
GridView2.DataBind()

End If
End Sub
End Class
WebApli02.aspx
Procedimientos Almacenados
Create Procedure Sp_C9Productos
@CategoryID int
As
if @CategoryID=0
Select ProductID,ProductName From Products Order by ProductID
else
Select ProductID,ProductName From Products where
CategoryID=@CategoryID Order By ProductID
Go

Create Procedure Sp_C9Paises


@ProductID int
As
Select Distinct ShipCountry From Orders O,[Order Details] OD
where O.OrderID=OD.OrderID and ProductID=@ProductID
order by ShipCountry

Create Procedure Sp_C9Ciudades


@PaisEnvio varchar(50) As
Select Distinct ShipCity From Orders where
ShipCountry=@PaisEnvio Order By ShipCity
Go
Create Procedure Sp_C9Facturas
@CiudadEnvio varchar(50) As
Select O.OrderID,Convert(char(12),OrderDate,101) as OrderDate,
Convert(char(12),ShippedDate,101) as ShippedDate,
DateDiff(day,OrderDate,ShippedDate) as Dias,
Total=Sum(UnitPrice* Quantity) From Orders O,[Order Details] OD
where O.OrderID=OD.OrderID and ShipCity=@CiudadEnvio
Group by O.OrderID,OrderDate,ShippedDate,DateDiff(day,OrderDate,ShippedDate)
Order By O.OrderID
Asp_net -113-
Asp_net -114-

Agregar un Panel y dentro del Panel agregar


un control DataList1.
Clic derecho en el DataList1=Editar
Plantilla=Plantillas de elementos
Label9 => Databindings: text=>
DataBinder.Eval(Container.DataItem,"OrderID
")
Label10=> DataBindings: text=>
DataBinder.Eval(Container.DataItem,"OrderD
ate") Label11=> DataBindings: text=>
DataBinder.Eval(Container.DataItem,"Shipped
Date")
Label12=> DataBindings: text=>
DataBinder.Eval(Container.DataItem,"Dias")
Label13=> DataBindings: text =>
DataBinder.Eval(Container.DataItem,"Total")

Clic derecho en el DataList1=Editar


Plantilla=Plantillas de encabezado y pie e
pagina.
Asp_net -115-

WebApli01.aspx
Procedimientos Almacenados
Create Procedure Sp_C9Ordenes
@CustomerID char(5) As
if @CustomerID=''
Select OrderID,OrderDate From Orders
else
Select OrderID,OrderDate From Orders where CustomerID=@CustomerID
Go
Create Procedure Sp_C9Detalle
@Orden int
As
Select P.ProductID,ProductName,P.UnitPrice,Quantity,

Total=(P.UnitPrice * Quantity) From [Order Details] OD, Products P where


OD.ProductID=P.ProductID
and OD.OrderID=@Orden
Order By P.ProductID
Go
Create Procedure Sp_C9Tablas
As
Select SupplierID,CompanyName From Suppliers
Select CategoryID,CategoryName from categories
Go
Create Procedure Sp_C9DatosProducto
@ProductID int
As
Select ProductName,CompanyName,CategoryName,UnitsInStock from products P,
Suppliers S,Categories C where P.SupplierID=S.SupplierID and
P.CategoryID=C.CategoryID and ProductID=@ProductID
Go

Create procedure Sp_ActProducto


@Proveedor int,
@Categoria int,
@Stock int,
@Producto varchar(100) As
Update Products set
SupplierID=@Proveedor,CategoryID=@Categoria, UnitsInStock=@Stock Where
ProductName=@Producto
Asp_net -116-

Resultado Final
Asp_net -117-

Codificacion del WebAplicacion1.aspx


Imports System.Data
Imports System.Data.SqlClient
Partial Class WebControlMenu
Inherits System.Web.UI.webForm
Dim cn As New SqlConnection("Server=localhost;Integrated
Security=SSPI;database=NorthWind")
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
If Not Page.IsPostBack Then
Dim codc as string=Request.Querystring( “CustomerId”)
‘el Valor que es enviado desde el control de usuario
Dim cmd As New SqlCommand("Sp_BuscarCliente", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@Customeridi", SqlDbType.Char, 5).Value = codc
cn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
Listbox1.Datasource=dr
Lisbox1.DatatextField=”OrderDate”
Listbox1.DataValueField=”OrderId”
Listbox1.dataBind()
Cn.close
‘lenar los combos de Empleados y Categorias
CbProve.datasource=Runsql(“select SuplierId, Companyname from Supliers”)
Cb.prove.dataTextField=”Companyname”
CbProve.DataValueField=”SuplierId”
CbProve.DataBind
CbCate.datasource=Runsql(“select SuplierId, Companyname from Supliers”)
Cb.Cate.dataTextField=”CategoryName”
CbCate.DataValueField=”CategoryId”
CbCate.DataBind
End if
End sub
Function Runsql(sql as string)as Datatable
Dim da as new sqldataAdpapter(sql,cn)
Dim Dt as New Datatable
Da.Fill(dt)
Return Dt
End Function

Sub Listbox1_click(ByVal sender As Object, ByVal e As System.EventArgs) Handles


dim cmd as new slqCommand(“Sp_C9Ordenes”,cn)
cmd.commandType=CommandType.StoreProcedure
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@orden", SqlDbType.int).Value = Listbox1.seletedValue
cn.Open()
Asp_net -118-

Dim dr As SqlDataReader = cmd.ExecuteReader


GridView1.DataSource = dr
GridView1.DataBind()
End sub

Sub DataGrid1_SelectedIndexChanged(ByVal sender As Object, ByVal e As


System.EventArgs) Handles
Dim codp as integer
codp=dataGrid1.selectedRow.cells(1).text
Dim cmd As New SqlCommand("Sp_C9DatosProducto", cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@ProductID ", SqlDbType.int).Value = codp
cn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
With dr.read
LblNomp.text=dr(0)
cbprove.selectedItem=dr(1)
cbcatego.selecteditem=dr(2)
LbUnits.text=dr(3)
End sub

Ejercicio.-

-Completar las codificaciones para actualizar el pedido de un cliente y el formulario2


Asp_net -119-

SEMANA 11
XML
Aunque se almacena una gran cantidad de datos en bases de datos Microsoft® SQL Server y se gestionan mediante
Microsoft ADO.NET, recientemente Extensible Markup Language (XML) se ha convertido en un sólido estándar para el
almacenamiento, gestión y transferencia de datos. XML tiene dos grandes ventajas en el almacenamiento y transferencia de
datos:
• XML es un estándar aceptado por el mercado.
• XML utiliza únicamente texto plano.

¿Qué es XML?

Introducción
Actualmente, las empresas se enfrentan a numerosos problemas en la
organización de los datos porque necesitan cumplir con los siguientes
requerimientos:
• Las estaciones de trabajo y los usuarios necesitan leer datos.
• Tanto el contenido como la estructura de los datos deben estar definidos.
• La estructura de los datos debe estar separada de su presentación.
• La estructura de los datos debe ser abierta y extensible.
• XML satisface todos estos requerimientos, y por tanto es una ayuda para la
organización de datos en las empresas.
Definición:
XML es el formato universal utilizado para describir e intercambiar documentos y
datos estructurados en Internet. XML es un subconjunto del Standard Generalized
Markup Language (SGML), y está definido por el World Wide Web Consortium
(W3C), y garantiza que los datos estructurados son uniformes e independientes de
las aplicaciones Web y de los fabricantes.
XML define la estructura de los datos de un modo abierto y autodescriptivo.
Asp_net -120-

Este modo abierto y autodescriptivo permite que los datos sean fácilmente
transferidos a través de una red y que el receptor los procese de modo coherente.
XML describe cómo se estructuran los datos, no cómo deberían mostrarse o
utilizarse, de forma similar a Hypertext Markup Language (HTML). Los documentos
XML contienen etiquetas que otorgan significado al contenido del documento.
Estas etiquetas permiten a los programadores encontrar los datos que necesitan
en el documento XML.

Partes de un documento XML


Las partes de un documento XML incluyen:
• Instrucciones de procesamiento
• Elementos
• Atributos
• Comentarios

Instrucción de procesamiento
La mayoría de documentos XML empiezan con una instrucción de procesamiento
para el procesador XML indicando que el documento sigue las recomendaciones
XML del W3C.
Elementos
A continuación de la instrucción de procesamiento puede definirse un conjunto de
elementos anidados. Respecto a los elementos:
• Normalmente, un elemento está formado por un par de etiquetas: una
etiqueta de inicio y una etiqueta de cierre.
• Entre el par de etiquetas de inicio y cierre, un elemento puede contener el
contenido de datos u otros elementos.
• Un elemento puede estar formado únicamente por la etiqueta de cierre.
• El primer elemento que encuentra el procesador XML debe estar formado
por una etiqueta de inicio y una etiqueta de cierre. El primer elemento
contiene el resto de elementos y se denomina elemento raíz.
• El resto de elementos, tras el primero, pero dentro del elemento raíz, se
denominan elementos secundarios.
• Los elementos secundarios pueden anidar otros elementos secundarios. La
mayoría de los datos del contenido XML se almacenan entre la etiqueta de
inicio y la etiqueta de cierre de los elementos secundarios.

Atributos
Cualquier elemento puede contener atributos. El uso de atributos es una
alternativa al uso de elementos para almacenar el contenido. Los atributos definen
datos que pertenecen a un único elemento. Respecto a los atributos:
• Crear un atributo en la etiqueta de inicio de un elemento.
• Declarar el nombre del atributo, seguido de una asignación del valor.
• Utilizar comillas simples o dobles para establecer el valor de un atributo.
Asp_net -121-

Comentarios
Los comentarios son opcionales.
XML de formato correcto
Un documento XML con un formato correcto cumple las especificaciones listadas
en la Recomendación W3C de XML 1.0. Un documento XML se considera con el
formato correcto si:
• Contiene exactamente un elemento raíz (el elemento documento).
• Todos los elementos secundarios están anidados correctamente uno dentro
de otro.
• Existen las etiquetas de inicio y final de un determinado elemento en el
cuerpo del mismo elemento primario.
Ejemplo de XML con el formato correcto:
<Temp>22</Temp>
Ejemplo de XML mal formado:
<Temp>22</temp>
El error en el ejemplo anterior es que la etiqueta de cierre <temp> no coincide con
la etiqueta de inicio <Temp>.

XML válido
El XML es válido si su vocabulario cumple con una serie de requisitos descritos en
un esquema:
• En XML, un esquema es la descripción de un documento XML.
• Un esquema se utiliza para validar documentos XML. Los documentos XML
validados con un esquema se denominan documentos instancia. Si un
documento instancia coincide con la definición del esquema, el documento
instancia se considera válido.

Podemos crear un documento XML desde:


• De forma manual con un block de notas.
• Con SQL Server 2005
• Mediante el objeto DataSet

Creando un documento XML mediante un block de notas:


Abrimos el Block de notas y escribimos lo siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<Libros>
<Libro>
<Titulo>El arte de programar en .NET 2005</Titulo >
<precio>19.95</precio>
</Libro>
<Libro>
<Titulo>Desarrollando aplicaciones maestras con ASP.NET
2.0</Titulo>
<precio>49.99</precio>
Asp_net -122-

</Libro>
</Libros>

Guardas el contenido del documento con el nombre Libros.xml.


Luego abres el Internet Explorer para visualizar el resultado de este documento
XML

Creando un documento XML con SQL Server 2005


Abrimos SQL Server 2005, y nos conectamos a SQL Server 2005, de manera integrada de Windows o con el usuario SA.
Luego te ubicas a la base de datos NorthWind, le das clic derecho nueva consulta.

Generara un enlace, le damos doble clic para visualizar documento completo que
se ha generado y guardamos el documento XML con el nombre de
Customers.xml.
Asp_net -123-

Cuando intentamos abrir el archivo, nos mostrara un error debido a que no existe un
elemento raíz.

Para solucionar adicionaremos un elemento raíz en nuestro documento Customers.xml.


Abrimos con el block de notas, y cambiamos los elementos Customers por Cliente.
Adicionamos el elemento en la primera línea <Clientes> y en la ultima línea </Clientes>.
Asp_net -124-
Asp_net -125-

Lo abrimos en el navegado
Web.

Creando un documento XML mediante el objeto DataSet, con los metodos


WriteXML y ReadXML.

XML y los DataSets comparten una estrecha conexión. Los DataSets son la base para el
almacenamiento en modo desconectado y la manipulación de datos relacionales. Los
DataSets también son un contenedor para una o más tablas de datos. XML es el formato
estándar para los datos presentes en DataSets.
Asp_net -126-

XML desempeña un importante papel en el modo en que el .NET Framework gestiona los
datos. XML es el formato utilizado en el .NET Framework para almacenar y transferir todo
tipo de datos. Los DataSets pueden almacenar y transferir datos en formato XML.
Respecto a las características de los DataSets y XML:
• La estructura de un DataSet puede definirse en un esquema XML Schema
La estructura de un DataSet que incluye tablas, columnas, relaciones y
restricciones puede definirse utilizando un esquema XML. Los esquemas XML son
un formato basado en estándares del W3C que pueden utilizarse para definir la
estructura de datos XML.
• Generar una clase DataSet
Podemos generar una clase DataSet que incorpore información de esquema para
definir sus estructuras de sus datos (como tablas y columnas) como miembros de
clase.
• Métodos DataSet
Podemos leer un documento XML o generar un flujo en un DataSet utilizando el
método ReadXML del DataSet y a continuación escribir un DataSet en XML
utilizando el método WriteXML del DataSet. Como XML es un formato estándar
para intercambiar datos entre distintas aplicaciones Web, podemos cargar un
DataSet con información formateada en XML que haya sido enviada por otras
aplicaciones. De forma similar, un DataSet puede escribir sus datos como un flujo
XML o un documento que será compartido con otras aplicaciones o simplemente
almacenado como un documento XML.
• Crear una vista XML del contenido de un DataSet
Podemos crear una vista XML (un objeto XmlDataDocument) del contenido de
un DataSet, y visualizar y manipular los datos utilizando métodos relacionales
(mediante el DataSet) o métodos XML. Las dos vistas se sincronizan
automáticamente cuando se modifican.
• Transformación de datos
Podemos utilizar el objeto XSLTransform para cargar una hoja de estilo .xsl y
aplicar la transformación. El documento resultante puede ser un archivo XML o
HTML.
Asp_net -127-

El contenido de un DataSet puede crearse desde un flujo o un documento XML. Además,


con el .NET Framework, tenemos una gran flexibilidad sobre qué información se carga
desde XML, y cómo se crea el esquema o estructura relacional del DataSet.

ReadXML
Para rellenar un DataSet con datos de XML, utilizamos el método ReadXml del objeto
DataSet. El método ReadXml lee de un archivo, un flujo o un XmlReader.
El método ReadXml lee el contenido del flujo o documento XML y carga el DataSet con
esos datos. ReadXml también crea el esquema relacional del DataSet, dependiendo del
XmlReadMode especificado y de si existe ya o no un esquema relacional.
WriteXML
Para escribir un DataSet a un archivo, flujo o XmlWriter, utilizamos el método
WriteXml. El primer parámetro que pasamos a WriteXml es el destino de la salida XML.
Por ejemplo, podemos pasar una cadena que contenga un nombre de archivo, un objeto
System.IO.TextWriter, etc. Podemos pasar un segundo parámetro opcional de un
XmlWriteMode para especificar cómo debe escribirse la salida XML.

Veamos un ejemplo: Como generar un documeno XML, con los metodos WriteXML y ReadXML.

Código Fuente:
Asp_net -128-

Imports System.Data
Imports System.Data.SqlClient
Partial Class WebXML
Inherits System.Web.UI.Page
Dim cn As New SqlConnection("Server=localhost;Integrated
Security=SSPI;database=NorthWind")
Protected Sub btnWriteXML_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles btnWriteXML.Click
Try
Dim da As New SqlDataAdapter("Select Top 2 * From Products", cn)
Dim ds As New DataSet
da.Fill(ds, "Productos")
ds.DataSetName = "ListadoProductos"
'Guardamos el XML sin el esquema generado por el DataSet
ds.WriteXml("g:\Productos.xml", XmlWriteMode.IgnoreSchema)
Lblmensaje.Text = "El documento XML Productos.xml se ha generado"
Catch ex As Exception
Response.Write(ex.Message)
End Try
End Sub
Protected Sub btnReadXML_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles btnReadXML.Click
'Mostrando el documento en la caja de texto txtxml y GridView1
Try
Dim dsXML As New DataSet
dsXML.ReadXml("g:\Productos.xml")
'Mostrando en la caja de texto txtxml
TxtXML.Text = dsXML.GetXml
'Mostrando en el GridView1
GridView1.DataSource = dsXML.Tables(0)
GridView1.DataBind()
Catch ex As Exception
Response.Write(ex.Message)
End Try
End Sub
End Class

Resultado de WebXML.aspx
Asp_net -129-

Nota: Si le das 2 veces doble clic en el botón generar documento o Mostrar documento,
mostrara el mensaje siguiente:

Para solucionar este problemas, nos ubicamos en source de la pagina Web WebXML.aspx,
y agregamos los siguiente en la directiva.
Asp_net -130-
Asp_net -131-

Crystal reports

Teniendo la BDD Bdinsituto que cuenta con las talas :Alumno,Notas,Curso, Pagos y
Especialidad vamos realizar los siguientes reportes:
a) Reporte de Alumno por Especialidad

Crear una nueva conexión

Seleccione OLE DB Provider for sql server


Asp_net -132-

Conectarse con la BDD Bdinstituto


Por ejemplo se desea hacer un reporte de alumnos por especialidad

siguiente y nos mostrara un diagrama para verificar los enlaces de las tablas
Asp_net -133-

luego elegir los campos de cada tabla sin repetirlos


Asp_net -134-

establecer el campo de agrupamiento es necesario para realizar el quiebre respectivo:

Establecer el resumen (los totales que van a ir después de imprimir el detalle)


Asp_net -135-

aunque esta ficha es opcional nos pregunta si deseamos ordenar los resúmenes por
especialidad
Asp_net -136-

aunque las demas opciones dependen del tipo de reporte a presentar , luego de finalizar:
las secciones que displayan son:
Asp_net -137-

se pueden cambiar los atributos , tamaño, color de los objetos a través de las propiedades ,
si desea una vista rápida del reporte mediante las opciones del menú
Asp_net -138-

Si deseamos darle mejor presentación al reporte por ejemplo en la sección de detalle no


debería ir el código y nombre de especialidad , arrástralo hacia la sección de grupo.

Aplicacacion con reportes por ejemplo se desea obtener la lista de alumno por cada curso.

Como la conexión ya esta establecida , procedemos a insertarlas tablas que nos interesan :
Asp_net -139-

la agrupación es por idcurso , y luego finalizar , la presentación general es de acuerdo


como se desea obtener el reporte.
Asp_net -140-

Acomode las cabeceras en las secciones de grupo , como se muestra en la figura

así de forma similar para la formula observación aprobado y desaprobado

Luego arrastrar las formulas hacia el detalle respectivo


Asp_net -141-

Después de colocar el promedio y la observación , cambiar el resaltado del campo


observación como se muestra en la figura.

Al seleccionar Higlighting Expert (cambiar el resaltado)


New agregar una nueva condición en value of especificar el campo de la tabla o el campo
calculado
Asp_net -142-

la vista previa del reporte seria:

Mostrándolo ahora desde un formulario , seleccionado desde un combobox el curso y un


checkbox para imprimir un curso especifico o todos los cursos
Asp_net -143-

codificación.
Imports System.Data
Imports System.Data.SqlClient
Public Class frmcurso
Dim cn As New SqlConnection("data source=(local)\SQLEXPRESS; integrated
security=SSPI; database=bdinstituto")
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim da As New SqlDataAdapter("select idcurso,nomcurso from curso ", cn)
Dim dt As New DataTable
da.Fill(dt)
cbc.DataSource = dt
cbc.DatatextField = "nomcurso"
cbc.DataValueField = "idcurso"
End Sub
Private Sub cbc_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cbc.SelectedIndexChanged
Dim fr As New repNOTA
cr1.ReportSource = fr
cr1.SelectionFormula = "{curso.idcurso}='" + cbc.SelectedValue.ToString + "'"
cr1.RefreshReport()
End Sub
End Class
Asp_net -144-

EMPLEANDO COMPONENETES EN VISUAL NET

Empleando componentes nos van aliviar de realizar código redundante en cada


formulario, porque todas las rutinas para ejecutar un procedimiento que nos devuelva
registros o ejecutar una acción de grabación, modificación o eliminación de registros en
realidad una codificación similar , solo cambian los nombres de los procedimientos y
parámetros recibidos.
Entonces porque no hacer un proyecto de clases, que luego se compila como una DLL y
se puede registrar en cualquier proyecto posterior, ya sea de tipo Windows o WEB FORM
que se ha de elaborar, donde cumpla las siguientes condiciones:
a) Que se lleve a cabo para cualquier BDD , no se debe nombrar de manera especifica
a la BDD con el cual se ha de trabajar, para ello tenemos un archivo web.config el
cual Proporciona acceso a los valores de configuración de una sección de
configuración especificada.
b) Crear una función runpro(nompro, lista_de_parámetros) que devuelva un Dataset ;
nompro representa cualquier nombre del procedimiento, y la lista es un paramArray
que acepta un conjunto de parámetros pero también puede ser que el
procedimiento no tenga parámetros, para ello la función debe cumplir para cualquier
caso
c) Crear una función ejecutapro(nompro, lista_parámetros) el cual dicha función no
es necesario que devuelva un valor, porque su labor solo va ejecutar el
procedimiento para los casos de adición, modificación y eliminación de registros

Además empleando componentes nos va dar mejor seguridad en el transporte de códigos,


porque ya no será necesario llevar el código fuente donde se encuentra las funciones, basta
llevar solamente el compilado *.DLL y colocarlo en la carpeta BIN del proyecto a
elaborar.
A partir de los componentes se manejan las capas , puesto que estos conceptos no están
muy bien definidos en algunas paginas ya que lo hace un concepto muy abstracto, además
los códigos sencillos de capas lo hacen tan complejos que al alumno lo será un poco
dificultoso entender su lógica, como por ejemplo dando los nombres
Clshelper,layerBussines, etc , que en verdad son nombres que uno puede dar para ser mas
descriptivos.

Además la aplicación real de capas se da en varias maquinas donde una maquina es


el para:
a) Servidor de Internet
b) Servidor de Datos
c) servidor de Clases para la Capa de datos
d) Servidor para la capa de negocios

Arquitectura de las capas

Básicamente la Arquitectura se centra en un arquitectura de 3 capas.


Asp_net -145-

1. La capa de presentación que en este caso esta formada por los Componentes de IU, y los
componentes de proceso de IU. Los componentes de IU pueden ser vistos como la parte
con la cual interactuar el usuario. Las ventanas o páginas web, por decirlo de alguna
manera. Los componentes de proceso de IU podríamos asociarlos a clases de tipo
controladora en UML. Es decir estos encapsulan lógica de navegación y control de eventos
de la interfase.

2. La capa de negocios encapsula lógica de negocios. Los servicios de esta capa son
encapsulados en tres tipos de componentes, dos de los cuales se tocan en este ejercicio. Las
entidades empresariales, que representan objetos que van a ser manejados o consumidos
por toda la aplicación, estos podrían ser un modelo de objetos, xml, datasets con tipo,
estructuras de datos, que permitan representar objetos que han sido identificados durante el
modelamiento. Los otros tipos de objetos son los componentes empresariales que contienen
lógica de negocio, y en algunos casos al usar COM+ son los objetos raíz que inician las
transacciones.

3. La capa de acceso a datos que contiene clases que interactúan con la base de datos. Estas
clases surgen como una necesidad de mantener la cohesión o clases altamente
especializadas que ayuden a reducir la dependencia entre las clases y capas. Aquí podemos
encontrar también una clase con métodos estáticos que permiten uniformizar las
operaciones de acceso a datos a través de un único conjunto de métodos, esta clase es el
SQLHelper que también se usa en este proyecto
Asp_net -146-

A nivel de Proyecto elaborar una clase dentro del fólder app_code


Clñsdata.vb cuya codificacion es :
Clase_General.vb
Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Imports System.Data
Public Class clase_general

Public Const cn = "uid=sa;database=northwind;server=."


Function traeds(ByVal sql As String) As DataTable
Dim ds As New SqlDataAdapter(sql, cn)
Dim dt As New DataTable
ds.Fill(dt)
Return dt
End Function
End Class

Y La clase para llmara a cualquier Store Procedure con N parámetros.

Imports System.Data.SqlClient
Imports System.Data
Public Class clsdata

Public Const CONEX = " Data Source=(local);Initial Catalog=northwind;Integrated


Security=True"
Function RUNPRO(ByVal NOMPRO As String, ByVal ParamArray ARGU() As
Object) As DataTable
Dim CN As New SqlConnection(CONEX)
Dim CMD As New SqlCommand(NOMPRO, CN)
CMD.CommandType = CommandType.StoredProcedure
CN.Open()
'PREPARA AL COMANDO PARA RECIBIR UN CONJUNTO DE PARAMETROS
SqlCommandBuilder.DeriveParameters(CMD)
Dim PRM As New SqlParameter
'PASAR CADA VALOR A SU PARAMETRO RESPECTO
Dim C As Integer = 0
For Each PRM In CMD.Parameters
If PRM.ParameterName <> "@RETURN_VALUE" Then
PRM.Value = ARGU(C)
C=C+1
End If
Next
Dim DA As New SqlDataAdapter(CMD)
Dim DT As New DataTable
DA.Fill(DT)
Return DT
Asp_net -147-

CN.Open()
DA.Dispose()
End Function

Function ejecutapro(ByVal NOMPRO As String, ByVal ParamArray ARGU() As


Object)
Dim CN As New SqlConnection(CONEX)
Dim CMD As New SqlCommand(NOMPRO, CN)
CMD.CommandType = CommandType.StoredProcedure
CN.Open()
'PREPARA AL COMANDO PARA RECIBIR UN CONJUNTO DE PARAMETROS
SqlCommandBuilder.DeriveParameters(CMD)
Dim PRM As New SqlParameter
'PASAR CADA VALOR A SU PARAMETRO RESPECTO
Dim C As Integer = 0
For Each PRM In CMD.Parameters
If PRM.ParameterName <> "@RETURN_VALUE" Then
PRM.Value = ARGU(C)
C=C+1
End If
Next
Dim res As Integer
res = CMD.ExecuteNonQuery()
Return res
CN.Open()

End Function
End Class

Aplicacion 1.- Empleando la BDD Northwind desarrollar la aplicacion como se muestra en


la figura.
Para colocar el select para seleccionar los campos:
Asp_net -148-

El diseño

Paso 1.- Elaborar el procedimiento:


a) Mostrar todos los clientes pasando un rango de letras
create proc sp_bu
@cad char(3),
as
select CustomerID, CompanyName from customers
where CompanyName like ‘[‘ + @cad +’]%’
go

b) Mostrar todos sus pedidos de un cliente


create proc sp_oer
@cod varchar(6)
as
select d.OrderID,OrderDate=convert(char(10),OrderDate,103),total=sum(UnitPrice
*Quantity)from orders o,[order details] d
Asp_net -149-

where d.OrderID=o.OrderID and CustomerID=@cod


GROUP BY d.OrderID,OrderDate
go

Imports System.Data
Partial Class _Default
Inherits System.Web.UI.Page
Dim cl As New clsdata
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
mostar()
End If
End Sub
Asp_net -150-

Protected Sub RadioButtonList1_SelectedIndexChanged(ByVal sender As


Object, ByVal e As System.EventArgs) Handles
RadioButtonList1.SelectedIndexChanged
mostar()
End Sub
Sub mostar()
Dim cad As String = RadioButtonList1.selecteditem.text
Me.GridView1.DataSource = cl.RUNPRO("sp_bu ", cad)
Me.GridView1.DataBind()
End Sub

Protected Sub GridView1_PageIndexChanging(ByVal sender As Object,


ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles
GridView1.PageIndexChanging
Me.GridView1.PageIndex = e.NewPageIndex
Call mostar()
End Sub

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object,


ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
Dim data As New DataTable
Dim cad As String = ""
cad = Me.GridView1.SelectedRow.Cells(0).Text
Me.lblnom.Text = Me.GridView1.SelectedRow.Cells(1).Text
data = cl.RUNPRO("sp_oer", cad)
Me.GridView2.DataSource = data
Me.GridView2.DataBind()
Me.lbltota.Text = data.Compute("sum(total)", "")
End Sub
End Class

Aplicación 2.-Busqueda de productos , en las ciudades que se haya consumido dicho


producto.
Los procedimientos almacenados a emplear:
-- Mostrando los productos que tengan los primeros caracteres similares
create proc sp_por
@nom varchar(30)
as
select ProductID,ProductName from products
where ProductName like @nom +'%'
go
--- La lista de paises
create proc sp_pais
as
select distinct ShipCountry from orders
go
-- Ciudades por pais
create proc sp_cui
@pais varchar(30)
as
select distinct ShipCity from orders
where ShipCountry=@pais
Asp_net -151-

-- Ciudades donde se hayan vendido dicho producto


create proc sp_ll
@nom int
as
select distinct ShipCity from orders o,products p,[order details] d
where d.OrderID=o.OrderID and d.ProductID=p.ProductID and p.ProductID=@nom
go
select* from [order details]
-- la lista de pedidos
create proc sp_fac
@cod char(5)
as
select
d.OrderID,OrderDate=convert(char(10),OrderDate,103),dias=datediff(d,ShippedDate,Requ
iredDate),total=sum(UnitPrice *Quantity)
from orders o,[order details] d
where d.OrderID=o.OrderID and ProductID=@cod
group by d.OrderID,OrderDate,ShippedDate,RequiredDate
Asp_net -152-

Imports System.Data
Partial Class page2
Inherits System.Web.UI.Page
Dim cl As New clsdata
Protected Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TextBox1.TextChanged
mm()
End Sub

Sub mm()
Me.ListBox1.DataSource = cl.RUNPRO("sp_por", Me.TextBox1.Text)
Me.ListBox1.DataTextField = "ProductName"
Me.ListBox1.DataValueField = "ProductID"
Me.ListBox1.DataBind()
Me.TextBox1.Focus()
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As


System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Me.ListBox1.DataSource = cl.RUNPRO("sp_por", "")
Me.ListBox1.DataTextField = "ProductName"
Me.ListBox1.DataValueField = "ProductID"
Me.ListBox1.DataBind()
Me.TextBox1.Focus()
pais()
End If
End Sub

Sub pais()
Me.cbo1.DataSource = cl.RUNPRO("sp_pais")
Me.cbo1.DataTextField = "ShipCountry"
Me.cbo1.DataValueField = "ShipCountry"
Me.cbo1.DataBind()
End Sub

Protected Sub cbo1_SelectedIndexChanged(ByVal sender As Object, ByVal


e As System.EventArgs) Handles cbo1.SelectedIndexChanged
Me.ListBox2.DataSource = cl.RUNPRO("sp_cui",
Me.cbo1.SelectedValue)
Me.ListBox2.DataTextField = "ShipCity"
Me.ListBox2.DataValueField = "ShipCity"
Me.ListBox2.DataBind()

End Sub

Protected Sub ListBox1_SelectedIndexChanged(ByVal sender As Object,


ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Dim vista As New datatable
Session.Add("ca", Me.ListBox1.SelectedValue)
Me.ListBox2.DataSource = cl.RUNPRO("sp_ll", Session("ca"))
Me.ListBox2.DataValueField = "ShipCity"
Me.ListBox2.DataTextField = "ShipCity"
Me.ListBox2.DataBind()
vista = cl.RUNPRO("sp_fac", Session("ca"))
Me.GridView1.DataSource = vista
Asp_net -153-

Me.GridView1.DataBind()
Me.lbltotal.Text = vista.Compute("sum(total)", "")
End Sub

Protected Sub GridView1_PageIndexChanging(ByVal sender As Object,


ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles
GridView1.PageIndexChanging
Me.GridView1.PageIndex = e.NewPageIndex
End Sub

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object,


ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

End Sub
End Class
Asp_net -154-

APLICACIÓN 3.-

Su Store procedure
create proc sp_1
as
select CustomerID,CompanyName from customers
go
create proc sp_2
@cod char(6)
as
select OrderID from orders
where CustomerID=@cod
go
create proc sp_3
@nom nvarchar(30)
as
select d.OrderID,OrderDate=convert(char(10),OrderDate,103),UnitPrice
,Quantity,total=sum(UnitPrice *Quantity)
from orders o,[order details] d
Asp_net -155-

where d.OrderID=o.OrderID and d.OrderID in(@nom)


group by d.OrderID,OrderDate,UnitPrice ,Quantity
go
select d.OrderID,OrderDate=convert(char(10),OrderDate,103),UnitPrice
,Quantity,total=sum(UnitPrice *Quantity)
from orders o,[order details] d
where d.OrderID=o.OrderID and d.OrderID in('10248','10250' )
group by d.OrderID,OrderDate,UnitPrice ,Quantity

Codificacion:
Imports System.Data
Imports System.Data.SqlClient

Partial Class page3

Inherits System.Web.UI.Page
Dim cl As New clsdata
Dim codigos As String = ""
Dim tabla As New DataTable
Public Const Cn = " Data Source=(local);Initial
Catalog=northwind;Integrated Security=True"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load

If Not Page.IsPostBack Then


ok()
Session("cn") = ""
End If

End Sub

Sub ok()
Me.ListBox1.DataSource = cl.RUNPRO("sp_1")
Me.ListBox1.DataTextField = "CompanyName"
Me.ListBox1.DataValueField = "CustomerID"
Me.ListBox1.DataBind()
End Sub

Protected Sub ListBox1_SelectedIndexChanged(ByVal sender As Object,


ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Me.ListBox2.DataSource = cl.RUNPRO("sp_2",
Me.ListBox1.SelectedValue)
Me.ListBox2.DataTextField = "OrderID"
Me.ListBox2.DataValueField = "OrderID"
Me.ListBox2.DataBind()
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As


System.EventArgs) Handles Button1.Click

For i As Integer = 0 To Me.ListBox2.Items.Count - 1


If Me.ListBox2.Items(i).Selected = True Then
codigos = codigos + Me.ListBox2.Items(i).Text + ","
Asp_net -156-

End If
Next
codigos = codigos.Substring(0, codigos.Length - 1)
Response.Write(codigos)
llena(codigos)
End Sub

Sub llena(ByVal cod As String)

Dim sql As String = ""


sql += "select
d.OrderID,OrderDate=convert(char(10),OrderDate,103),UnitPrice
,Quantity,total=sum(UnitPrice *Quantity) "
sql += " from orders o,[order details] d "
sql += " where d.OrderID=o.OrderID and d.OrderID in(" + cod + ")
"
sql += " group by d.OrderID,OrderDate,UnitPrice ,Quantity "
Dim ds As New SqlDataAdapter(sql, Cn)
Dim dt As New DataTable
ds.Fill(dt)
Me.GridView1.DataSource = dt
Me.GridView1.DataBind()
Me.lbltotal.Text = dt.Compute("sum(total)", "")
End Sub

Protected Sub GridView1_PageIndexChanging(ByVal sender As Object,


ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles
GridView1.PageIndexChanging
Me.GridView1.PageIndex = e.NewPageIndex

End Sub
Asp_net -157-
Asp_net -158-

WEB SERVICE

Podemos definir un servicio Web XML como una clase a la que podemos acceder
utilizando estándares de Internet.
Como es de suponer, el tener que utilizar esos estándares de comunicación de
Internet es porque esa "clase" está alojada en un servidor de Internet, es decir, un
servicio Web es una clase que está alojada en la Web y que podemos acceder a
ella mediante ciertos estándares como XML, que a su vez utiliza otro estándar:
SOAP, (Simple Object Access Protocol), que es el lenguaje que define cómo nos
comunicaremos con el servicio Web.

Antes de pasar a ver ejemplos prácticos sobre cómo crear y utilizar servicios Web
utilizando Visual Studio 2005, veamos un poco la historia de porqué finalmente los
servicios Web son lo que son y cómo nos facilitan toda la comunicación a través
de la red, ya sea local o global.

¿Qué son los servicios Web?

La expresión "Servicio Web" se oye con fuerza desde hace unos años en el
ámbito del desarrollo de aplicaciones e incluso en ambientes poco técnicos y de
dirección. Lo cierto es que no se trata de un concepto tan novedoso como cabría
esperar y las innovaciones que conlleva no son tanto tecnológicas, como
conceptuales.

En esta lección explicaremos desde un punto de vista no-técnico los conceptos


relacionados con los Servicios Web, cómo funcionan, de dónde vienen y a dónde
van.

El concepto de Arquitectura Orientada a Servicios o SOA se basa en el uso de


este tipo de componentes que suplen las necesidades de una o varias
aplicaciones, son independientes entre sí y trabajan independientemente del
sistema operativo o la plataforma.

Aunque muchos programadores piensan que SOA está relacionado únicamente


con los Servicios Web lo cierto es que se pueden conseguir arquitecturas SOA con
otras tecnologías como veremos.

3 Comunicación entre componentes

Existen diversas dificultades técnicas a la hora de llevar a la práctica las


arquitecturas orientadas a servicios. Entre éstas están la comunicación entre las
distintas capas y componentes que constituyen la aplicación, la gestión de
peticiones y el balanceado de carga entre servidores cuando un mismo
componente reside en varios de ellos (para aplicaciones muy grandes con muchos
clientes), la gestión de transacciones entre componentes y algunas otras cosas
más.
Asp_net -159-

Existe la posibilidad de escribir un protocolo de comunicaciones propio que se


ocupe de todas estas cuestiones, pero por supuesto se trata de una opción muy
poco realista dada la complejidad que conllevaría. Para responder a estas
necesidades de los programadores, diversos fabricantes y asociaciones de la
industria crearon servicios y protocolos específicos orientados a la interacción
distribuida de componentes. Aunque existe una gran variedad, de todos ellos los
más importantes sin duda son:

DCOM (Distributed Common Object Model), la propuesta de Microsoft, ligada a


sus sistemas Windows. Se trata de algo más que un protocolo de invocación
remota de procedimientos (RPC) ya que su última encarnación, COM+, incluye
servicios avanzados para balanceado de carga, gestión de transacciones o
llamadas asíncronas. Los parámetros son transmitidos a través de la red mediante
un formato binario propio llamado NDR (Network Data Representation).

RMI (Remote Method Invocation), es la metodología de llamada remota a


procedimientos de Java. No se centra en la definición de interfaces para
compatibilidad binaria de componentes, ni en otros conceptos avanzados, y se
basa en la existencia de un cliente y un servidor que actúan de intermediarios
entre los componentes que se quieren comunicar. Es una tecnología bastante
simple que es fácil de utilizar para aplicaciones básicas.

CORBA (Common Object Request Broker Architecture). Se trata de una serie de


convenciones que describen cómo deben comunicarse los distintos componentes,
cómo deben transferir los datos de las llamadas y sus resultados o cómo se
describen las interfaces de programación de los componentes para que los demás
sepan cómo utilizarlos. Fue desarrollado por el OMG (Object Management Group)
en la segunda mitad de la década de los '90 y es el modelo que más éxito ha
tenido en el mundo UNIX. Su método de empaquetado y transmisión de datos a
través de la red se llama CDR (Common Data representation). Existen diversas
implementaciones de distintos fabricantes.

SOAP

La tecnología que está detrás de todo ello se llama SOAP (jabón en inglés). Este
acrónimo (Simple Object Access Protocol) describe un concepto tecnológico
basado en la sencillez y la flexibilidad que hace uso de tecnologías y
estándares comunes para conseguir las promesas de la ubicuidad de los
servicios, la transparencia de los datos y la independencia de la plataforma que
según hemos visto, se hacen necesarios en las aplicaciones actuales.

Descubrimiento de servicios: WSDL y UDDI

Otro de los estándares que se definen en SOAP es WSDL (Web Service Definition
Language). Se trata de un formato estándar para describir las interfaces de los
servicios web. WSDL describe qué métodos están disponibles a través de un
Asp_net -160-

servicio Web y cuáles son los parámetros y valores devueltos por éstos. Antes de
usar un componente que actúa como servicio web se debe leer su archivo WSDL
para averiguar cómo utilizarlo.

servicios web llamado UDDI (Universal Description Discovery and Integration).


Esta especificación permite la creación de directorios de servicios web, donde se
definen métodos que permiten consultarlos para encontrar fácilmente aquel
servicio que se necesite. Windows Server 2003 incluye gratuitamente un servidor
para implementar directorios UDDI en organizaciones

Creación de servicios Web

ASP.NET 2.0 nos facilita grandemente la creación de servicios Web XML, y si nos
apoyamos en una herramienta como lo es Visual Studio 2005, incluso en la
versión Express, nos daremos cuenta de que no necesitamos ser expertos en los
protocolos utilizados por los servicios Web para poder crearlos y utilizarlos.

• Nuestro primer servicio Web


§ Analizando el contenido de un servicio Web
§ Atributos aplicables a los servicios Web
o Definición Crear un proyecto de tipo servicio Web con Visual Studio 2005
§ Crear un servicio Web usando un solo fichero
§ Eliminar ficheros de un proyecto
§ de la clase a usar en el servicio Web
§ Añadir métodos para usarlos en el servicio Web
o Probar nuestro servicio Web

Consumo de servicios Web

En esta lección veremos cómo "consumir" el servicio Web creado anteriormente


desde una aplicación de Windows Forms utilizando el entorno de desarrollo (IDE)
de Visual Studio 2005.
Como comprobaremos, el propio compilador de C# se encargará de todos los
pormenores para que podamos utilizar la clase incluida en el servicio Web como si
de una clase normal y corriente se tratara, ya que, esa es una de las ventajas de
apoyarse en un entorno integrado de la calidad de Visual Studio 2005, aunque sea
en la versión "económica", que solo debemos preocuparnos de escribir el código y
del resto... ¡nos olvidamos! (o casi).

VIII BIBLIOGRAFÍA:
CHARTE Francisco Programación con Visual Studio 2005
Edit. ANAYA España 2006
Asp_net -161-

CHARTE Francisco Programación con Visual Net


(Programación de
Bases de Datos )
Edit. ANAYA España 2005

EVANGELUS Petroulsos Visual Basic Net


Editorial Anaya, Madrid 2005

MICROSOFT ASP NET 2.0 (Sutdio Net 2005)


Editorial Mac Graw Hill México 2005

CEVALLOS fco. Javier Programación Visual Basic Net 2005


Editorial Rama Madrid 2000

Direcciones Web

http://www.godot.net
http://www.manualesgratis.com
http://www.microsoft.es
http://www.abcdatos.com
http://www.cibercursos.com
http://www.guille.costasol.net
http://www.programacion.net/cursos