Práctica A: Acceso a datos con Microsoft ADO.NET - Willy .Net
Práctica A: Acceso a datos con Microsoft ADO.NET - Willy .Net
Práctica A: Acceso a datos con Microsoft ADO.NET - Willy .Net
- No tags were found...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Práctica A: <strong>Acceso</strong> a <strong>datos</strong> <strong>con</strong> <strong>Microsoft</strong> <strong>ADO</strong>.<strong>NET</strong>CohoWineryLogon PageLogin.aspxRegistrationRegister.aspxBenefitsHome PageDefault.aspxMenuComponentClass1.vb or Class1.csPage HeaderHeader.ascxWeb.<strong>con</strong>figASPStatetempdbLife InsuranceLife.aspxRetirementRetirement.aspxMedicalMedical.aspxDentalDental.aspxLab WebApplicationProspectusProspectus.aspxDoctorsDoctors.aspxUser Controlnamedate.ascxXML WebServicedentalService1.asmxXMLFilesDoctorsDentistsObjetivosEn este laboratorio, aprenderemos a:• Recuperar <strong>datos</strong> de una base de <strong>datos</strong> <strong>Microsoft</strong>® SQL Server utilizandolos objetos SqlConnection y SqlDataAdapter.• Almacenar <strong>datos</strong> en un objeto DataSet y mostrar esos <strong>datos</strong> a los usuariosen un <strong>con</strong>trol DataGrid.• Recuperar <strong>datos</strong> de una base de <strong>datos</strong> SQL Server utilizando los objetosSqlConnection y SqlDataReader.• Vincular un objeto SqlDataReader a un <strong>con</strong>trol DataGrid para mostrar<strong>datos</strong>.Nota Este laboratorio se centra en los <strong>con</strong>ceptos de este módulo. Por ello,podría no cumplir las recomendaciones de seguridad de <strong>Microsoft</strong>. Por ejemplo,este laboratorio no cumple la recomendación de que todo el acceso a <strong>datos</strong> serealice a través de procedimientos almacenados.Requisitos previosPara trabajar en este laboratorio, es necesario tener:• Conocimientos sobre cómo utilizar los objetos SqlConnection,SqlDataAdapter, SqlDataReader y DataSet de <strong>Microsoft</strong> <strong>ADO</strong>.<strong>NET</strong> paraleer <strong>datos</strong> de una base de <strong>datos</strong> SQL Server.• Conocimientos sobre cómo mostrar <strong>datos</strong> DataSet en un <strong>con</strong>trol DataGrid.
EscenarioTiempo estimado paracompletar el laboratorio:30 minutosCoho Winery ofrece varios beneficios a sus empleados. En los laboratorios deeste curso, crearemos un sitio Web que permita a los empleados seleccionar y<strong>con</strong>figurar los beneficios que elijan.Uno de los beneficios que ofrece Coho Winery es el seguro médico. Cuando sesolicita un seguro médico, el usuario debe seleccionar un médico de cuidadosprimarios. Los doctores aprobados por la compañía aparecen en una lista de unabase de <strong>datos</strong> SQL Server denominada doctors. La base de <strong>datos</strong> tambiénincluye las direcciones de los doctores. En este laboratorio, mejoraremos lapágina doctors.aspx del sitio Web de Coho Winery para permitir a los usuariosque generen una lista de los doctores de ciudades <strong>con</strong>cretas.
Ejercicio 0Configuración del laboratorioPara realizar este laboratorio, es necesario haber creado el proyecto de laaplicación Web Benefits y el proyecto de la biblioteca de clases BenefitsList.Estos proyectos pueden haberse creado utilizando Visual Basic .<strong>NET</strong> o<strong>Microsoft</strong> Visual C# .<strong>NET</strong>.Si no se han creado estos proyectos, realizar los siguientes pasos: Crear la solución LabApplicationImportante Realizar este procedimiento únicamente si no se ha creado unarchivo de solución LabApplication.1. Utilizando Visual Studio .<strong>NET</strong>, crear una nueva solución en blancodenominada LabApplication:a. En el menú Archivo, seleccionar Nuevo, y hacer clic en Solución enblanco.b. En el cuadro de diálogo Nuevo proyecto, escribir LabApplication en elcuadro de texto Nombre y hacer clic en Aceptar. Crear el proyecto BenefitsImportante Realizar este procedimiento únicamente si no se ha creadoanteriormente un proyecto Benefits, o si se ha eliminado.1. Crear un nuevo proyecto de aplicación Web ASP.<strong>NET</strong>, denominadoBenefitsVB o BenefitsCS, en la solución LabApplication:a. En el menú Archivo, seleccionar Nuevo, y hacer clic en Proyecto.b. En el cuadro de diálogo Nuevo proyecto, en la lista Tipos de proyecto,hacer clic en Proyectos de Visual Basic o Proyectos de Visual C#.c. En la lista Plantillas, hacer clic en Aplicación Web ASP.<strong>NET</strong>,establecer la ubicación en http://localhost/BenefitsVB para el proyectoVisual Basic .<strong>NET</strong> o en http://localhost/BenefitsCS para el proyectoVisual C#.d. Hacer clic en Agregar a Solución, y hacer clic en Aceptar.Precaución Cuando se agregan proyectos a la solución, es importante eluso de mayúsculas en el nombre del proyecto. Probablemente, utilizaremosalgunos formularios Web Forms ya generados en éste y en otroslaboratorios, por ello, debemos verificar que hemos escrito <strong>con</strong> mayúsculasel nombre del proyecto Benefits.
Para el proyecto VisualBasic .<strong>NET</strong>Para el proyecto VisualC# Actualizar el proyecto Benefits1. En Visual Studio .<strong>NET</strong>, abrir el archivo de solución LabApplication.2. En el Explorador de soluciones, hacer clic <strong>con</strong> el botón derecho enBenefitsListVB o BenefitsListCS, seleccionar Agregar y hacer clic enAgregar elemento existente.3. Buscar los archivos de proyecto.Ir a la carpeta VB\Starter\BenefitsVBIr a la carpeta CS\Starter\BenefitsCS.Estas carpetas pueden en<strong>con</strong>trarse dentro del fichero labs08.zip4. En el cuadro Archivos de tipo del cuadro de diálogo Agregar elementoexistente – BenefitsList, hacer clic en Todos los archivos (*.*).5. Seleccionar todos los archivos de la carpeta y hacer clic en Abrir.6. Hacer clic en Sí a la pregunta de sobrescribir o recargar los archivos. Crear la biblioteca de clases BenefitsListImportante Realizar este procedimiento únicamente si no se ha creadoanteriormente un proyecto BenefitsList, o si se ha eliminado.Para el proyecto VisualBasic .<strong>NET</strong>Para el proyecto VisualC#1. Crear un nuevo proyecto de biblioteca de clases.Crear un nuevo proyecto de biblioteca de clases <strong>Microsoft</strong> Visual Basic®.<strong>NET</strong> <strong>con</strong> el nombre BenefitsListVB, y agregarlo a la soluciónLabApplication:a. En el menú Archivo, seleccionar Nuevo y hacer clic en Proyecto.b. En el cuadro de diálogo Nuevo proyecto, en la lista Tipos de proyecto,hacer clic en Proyectos de Visual Basic.c. En la lista Plantillas, hacer clic en Biblioteca de clases, establecer elNombre de BenefitsListVB.d. Hacer clic en Agregar a solución, y clic en Aceptar.Crear un nuevo proyecto de biblioteca de clases <strong>Microsoft</strong> Visual C# .<strong>NET</strong> <strong>con</strong> el nombre BenefitsListCS, y agregarlo a la soluciónLabApplication:a. En el menú Archivo, seleccionar Nuevo y hacer clic en Proyecto.b. En el cuadro de diálogo Nuevo proyecto, en la lista Tipos de proyecto,hacer clic en Proyectos de Visual C#.c. En la lista Plantillas, hacer clic en Biblioteca de clases, establecer elNombre a BenefitsListCS.d. Hacer clic en Agregar a solución, y clic en Aceptar.Precaución Verificar que se han escrito correctamente las mayúsculas delproyecto BenefitsList.
Para el proyecto VisualBasic .<strong>NET</strong>Para el proyecto VisualC# Actualizar el proyecto BenefitsList1. En Visual Studio .<strong>NET</strong>, abrir el archivo de solución LabApplication.2. En el Explorador de soluciones, hacer clic <strong>con</strong> el botón derecho enBenefitsListVB o BenefitsListCS, seleccionar Agregar y hacer clic enAgregar elemento existente.3. Ir al proyecto BenefitsList.Ir a la carpeta VB\Starter\BenefitsListVB.Ir a la carpeta CS\Starter\BenefitsListCS.Estas carpetas pueden en<strong>con</strong>trarse dentro del fichero labs08.zip4. En el cuadro Archivos del tipo del cuadro de diálogo Agregar elementoexistente – BenefitsList, hacer clic en Todos los archivos (*.*).5. Seleccionar todos los archivos de la carpeta y hacer clic en Abrir.6. Hacer clic en Sí a la pregunta de sobrescribir o recargar los archivos. Crear una referencia al componente BenefitsList del proyecto Benefits1. En el proyecto Benefits de la solución LabApplication, completar lossiguientes pasos para agregar una referencia al componente BenefitsListque acabamos de crear:a. Hacer clic <strong>con</strong> el botón derecho en el proyecto BenefitsVB oBenefitsCS en el Explorador de soluciones y hacer clic en Agregarreferencia.b. En el cuadro de diálogo Agregar referencia, en la pestaña Proyectos,hacer doble clic en el proyecto BenefitsListVB o BenefitsListCS.c. En la lista Componentes seleccionados, seleccionar el componenteBenefitsListVB o BenefitsListCS, y hacer clic en Aceptar.El componente se agrega a la carpeta Referencias en el Explorador desoluciones.
Ejercicio 1Utilizar un SqlDataReaderEn este ejercicio, rellenaremos un cuadro de lista en la página doctors.aspx <strong>con</strong>las ciudades donde se encuentran los doctores. Cuando el usuario seleccionauna ciudad, crearemos una nueva vista DataSet de los <strong>datos</strong> y mostraremos los<strong>datos</strong> en el DataGrid. Agregar el cuadro lista1. Abrir la página doctors.aspx del proyecto BenefitsVB o BenefitsCS.2. Mediante una operación de arrastrar y soltar, ubicar un <strong>con</strong>trolDropDownList en la página doctors.aspx, como muestra la siguienteilustración. El cuadro de lista mostrará las ciudades donde se encuentran losdoctores.3. Establecer la propiedad ID del <strong>con</strong>trol DropDownList en lstCities.Visual C#Visual Basic .<strong>NET</strong>C# Leer la lista de ciudades de la base de <strong>datos</strong> doctors1. Abrir la página de código subyacente de la página doctors.aspx,doctors.aspx.vb o doctors.aspx.cs, e ir al procedimiento de eventoPage_Load.2. Si se está utilizando C# para completar este laboratorio, introducir lasiguiente instrucción using tras las instrucciones using en la parte superiordel archivo doctors.aspx.cs.using System.Data.SqlClient;3. Localizar el siguiente comentario:'TODO Lab10: bind the listbox to city field in the doctors table//TODO Lab10: bind the listbox to city field in the doctors table4. Escribir código para crear un objeto SqlCommand y leer el campo city dela tabla doctors en la base de <strong>datos</strong> SQL Server doctors. Utilizar el objetoSqlConnection que se ha creado en la página.
El comando SqlCommand debería ser "SELECT city FROM doctors."5. Escribir código para abrir la <strong>con</strong>exión a la base de <strong>datos</strong>.6. Escribir código para crear un objeto SqlDataReader desde el objetoSqlCommand invocando el método ExecuteReader del objetoSqlCommand.7. Escribir código para establecer las propiedades de la lista desplegablelstCities como se muestra en la siguiente tabla.PropiedadValorDataSourceDataTextFieldObjeto SqlDataReader"city"Visual Basic .<strong>NET</strong>C#8. Escribir código para invocar el método DataBind del cuadro de listadesplegable lstCities.9. Escribir código para cerrar los objetos DataReader y Connection.El código debería ser similar al siguiente:Dim cmdCities As New SqlCommand _("SELECT city FROM doctors", SqlConnection1)Dim drCities As SqlDataReaderSqlConnection1.Open()drCities = cmdCities.ExecuteReader()lstCities.DataSource = drCitieslstCities.DataTextField = "city"lstCities.DataBind()drCities.Close()SqlConnection1.Close()SqlCommand cmdCities = new SqlCommand("Select city FROM doctors", sqlConnection1);sqlDataReader drCities;sqlConnection1.Open();drCities = cmdCities.ExecuteReader();lstCities.DataSource = drCities;lstCities.DataTextField = "city";lstCities.DataBind();drCities.Close();sqlConnection1.Close();
10. Generar y examinar la página doctors.aspx.El cuadro de lista desplegable City debería mostrar la lista de ciudadesdonde se encuentran los doctores.Observar que el cuadro lista City muestra una ciudad por cada fila de labase de <strong>datos</strong>. Aunque este método funciona, no es la forma más amigablede mostrar la información sobre las ciudades. ¿Qué podemos hacer paramejorarlo?________________________________________________________________________________________________________________________Nota El Laboratorio “Invocar procedimientos almacenados <strong>con</strong> <strong>Microsoft</strong><strong>ADO</strong>.<strong>NET</strong>” presenta una solución a este problema. Crear un DataView para el DataGrid1. Establecer a true la propiedad AutoPostBack del cuadro de listadesplegable lstCities.2. Crear un procedimiento de evento SelectedIndexChanged para el cuadrode lista desplegable lstCities.En el procedimiento de evento SelectedIndexChanged, agregaremos elcódigo para mostrar en el <strong>con</strong>trol DataGrid únicamente los doctores de laciudad seleccionada. Por ejemplo, si se selecciona Seattle en el cuadro delista desplegable, el <strong>con</strong>trol DataGrid únicamente mostrará doctores de estaciudad.3. Leer la ciudad seleccionada en el cuadro de lista desplegable lstCities yalmacenar el nombre de la ciudad en una variable String denominadastrCity.4. Rellenar el DataSet DsDoctors1 utilizando el DataAdaptersqlDataAdapter1.5. Crear un nuevo DataView desde Table(0) del DataSet.6. Establecer la propiedad RowFilter del DataView para mostrar únicamentelos registros en los que el campo city sea igual a la ciudad seleccionada enel cuadro de lista desplegable lstCities.7. Establecer la propiedad DataSource del <strong>con</strong>trol DataGrid al nuevoDataView.
Visual Basic .<strong>NET</strong>C#8. Invocar el método DataBind del <strong>con</strong>trol DataGrid.El código debería ser similar al siguiente:Dim strCity As String = Trim(lstCities.SelectedItem.Value)SqlDataAdapter1.Fill(DsDoctors1)Dim dvDocs As New DataView(DsDoctors1.Tables(0))dvDocs.RowFilter = "city = '" & strCity & "'"dgDoctors.DataSource = dvDocsdgDoctors.DataBind()string strCity = lstCities.SelectedItem.Value.Trim();sqlDataAdapter1.Fill(dsDoctors1);DataView dvDocs = new DataView(dsDoctors1.Tables[0]);dvDocs.RowFilter = "City = '" + strCity + "' ";dgDoctors.DataSource = dvDocs;dgDoctors.DataBind();9. En vista de Diseño, eliminar la <strong>con</strong>figuración de las propiedadesDataSource y DataMember para el <strong>con</strong>trol DataGrid:a. En la página doctors.aspx, seleccionar el <strong>con</strong>trol DataGrid dgDoctors.b. En la ventana Propiedades, seleccionar DataMember, resaltar el valordoctors, y pulsar SUPRIMIR.c. En la ventana Propiedades, seleccionar DataSource, resaltar el valordsDoctors1, y pulsar SUPRIMIR.Nota Estamos eliminando estas <strong>con</strong>figuraciones de propiedades porqueentran en <strong>con</strong>flicto <strong>con</strong> el código que hemos agregado en los pasosanteriores. Cuando las propiedades se establecen tanto en el código como enla interfaz de usuario (IU), el resultado obtenido es impredecible.Visual Basic .<strong>NET</strong>C#10. En el procedimiento de evento Page_Load, inmediatamente después delcódigo para rellenar el objeto DataSet dsDoctors1, establecer elDataSource del DataGrid dgDoctors al objeto DataSet DsDoctors1. Elcódigo debería ser similar al siguiente, <strong>con</strong> la línea recién agregada ennegrita:SqlDataAdapter1.Fill(DsDoctors1)dgDoctors.DataSource = DsDoctors1dgDoctors.DataBind()sqlDataAdapter1.Fill(dsDoctors1);dgDoctors.DataSource = dsDoctors1;dgDoctors.DataBind();11. Generar y examinar la página doctors.aspx.Cuando seleccionamos una ciudad en el cuadro de lista City, el DataGriddgDoctors muestra únicamente los doctores ubicados en la ciudadseleccionada.
Ejercicio 2Visualizar doctores de todas las ciudadesEn este ejercicio, agregaremos la opción All al cuadro de lista desplegable Cityy restableceremos la funcionalidad a la página Web doctors.aspx, querestablecerá los <strong>con</strong>troles del cuadro de lista DataGrid y Specialties a una<strong>con</strong>figuración predeterminada.Visual Basic .<strong>NET</strong>C#Visual Basic .<strong>NET</strong>C# Agregar un elemento [All] al cuadro lista1. Abrir la página de código subyacente para la página doctors.aspx,doctors.aspx.vb o doctors.aspx.cs, e ir al procedimiento de eventoPage_Load.2. Localizar el siguiente comentario:'TODO Lab10: add the "All" item to the list and select it//TODO Lab10: add the "All" item to the list and select it3. Invocar el método Add de la colección lstCities.Items para agregar unnuevo elemento a la lista denominado [All].4. Establecer la propiedad SelectedIndex del cuadro de lista desplegablelstCities al último elemento de la lista (que es el elemento [All] queacabamos de añadir).El código debería ser similar al siguiente:lstCities.Items.Add("[All]")lstCities.SelectedIndex = lstCities.Items.Count – 1lstCities.Items.Add("[All]");lstCities.SelectedIndex = lstCities.Items.Count – 1; Comprobar la selección de [All] en el procedimiento de eventoSelectedIndexChanged1. En el archivo doctors.aspx.vb o the doctors.aspx.cs, ir al procedimiento deevento lstCities_SelectedIndexChanged.2. Agregar una prueba al procedimiento de eventolstCities_SelectedIndexChanged, después de rellenar el DataSet, peroantes de invocar el método DataBind, para ver si el elemento [All] estabaseleccionado.3. Si el elemento [All] está seleccionado, establecer el DataSource del <strong>con</strong>troldgDoctors DataGrid a todo el DataSet DsDoctors1.4. Si una ciudad está seleccionada en el cuadro de lista desplegable lstCities,crear un DataView para mostrar únicamente los doctores ubicados en esaciudad, y asignar el DataSource del DataGrid dgDoctors al DataView.5. Invocar la función reset para eliminar las páginas o selecciones delDataGrid.La función reset ya está en la página de código subyacente doctors.aspx.vbo doctors.aspx.cs.
Visual Basic .<strong>NET</strong>El procedimiento de evento lstCities_SelectedIndexChanged debería sersimilar al siguiente:Private Sub lstCities_SelectedIndexChanged(...Dim strCity As String = _Trim(lstCities.SelectedItem.Value)SqlDataAdapter1.Fill(DsDoctors1)If strCity = "[All]" ThendgDoctors.DataSource = DsDoctors1ElseDim dvDocs As New DataView(DsDoctors1.Tables(0))dvDocs.RowFilter = "city = '" & strCity & "'"dgDoctors.DataSource = dvDocsEnd Ifreset()dgDoctors.DataBind()End SubC#private void lstCities_SelectedIndexChanged(...{string strCity =lstCities.SelectedItem.Value.Trim();sqlDataAdapter1.Fill(dsDoctors1);if (strCity == "[All]"){dgDoctors.DataSource = dsDoctors1;}else{DataView dvDocs =new DataView(dsDoctors1.Tables[0]);dvDocs.RowFilter = "city = '" + strCity + "'";dgDoctors.DataSource = dvDocs;}}reset();dgDoctors.DataBind();6. Generar y examinar la página doctors.aspx.7. Hacer clic en el cuadro de lista desplegable City.Deberíamos ver únicamente los doctores de esa ciudad.8. Hacer clic en [All] en el cuadro de lista desplegable City.Deberíamos ver todos los doctores de la base de <strong>datos</strong> doctors. Paginación <strong>con</strong> la selección de ciudad1. En el archivo doctors.aspx.vb o the doctors.aspx.cs, ir al procedimiento deevento dgDoctors_PageIndexChanged existente.2. Recuperar el elemento actualmente seleccionado del cuadro de listadesplegable lstCities y guardarlo en una variable denominada strCity.
Visual Basic .<strong>NET</strong>3. Agregar una prueba, después de rellenar el DataSet, pero antes de invocarel método DataBind, para ver si el elemento [All] estaba seleccionado.4. Si el elemento [All] está seleccionado, establecer la propiedad DataSourcedel DataGrid dgDoctors a todo el DataSet DsDoctors1.5. Si una ciudad está seleccionada en el cuadro de lista desplegable lstCities,crear un DataView para mostrar únicamente los doctores que esténubicados en esa ciudad, y establecer la propiedad DataSource delDataGrid dgDoctors al DataView.Al finalizar, todo el procedimiento de eventodgDoctors_PageIndexChanged debería ser similar al siguiente:Private Sub dgDoctors_PageIndexChanged(...Dim strCity As String = _Trim(lstCities.SelectedItem.Value)dgDoctors.CurrentPageIndex = e.NewPageIndexSqlDataAdapter1.Fill(DsDoctors1)If strCity = "[All]" ThendgDoctors.DataSource = DsDoctors1ElseDim dvDocs As New DataView(DsDoctors1.Tables(0))dvDocs.RowFilter = "city = '" & strCity & "'"dgDoctors.DataSource = dvDocsEnd IfdgDoctors.DataBind()End SubC#private void dgDoctors_PageIndexChanged(...{string strCity =lstCities.SelectedItem.Value.Trim();dgDoctors.CurrentPageIndex = e.NewPageIndex;sqlDataAdapter1.Fill(dsDoctors1);}if (strCity == "[All]"){dgDoctors.DataSource = dsDoctors1;}else{DataView dvDocs =new DataView(dsDoctors1.Tables[0]);dvDocs.RowFilter = "city = '" + strCity + "'";dgDoctors.DataSource = dvDocs;}dgDoctors.DataBind();6. Generar y examinar la página doctors.aspx.Probar seleccionando una ciudad y, a <strong>con</strong>tinuación, un número de página.