UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/2015 Nombre de la Práctica: Lugar de Ejecución: Tiempo Estimado: MATERIA: DOCENTES: GUIA DE LABORATORIO #6 Conectando a Fuentes de Datos – Parte III Centro de cómputo 2 horas con 30 minutos Lenguaje de Programación II Karens Medrano / Hugo Dimas I. OBJETIVOS Que los estudiantes: 1. Conozcan los objetos y clases necesarias para trabajar con bases de datos en entornos desconectados. 2. Aplicar y comprender los pasos lógicos de creación de copias de bases de datos en caché de servidor 3. Comprender e implementar la forma de actualización de una copia de base de datos con relación a la base de datos original 4. Crear buenas prácticas relacionadas a la gestión de la información en una página web de ASP.NET II. INTRODUCCIÓN TEÓRICA Entorno desconectado de ADO.NET El segundo escenario de acceso a bases de datos relacionales se conoce como “Escenario Desconectado”, ya que en él una parte de los datos del servidor central se copia localmente y puede luego ser consultada y actualizada sin contar con una conexión abierta. Luego si se desea puede establecerse una conexión con el servidor de base de datos para sincronizar los cambios efectuados sobre la copia local y actualizar los datos. Este tipo de funcionalidad es particularmente útil para escenarios de usuarios móviles, que salen de su oficina con una laptop, un SmartPhone o una PocketPC y desean poder continuar trabajando por más que no tengan conectividad física con el servidor de base de datos ubicado en la red interna de la empresa. Algunas ventajas que provee un escenario de acceso a datos desconectado son: La posibilidad de trabajar sobre los datos independientemente del resto de los usuarios de la aplicación. Mayor escalabilidad en el acceso a datos y utilización más óptima de recursos del servidor, ya que se mantiene en un mínimo indispensable la cantidad y duración de conexiones abiertas. Mayor performance, al trabajar con una copia local de los datos. Algunas Desventajas: Puede ocurrir que en un momento dado un usuario no esté accediendo a los datos más actualizados del repositorio central Al momento de sincronizar los cambios efectuados localmente contra el repositorio central pueden surgir conflictos, los cuales deben ser resueltos manualmente. Lenguaje de Programación II 1 / 17 Guía #6: Conectando a Fuentes de Datos – Parte III Clase DataSet El DataSet de ADO.NET es el componente central de la arquitectura sin conexión de ADO.NET. El DataSet está expresamente diseñado para el acceso a datos independientemente del origen de datos. Como resultado, se puede utilizar con múltiples y distintos orígenes de datos, con datos XML o para administrar datos locales de la aplicación. El DataSet contiene una colección de uno o más objetos DataTable formados por filas y columnas de datos, así como información sobre claves principales, claves externas, restricciones y relaciones relativas a los datos incluidos en los objetos DataTable. Objeto estrella en ADO.NET Representa una caché de datos en memoria Contiene DataTables Lee y escribe datos y esquemas en XML Puede ser tipado o no tipado. o Ambos heredan de la clase DataSet El tipado se apoya en un esquema XML (.XSD) para generar la clase El tipado tiene ventajas: o Expone estructura como propiedades y métodos: Intellisense o Recoge la Primary key Clase SQLAdapter • Representa un conjunto de Commands y una Connection • Puente entre el DataSet y la BD • Lee y actualiza la BD: SelectCommand, UpdateCommand, InsertCommand DeleteCommand Lenguaje de Programación II 2 Guía #6: Conectando a Fuentes de Datos – Parte III Clase DataTable Representa una tabla en memoria Lo rellena un DataAdapter o a mano Componente principal de los objetos DataSet y DataView Clase DataView Vista personalizada de un objeto DataTable Filtros, ordenación, búsquedas DataRelation Define relaciones entre tablas Utiliza columnas de un DataTable III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. 1 2 3 Requerimiento Guía de práctica #6: Conectando a Fuentes de Datos – Parte III Computadora con Visual Studio 2012 instalado y una instancia de SQL Server con Management Studio Express Memoria USB o disco flexible Lenguaje de Programación II 3 Cantidad 1 1 1 Guía #6: Conectando a Fuentes de Datos – Parte III IV. PROCEDIMIENTO Ejercicio #1 – Creación de base de datos usando SQL Server 2012 para que funcione como fuente de datos. 1. Proceda a iniciar la herramienta de Microsoft SQL Server Management Studio instalada en su computadora. Una vez cargada, proceda a crear la base de datos “EmpresaPlazaLibre” y luego proceda a ejecutar el script que se le proporciona en los recursos de esta guía. Cuando ya haya ejecutado todas las querys, proceda a verificar mediante un diagrama las relaciones entre las tablas, las cuales deben verse como se muestra a continuación: Ejercicio #2 – Creación de conexión desde Visual Studio con el origen de datos a través del asistente. 1. Proceda a iniciar Microsoft Visual Studio desde su computadora. Una vez cargado el IDE en pantalla procederemos a crear la conexión de tal manera que esta se encuentre activa desde nuestra ventana. De esta manera se podrá administrar los objetos de bases de datos desde el IDE. Para ello, proceda a iniciar el explorar de servidores, desde el menú “Ver”, “Explorador de Servidores”. Podrá observar que se carga una nueva ventana listando los diferentes servidores asociados a la aplicación. El que nos interesa por el momento es el que indica “Conexiones de datos”. Desde este punto procederemos a agregar una nueva conexión, para ello proceda a dar clic derecho sobre el icono asociado a servidores de base datos, automáticamente verá un menú emergente del cual deberá seleccionar la opción de “Agregar conexión”. 2. Se nos mostrará una ventana donde se nos solicita especificar los parámetros de conexión a nuestro servidor. Estos parámetros son los que se explican en la introducción teórica de esta guía de laboratorio. Procederemos a llenar el formulario presentado de la siguiente forma: del campo de servidor, seleccione el servidor asociado a su instancia de SQL Server instalada en su computadora. Para la conexión al servidor se debe usar conexión con autenticación de Windows. Posteriormente seleccione la base de datos que creo usted en el inicio de esta guía. La configuración anterior debe quedar como muestra la siguiente imagen. Finalmente de clic en el botón de probar conexión el cual Lenguaje de Programación II 4 Guía #6: Conectando a Fuentes de Datos – Parte III nos indicara si se ha podido establecer la conexión y si esta ha sido satisfactoria y luego de clic en Aceptar. 3. Una vez creada la conexión, procederemos a configurar la cadena de conexión en nuestro archivo web.config, ya que de esta manera se podrá mantener una sola cadena de conexión en todo el sitio. Para ello, de clic derecho sobre la conexión antes establecida y proceda a dar clic en “Propiedades” del menú emergente. Una vez se carguen las propiedades de la conexión, proceda a copiar la propiedad “Cadena de conexión” de la ventana de propiedades. Debe conservar los datos en memoria. Verifique la siguiente imagen. Lenguaje de Programación II 5 Guía #6: Conectando a Fuentes de Datos – Parte III 4. Ahora, proceda a editar e archivo web.config de su sitio web, para agregar las siguientes líneas de código. En la etiqueta “connectionString” debe colocar el valor de la cadena de conexión copiada en el punto anterior. Para una mejor referencia consulte los pasos de la guía número 5. Al final debe quedarle como se muestra a continuación: <connectionStrings> <add name="conexion" connectionString="Data Source=REEG;Initial Catalog= EmpresaPlazaLibre;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> Lo que se acaba de realizar es la adición de las cadenas de conexión en el web.config de tal manera que se encuentre disponible en todos nuestros archivos de código del proyecto. Esto es de suma utilidad ya que en casos de que se necesite cambiar la cadena de conexión, únicamente se modifica este archivo a las nuevas referencias de la fuente de datos, sin estar cambiando una a una las conexiones existentes. La etiqueta de conexión describe una propiedad “name” la cual establece el nombre con la que estableceremos nuestra conexión desde el código en C#. La propiedad “connectionString” establece la ruta al servidor de base de datos y la base de datos misma. Finalmente el “providerName” establece el espacio de nombres del proveedor de datos que utilizaremos para la gestión de nuestra conexión. 5. Una vez creado nuestro sitio web, procederemos a configurar las condiciones de trabajo del mismo mediante la creación de carpetas y archivos. Para ello cree 4 carpetas en la raíz del sitio según el detalle de la siguiente tabla. El contenido de cada carpeta se encuentra como recurso de esta guía, por lo que debe de proceder a adicionar el contenido de cada una de las carpetas como ya lo ha realizado anteriormente. Carpeta css fonts images js 6. Procederemos ahora a crear la lógica de nuestra aplicación, para ello proceda a agregar una nueva clase con el nombre “conexionDesconetada.cs” que es donde se alojará todo el código que gestionará los procesos con la base de datos. Proceda a digitar el siguiente código, tomando en cuenta las instrucciones “using” adicionales que se han cargado: using using using using using using using using System; System.Collections.Generic; System.Linq; System.Web; System.Data.SqlClient; System.Configuration; System.Data; System.Web.UI.WebControls; public class conexionDesconetada { //Declaramos loss objetos que utilizaremos en toda nuestra clase string coneccionString; SqlConnection conexionSQL; DataSet DataSetPrincipal; Lenguaje de Programación II 6 Guía #6: Conectando a Fuentes de Datos – Parte III SqlDataAdapter DataAdapterEspecífico; public conexionDesconetada() { //Configuramos la conexion y obtenemos la cadena de conexion desde el Web.config coneccionString = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString; conexionSQL = new SqlConnection( coneccionString ); DataSetPrincipal = new DataSet(); conexionSQL.Open(); //Inicializamos el adaptador específico que se utilizará en la gestión de registros de producto DataAdapterEspecífico = new SqlDataAdapter(); DataAdapterEspecífico.SelectCommand = new SqlCommand("SELECT * FROM Products", conexionSQL); } public void conectar() { conexionSQL.Open(); } public void desconectar() { conexionSQL.Close(); } public void copiarBaseDatos() { //Cargamos las tablas al dataset a traves del método cargarTabla cargarTabla( "Categories", "CategoryID" ); cargarTabla("Suppliers", "SupplierID" ); cargarTabla( "Products", "ProductID" ); //Establecemos la relacion de llaves foraneas entre las tablas, verifique la sintaxis de cada una de llas ForeignKeyConstraint fk1_cat_pro; fk1_cat_pro = new ForeignKeyConstraint(DataSetPrincipal.Tables["Categories"].Columns["CategoryID"], DataSetPrincipal.Tables["Products"].Columns["CategoryID"]); DataSetPrincipal.Tables["Products"].Constraints.Add(fk1_cat_pro); ForeignKeyConstraint fk1_sup_pro; fk1_sup_pro = new ForeignKeyConstraint(DataSetPrincipal.Tables["Suppliers"].Columns["SupplierID"], DataSetPrincipal.Tables["Products"].Columns["SupplierID"]); DataSetPrincipal.Tables["Products"].Constraints.Add(fk1_sup_pro); } public void cargarTabla(String nombreTabla, String primaryKey) { nombreTabla = nombreTabla.Trim(); //Si la tabla no existe en el contexto actual, procederemos a adicionarla if (DataSetPrincipal.Tables.IndexOf(nombreTabla) == -1) { //Configuramos un control dataAdaprte para que funcione como puente entre dataset y base de datos SqlDataAdapter dataAdapter = new SqlDataAdapter(); dataAdapter.SelectCommand = new SqlCommand(); dataAdapter.SelectCommand.CommandText = "SELECT * FROM " + nombreTabla; dataAdapter.SelectCommand.Connection = conexionSQL; Lenguaje de Programación II 7 Guía #6: Conectando a Fuentes de Datos – Parte III dataAdapter.SelectCommand.CommandType = CommandType.Text; //Populamos el dataset con la tabla que acabamos de obtener dataAdapter.FillSchema(DataSetPrincipal, SchemaType.Source, nombreTabla); dataAdapter.Fill(DataSetPrincipal, nombreTabla); dataAdapter.SelectCommand.Dispose(); dataAdapter.Dispose(); //Obtenemos la tabla actual y establecemos el campo que se utilizará como llave primaria DataTable tablaActual; tablaActual = DataSetPrincipal.Tables[ nombreTabla ]; DataColumn[] columnasPrincipales = new DataColumn[1]; columnasPrincipales[0] = tablaActual.Columns[ primaryKey ]; tablaActual.PrimaryKey = columnasPrincipales; } } public void llenarCombo(ref DropDownList comboBox, String nombreTabla, String campoValor, String campoTexto) { //Asociamos al control de combobox la fuente de datos desde donde obtendrá su información nombreTabla = nombreTabla.Trim(); comboBox.DataSource = DataSetPrincipal; comboBox.DataMember = nombreTabla; comboBox.DataValueField = campoValor; comboBox.DataTextField = campoTexto; comboBox.DataBind(); } public object[] getDataRow(int ProductID) { //Obtenemos un arreglo genérico con los datos de una fila en especifico a la que se le pasa como parametro //el ID a seleccionar desde la tabla object[] datosRetorno = new object[8]; DataRow[] filaSeleccionada; filaSeleccionada = DataSetPrincipal.Tables["Products"].Select("ProductID="+ProductID); if (filaSeleccionada.Length == 1) { datosRetorno[0] = filaSeleccionada[0]["ProductID"]; datosRetorno[1] = filaSeleccionada[0]["ProductName"]; datosRetorno[2] = filaSeleccionada[0]["SupplierID"]; datosRetorno[3] = filaSeleccionada[0]["CategoryID"]; datosRetorno[4] = filaSeleccionada[0]["QuantityPerUnit"]; datosRetorno[5] = filaSeleccionada[0]["UnitPrice"]; datosRetorno[6] = filaSeleccionada[0]["UnitsInStock"]; datosRetorno[7] = filaSeleccionada[0]["UnitsOnOrder"]; } return datosRetorno; } public void cargarProductosEnTabla(ref GridView grid, string categoria, string proveedor) { Lenguaje de Programación II 8 Guía #6: Conectando a Fuentes de Datos – Parte III grid.Columns.Clear(); //Cargamos un dataview ya que es el que nos permite hacer filtros sobre la tabla seleccionada DataView vistaFiltro = new DataView(DataSetPrincipal.Tables["Products"]); if (categoria != "0") { vistaFiltro.RowFilter = "CategoryID = " + categoria; } if (proveedor != "0") { vistaFiltro.RowFilter = "SupplierID = " + proveedor; } //Configuramos el gridView que es pasado por referencia para que su fuente de datos sea el dataview //configurado y populado anteriormente, ademas establecemos que el campo principal sea la columna de ProductID grid.DataSource = vistaFiltro; grid.DataBind(); grid.AllowPaging = true; grid.DataKeyNames = new String[1]{"ProductID"}; //Configuramos un boton de editar el cual será añadido al grid ButtonField columnaEditar = new ButtonField(); columnaEditar.HeaderText = "Editar"; columnaEditar.HeaderStyle.HorizontalAlign = HorizontalAlign.Center; columnaEditar.ButtonType = ButtonType.Button; columnaEditar.Text = "Editar"; columnaEditar.CommandName = "Seleccionar"; columnaEditar.ControlStyle.CssClass = "button special"; grid.Columns.Add(columnaEditar); //Configuramos un boton de eliminar que será añadido al grid ButtonField columnaEliminar = new ButtonField(); columnaEliminar.HeaderText = "Eliminar"; columnaEliminar.HeaderStyle.HorizontalAlign = HorizontalAlign.Center; columnaEliminar.ButtonType = ButtonType.Button; columnaEliminar.Text = "Eliminar"; columnaEliminar.CommandName = "Eliminar"; columnaEliminar.ControlStyle.CssClass = "button special"; grid.Columns.Add(columnaEliminar); //Recargamos el grid y seteamos los nombres de las columnas grid.DataBind(); grid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center; grid.HeaderRow.Cells[2].Text = "ID"; grid.HeaderRow.Cells[3].Text = "Producto"; grid.HeaderRow.Cells[4].Text = "Proveedor"; grid.HeaderRow.Cells[5].Text = "Categoría"; grid.HeaderRow.Cells[6].Text = "Cant/Unidad"; grid.HeaderRow.Cells[7].Text = "Precio"; grid.HeaderRow.Cells[8].Text = "Disponibles"; grid.HeaderRow.Cells[9].Text = "Ordenadas"; grid.PagerStyle.CssClass = "pager"; } public int actualizarProducto(int ProductID, object[] datosActualizados ) { DataRow fila2Update; Lenguaje de Programación II 9 Guía #6: Conectando a Fuentes de Datos – Parte III DataTable tablaProductos; tablaProductos = DataSetPrincipal.Tables["Products"]; try { fila2Update = tablaProductos.Rows.Find(ProductID); fila2Update["ProductName"] = datosActualizados[0].ToString(); fila2Update["SupplierID"] = int.Parse(datosActualizados[1].ToString()); fila2Update["CategoryID"] = int.Parse(datosActualizados[2].ToString()); fila2Update["QuantityPerUnit"] = datosActualizados[3].ToString(); fila2Update["UnitPrice"] = double.Parse(datosActualizados[4].ToString()); fila2Update["UnitsInStock"] = int.Parse(datosActualizados[5].ToString()); fila2Update["UnitsOnOrder"] = int.Parse(datosActualizados[6].ToString()); if (DataSetPrincipal.HasChanges()) { SqlCommandBuilder comando = new SqlCommandBuilder(DataAdapterEspecífico); int filasAfectadas = DataAdapterEspecífico.Update(DataSetPrincipal, "Products"); DataSetPrincipal.AcceptChanges(); return filasAfectadas; } return 0; }catch(Exception e){ return 0; } } public int eliminarProducto(int ProductID) { DataRow fila2Delete; DataTable tablaProductos; tablaProductos = DataSetPrincipal.Tables["Products"]; try { fila2Delete = tablaProductos.Rows.Find(ProductID); fila2Delete.Delete(); if (DataSetPrincipal.HasChanges()) { SqlCommandBuilder comando = new SqlCommandBuilder(DataAdapterEspecífico); int filasAfectadas = DataAdapterEspecífico.Update(DataSetPrincipal, "Products"); DataSetPrincipal.AcceptChanges(); return filasAfectadas; } return 0; } catch { return 0; } } } Lenguaje de Programación II 10 Guía #6: Conectando a Fuentes de Datos – Parte III 7. Ahora, proceda a agregar un nuevo Web Form con nombre “Default.aspx”, y luego digite el siguiente marcado. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE HTML> <html> <head> <title>Control de Productos</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <!--[if lte IE 8]><script src="css/ie/html5shiv.js"></script><![endif]--> <script src="js/jquery.min.js"></script> <script src="js/jquery.scrolly.min.js"></script> <script src="js/jquery.dropotron.min.js"></script> <script src="js/jquery.scrollex.min.js"></script> <script src="js/skel.min.js"></script> <script src="js/skel-layers.min.js"></script> <script src="js/init.js"></script> <noscript> <link rel="stylesheet" href="css/skel.css" /> <link rel="stylesheet" href="css/style.css" /> <link rel="stylesheet" href="css/style-xlarge.css" /> </noscript> <!--[if lte IE 9]><link rel="stylesheet" href="css/ie/v9.css" /><![endif]--> <!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]--> </head> <body> <!-- Header --> <header id="header" class="skel-layers-fixed"> <h1 id="logo"><a href="/">Página Principal</a></h1> <nav id="nav"> <ul> <li><a href="" class="button special">Nuevo Producto</a></li> </ul> </nav> </header> <style> .pager table{ width: auto !important; } </style> <!-- Main --> <div id="main" class="wrapper style1"> <div class="container"> <!-- Formulario de Ingreso de Información --> <section> <form id="form1" runat="server"> <div class="row uniform 50%"> <div class="5u 12u$(xsmall)"> Categoría <div class="select-wrapper"><asp:DropDownList ID="ddlCategorias" runat="server"></asp:DropDownList></div> </div> <div class="5u 12u$(xsmall)"> Proveedor Lenguaje de Programación II 11 Guía #6: Conectando a Fuentes de Datos – Parte III <div class="select-wrapper"><asp:DropDownList ID="ddlProveedor" runat="server"></asp:DropDownList></div> </div> <div class="2u 12u$(xsmall)"> <br /> <asp:Button ID="btnBuscar" runat="server" Text="Buscar" Width="100%" CssClass="special" /> </div> <div class="12u 12u$(xsmall)"> <asp:GridView ID="GridView1" Width="100%" CssClass="alt" runat="server"></asp:GridView> </div> </div> </form> </section> </div> </div> <!-- Footer --> <footer id="footer"> <ul class="icons"> <li><a href="#" class="icon class="label">Twitter</span></a></li> <li><a href="#" class="icon class="label">Facebook</span></a></li> <li><a href="#" class="icon class="label">Email</span></a></li> </ul> <ul class="copyright"> <li>© 2015. All rights </ul> </footer> alt fa-twitter"><span alt fa-facebook"><span alt fa-envelope"><span reserved.</li> </body> </html> 8. En la página de código subyacente, agregue una nueva variable de tipo “conexionDesconectada” que corresponde a la clase que creamos anteriormente. El nombre de la variable debe ser “nuevaConexion”. 9. En el evento “Page_Load”, proceda a digitar el siguiente código, verifique además como se declaró la variable del punto anterior, posterior a ello, proceda a ejecutar su página y observe lo que se carga en el navegador. Lenguaje de Programación II 12 Guía #6: Conectando a Fuentes de Datos – Parte III 10. Ahora, procederemos a programar el evento asociado a la paginación del GridView, para ello, siempre en la misma página de Default.aspx.cs proceda a digitar el siguiente código teniendo especial cuidado en el nombre del método. 11. Ahora, programaremos el evento asociado a los botones de eliminar y editar creados mediante código y que son añadidos al GridView en uso, para ello, proceda a digitar el siguiente código. 12. Ahora, lo único que nos resta es enlazar dichos eventos con el grid original, para ello, ubíquese en la página Default.aspx en la vista de código y añada los siguientes atributos AL GRIDVIEW, tal y como se mostrará en la figura. Luego proceda a ejecutar la página nuevamente y verifique la paginación de la tabla así como también si es posible eliminar un registro de los mostrados en la tabla. Lenguaje de Programación II 13 Guía #6: Conectando a Fuentes de Datos – Parte III 13. Ahora, en la vista de diseño, de doble clic al botón de buscar para que se cree el respectivo método de OnClick asociado al botón, y luego proceda a digitar el siguiente código. Proceda a ejecutar nuevamente la página y realice cambios en los filtros de búsqueda para determinar el funcionamiento del mismo. 14. Ahora, cree un nuevo WebForm con el nombre de “EditarRegistro.aspx” y añada el siguiente código. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="EditarRegistro.aspx.cs" Inherits="EditarRegistro" %> <!DOCTYPE HTML> <html> <head> <title>Edición de Producto</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <!--[if lte IE 8]><script src="css/ie/html5shiv.js"></script><![endif]--> <script src="js/jquery.min.js"></script> <script src="js/jquery.scrolly.min.js"></script> <script src="js/jquery.dropotron.min.js"></script> <script src="js/jquery.scrollex.min.js"></script> <script src="js/skel.min.js"></script> <script src="js/skel-layers.min.js"></script> <script src="js/init.js"></script> <noscript> <link rel="stylesheet" href="css/skel.css" /> <link rel="stylesheet" href="css/style.css" /> <link rel="stylesheet" href="css/style-xlarge.css" /> </noscript> <!--[if lte IE 9]><link rel="stylesheet" href="css/ie/v9.css" /><![endif]--> <!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]--> </head> <body> <!-- Header --> <header id="header" class="skel-layers-fixed"> <h1 id="logo"><a href="/">Página Principal</a></h1> </header> <style> .pager table{ width: auto !important; } </style> <!-- Main --> <div id="main" class="wrapper style1"> <div class="container"> Lenguaje de Programación II 14 Guía #6: Conectando a Fuentes de Datos – Parte III <!-- Formulario de Ingreso de Información --> <section> <form id="form1" runat="server"> <section> <h3>Edición de Registros</h3> <div class="row uniform 50%"> <asp:HiddenField ID="ProductID" runat="server" /> <div class="6u 12u$(xsmall)"> <asp:Label runat="server" Text="Nombre de Producto"></asp:Label> <asp:TextBox ID="ProductName" runat="server"></asp:TextBox> </div> <div class="6u 12u$(xsmall)"> Proveedor <div class="select-wrapper"><asp:DropDownList ID="SupplierID" runat="server"></asp:DropDownList></div> </div> <div class="6u 12u$(xsmall)"> Categoría <div class="select-wrapper"><asp:DropDownList ID="CategoryID" runat="server"></asp:DropDownList></div> </div> <div class="6u 12u$(xsmall)"> <asp:Label runat="server" Text="Cantidad por Unidad"></asp:Label> <asp:TextBox ID="QuantityPerUnit" runat="server"></asp:TextBox> </div> <div class="6u 12u$(xsmall)"> <asp:Label runat="server" Text="Precio Unitario"></asp:Label> <asp:TextBox ID="UnitPrice" runat="server"></asp:TextBox> </div> <div class="6u 12u$(xsmall)"> <asp:Label runat="server" Text="Existencias"></asp:Label> <asp:TextBox ID="UnitsInStock" runat="server"></asp:TextBox> </div> <div class="6u$ 12u$(xsmall)"> <asp:Label runat="server" Text="Unidades Ordenadas"></asp:Label> <asp:TextBox ID="UnitsOnOrder" runat="server"></asp:TextBox> </div> <div class="2u 12u$(xsmall)"> <br /> <asp:Button OnClientClick="return confirm('¿Desea proceder con la actualización del registro?');" ID="btnModificar" runat="server" Text="Actualizar" Width="100%" CssClass="special" /> </div> </div> </section> </form> </section> Lenguaje de Programación II 15 Guía #6: Conectando a Fuentes de Datos – Parte III </div> </div> <!-- Footer --> <footer id="footer"> <ul class="icons"> <li><a href="#" class="icon class="label">Twitter</span></a></li> <li><a href="#" class="icon class="label">Facebook</span></a></li> <li><a href="#" class="icon class="label">Email</span></a></li> </ul> <ul class="copyright"> <li>© 2015. All rights </ul> </footer> alt fa-twitter"><span alt fa-facebook"><span alt fa-envelope"><span reserved.</li> </body> </html> 15. En la página de código subyacente, agregue una nueva variable de tipo “conexionDesconectada” que corresponde a la clase que creamos anteriormente. El nombre de la variable debe ser “nuevaConexion”. 16. En el evento “Page_Load”, proceda a digitar el siguiente código, verifique además como se declaró la variable del punto anterior, posterior a ello, proceda a ejecutar su página y observe lo que se carga en el navegador. 17. Ahora, en la vista de diseño, de doble clic al botón de buscar para que se cree el respectivo método de OnClick asociado al botón de modificar, y luego proceda a digitar el siguiente código. Lenguaje de Programación II 16 Guía #6: Conectando a Fuentes de Datos – Parte III 18. Proceda a ejecutar la página Default.aspx y luego seleccione un registro para editar, modifique algún dato y posteriormente guarde los cambios. V. ANÁLISIS DE RESULTADOS 1. Comente con sus propias palabras y en base a su análisis el código de la clase “conexionDesconectada.cs” de una forma clara y entendible. 2. Cree una nueva página donde se permita, mediante controles web, ingresar un nuevo registro a la tabla de Products, haciendo uso del entorno desconectado mostrado en la guía. Para ello, puede auxiliarse del metodo de actualización de producto de la clase conexionDesconectada.cs y del siguiente recurso: https://msdn.microsoft.com/es-es/library/5ycd1034.aspx 1. VI. BIBLIOGRAFÍA Thierry GROUSSARD. (2013). C# 5: Los fundamentos del lenguaje – Desarrollar con Visual Studio 2012 . Barcelona: ENI. Lenguaje de Programación II 17
© Copyright 2024