25
Desarrollo de Aplicaciones con Software Propietario 1 / 25 UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN CICLO 02 GUIA DE LABORATORIO #9 Nombre de la Práctica: Conectando a Fuentes de Datos – Parte II Lugar de Ejecución: Centro de cómputo Tiempo Estimado: 2 horas con 30 minutos MATERIA: Desarrollo de aplicaciones con Software Propietario 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.

UNIVERSIDAD DON BOSCO FACULTAD DE …...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

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Desarrollo de Aplicaciones con Software Propietario 1 / 25

UNIVERSIDAD DON BOSCO

FACULTAD DE ESTUDIOS TECNOLÓGICOS

COORDINACION DE COMPUTACIÓN

CICLO 02

GGUUIIAA DDEE LLAABBOORRAATTOORRIIOO ##99

Nombre de la Práctica: Conectando a Fuentes de Datos – Parte II

Lugar de Ejecución: Centro de cómputo

Tiempo Estimado: 2 horas con 30 minutos

MATERIA: Desarrollo de aplicaciones con Software Propietario

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.

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 2

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.

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

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 3

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

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

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 4

III. MATERIALES Y EQUIPO

Para la realización de la guía de práctica se requerirá lo siguiente:

No. Requerimiento Cantidad

1 Guía de práctica #9: Conectando a Fuentes de Datos – Parte II 1

2 Computadora con Visual Studio 2012 instalado y una instancia de SQL Server con Management Studio Express

1

3 Memoria USB o disco flexible 1

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 Microsoft SQL Server Management Studio instalada en su computadora.

2. Una vez cargada, desde el Explorador de objetos, de clic secundario sobre la carpeta Databases del servidor SQL y cree la base de datos EmpresaPlazaLibre.

Luego, ejecute el script (SQLcreacionBDD_EmpresaPlazaLibre.sql) que se le proporciona en los recursos de esta guía.

Cuando ya haya ejecutado todas las querys, elabore un diagrama de las tablas de la BDD y verifique las relaciones entre las tablas, las cuales deben verse como se muestra a continuación:

3. Inicie Microsoft Visual Studio desde su computadora.

Cree un proyecto, del tipo Aplicación Web ASP, con el nombre SitioWeb9_CARNET (debe reemplazar CARNET por su respectivo carnet).

De las plantillas de ASP.net disponibles, elija Vacio y en la sección de agregar carpetas y referencias…, marque MVC.

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 5

Ejercicio #2 – Creación de conexión desde Visual Studio con el origen de datos a través del asistente.

4. Ahora creara una conexión de tal forma que esta se encuentre activa desde nuestra ventana. De esta manera se podrá administrar los objetos de bases de datos desde el IDE.

5. Seleccione al menú “Ver” e inicie al “Explorador de Servidores”. Podrá observar que se carga la ventana Explorador de servidores, la cual lista los diferentes servidores asociados a la aplicación.

El icono que nos interesa por el momento es el que indica Conexiones de datos. Desde este punto, agregara una nueva conexión.

Haga clic secundario sobre icono “Conexiones de datos”. Luego, del menú emergente, seleccione la opción “Agregar conexión”.

6. Se mostrará una ventana con un asistente, donde se 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.

Proceda a llenar el formulario presentado de la siguiente forma: del campo “Nombre del servidor”, seleccione el servidor asociado a su instancia de SQL Server instalada en su computadora. Para “conexión con el servidor”, debe usar conexión con autenticación de Windows. Posteriormente seleccione la base de datos que usted creo en el inicio de este procedimiento.

La configuración anterior debe quedar como muestra la siguiente imagen. Finalmente, de clic en el botón de probar conexión el cual nos indicara si se ha podido establecer la conexión. Si esta ha sido satisfactoria, de clic en Aceptar.

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 6

7. Una vez creada la conexión, definirá 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 secundario sobre la conexión antes establecida y del menú emergente, dar clic en “Propiedades”. Una vez se carguen las propiedades de la conexión en la ventana de propiedades, copia valor de la propiedad “Cadena de conexión”. Debe conservar los datos en memoria. Verifique la siguiente imagen.

8. Edite el archivo web.config de su sitio web, para agregar la sección <connectionsStrings> y su contenido justo antes de la sección <runtime> (vea líneas de código en imagen del paso anterior).

En la etiqueta “connectionString” debe colocar el valor de la cadena de conexión copiada en el paso anterior. Para una mejor referencia consulte los pasos de la guía número 8.

9. Al finalizar, la sección connectionStrings debe quedar un código similar al que se muestra a continuación:

<connectionStrings>

<add name="conexion"

connectionString="Data Source=Local;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.

10. Una vez creado nuestro sitio web, procederá a configurar las condiciones de trabajo del mismo mediante la inclusión de carpetas y archivos.

Para ello, localice, seleccione y copie a las subcarpetas incluidas en los recursos de esta practica. Luego, desde el Explorador de soluciones de su proyecto, haga clic secundario sobre el icono de su sitio

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 7

web y seleccione opción Pegar. Las carpetas de recursos y su contenido serán copiadas a la carpeta raíz de archivos de su Sitio web.

11. Para continuar, creará la lógica de nuestra aplicación. Para ello, dentro de la carpeta Models del proyecto, agregue una nueva clase con el nombre conexionDesconetada.cs, la cual alojará todo el código que gestionará los procesos con la base de datos. Proceda a digitar el siguiente código.

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Configuration; using System.Data; namespace SitioWeb9_CARNET.Models { public class conexionDesconetada { //Declaramos loss objetos que utilizaremos en toda nuestra clase string coneccionString; SqlConnection conexionSQL; public DataSet DataSetPrincipal; 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(); }

Importante:

En los archivos restantes, tome en cuenta estas consideraciones:

Determine las instrucciones “using” adicionales a las predeterminadas que deberá incluir en cada clase.

Cambie el namespace SitioWeb9_CARNET por el namespace de su propio proyecto web.

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 8

public void copiarBaseDatos() { //Cargamos las tablas al dataset a través 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 ellas*/ 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 dataAdapter 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; 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 int insertarProducto(DataSet ds, string Categorias, string Proveedores, string ProductName, string QuantityPerUnit, string UnitPrice, string UnitsInStock, string UnitsOnOrder)

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 9

{ DataTable table = ds.Tables["Products"]; DataRow row = table.NewRow(); row["ProductName"] = ProductName; row["SupplierID"] = Proveedores; row["CategoryID"] = Categorias; row["QuantityPerUnit"] = QuantityPerUnit; row["UnitsInStock"] = UnitsInStock; row["UnitPrice"] = UnitPrice; row["UnitsOnOrder"] = UnitsOnOrder; table.Rows.Add(row); if (ds.HasChanges()) { SqlCommandBuilder comando = new SqlCommandBuilder(DataAdapterEspecífico); int filasAfectadas = DataAdapterEspecífico.Update(ds, "Products"); ds.AcceptChanges(); return filasAfectadas; } return 0; } public Product mostrardatos(int productID, DataSet ds) { DataView vistaFiltro = new DataView(ds.Tables["Products"]); vistaFiltro.RowFilter = "ProductID = " + productID; Product itemproduct = new Product(); foreach (DataRowView dr in vistaFiltro) { itemproduct.ProductID = dr["ProductID"].ToString(); itemproduct.ProductName = dr["ProductName"].ToString(); itemproduct.SupplierID = dr["SupplierID"].ToString(); itemproduct.CategoryID = dr["CategoryID"].ToString(); itemproduct.QuantityPerUnit = dr["QuantityPerUnit"].ToString(); itemproduct.UnitPrice = dr["UnitPrice"].ToString(); itemproduct.UnitsInStock = dr["UnitsInStock"].ToString(); itemproduct.UnitsOnOrder = dr["UnitsOnOrder"].ToString(); } return itemproduct; } public int actualizarProducto( DataSet ds, int ProductID, string Categorias, string Proveedores, string ProductName, string QuantityPerUnit, string UnitPrice, string UnitsInStock, string UnitsOnOrder) { DataRow fila2Update; DataTable tablaProductos; tablaProductos = ds.Tables["Products"]; try { fila2Update = tablaProductos.Rows.Find(ProductID);

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 10

fila2Update["ProductName"] = ProductName; fila2Update["SupplierID"] = int.Parse(Proveedores); fila2Update["CategoryID"] = int.Parse(Categorias); fila2Update["QuantityPerUnit"] = QuantityPerUnit; fila2Update["UnitPrice"] = double.Parse(UnitPrice); fila2Update["UnitsInStock"] = int.Parse(UnitsInStock); fila2Update["UnitsOnOrder"] = int.Parse(UnitsOnOrder); 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(DataSet ds, int ProductID) { DataRow fila2Delete; DataTable tablaProductos; tablaProductos = ds.Tables["Products"]; try { fila2Delete = tablaProductos.Rows.Find(ProductID); fila2Delete.Delete(); if (DataSetPrincipal.HasChanges()) { SqlCommandBuilder comando = new SqlCommandBuilder(DataAdapterEspecífico); int filasAfectadas = DataAdapterEspecífico.Update(ds, "Products"); ds.AcceptChanges(); return filasAfectadas; } return 0; } catch { return 0; } } } }

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 11

12. Ahora, creara la lógica de nuestra aplicación. Para ello, dentro de nuestra carpeta Models, agregue una nueva clase llamada “Category.cs”, la cual alojará todo el código que gestionará los procesos con la base de datos.

Digite el siguiente código, tomando en cuenta las instrucciones “using” adicionales que se han cargado:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace SitioWeb9_CARNET.Models { public class Category { public List<SelectListItem> Categorias { get; set; } public string CategoryId { get; set; } public string CategoryName { get; set; } public string Description { get; set; } } }

13. Ahora, creara la lógica de nuestra aplicación. Para ello, agregue una nueva clase con el nombre “Product.cs” dentro de nuestra carpeta Model, en donde se alojará todo el código que gestionará los procesos con la base de datos.

Digite el siguiente código, tomando en cuenta las instrucciones “using” adicionales que se han cargado:

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace SitioWeb9_CARNET.Models { public class Product { public List<Product> Productos { get; set; } public string ProductID { get; set; } public string ProductName { get; set; } public string SupplierID { get; set; } public string CategoryID { get; set; } public string QuantityPerUnit { get; set; } public string UnitPrice { get; set; } public string UnitsInStock { get; set; } public string UnitsOnOrder { get; set; } } }

14. Ahora, creara la lógica de nuestra aplicación. Para ello, agregue una nueva clase con el nombre “Suppliers.cs” dentro de nuestra carpeta Models, en donde se alojará todo el código que gestionará los procesos con la base de datos.

Digite el siguiente código, tomando en cuenta las instrucciones “using” adicionales que se han cargado:

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 12

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace SitioWeb9_CARNET.Models { public class Suppliers { public List<SelectListItem> proveedores { get; set; } public string SupplierID { get; set; } public string CompanyName { get; set; } public string ContactName { get; set; } public string ContactTitle { get; set; } public string Address { get; set; } public string City { get; set; } public string Region { get; set; } public string PostalCode { get; set; } public string Country { get; set; } public string Phone { get; set; } public string Fax { get; set; } public string HomePage { get; set; } } }

15. Ahora, creara el controlador de nuestra aplicación. Para ello, agregue un nuevo controlador con el nombre “DefaultController” dentro de nuestra carpeta Controller, en donde se alojará todo el código que gestionará los procesos con la base de datos y los enviara a la vista.

Digite el siguiente código, tomando en cuenta las instrucciones “using” adicionales que se han cargado:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using SitioWeb9_CARNET.Models; using System.Data; namespace SitioWeb9_CARNET.Controllers { public class DefaultController : Controller { // GET: Default public ActionResult Index() { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>();

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 13

Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); List<Product> itemproducts = new List<Product>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Products"].Rows) { itemproducts.Add(new Product{ ProductID = dr["ProductID"].ToString(), ProductName = dr["ProductName"].ToString(), SupplierID = dr["SupplierID"].ToString(), CategoryID = dr["CategoryID"].ToString(), QuantityPerUnit = dr["QuantityPerUnit"].ToString(), UnitPrice = dr["UnitPrice"].ToString(), UnitsInStock = dr["UnitsInStock"].ToString(), UnitsOnOrder = dr["UnitsOnOrder"].ToString() }); } ViewBag.productos = itemproducts; listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View(); } [HttpPost] public ActionResult Index(string Categorias, string Proveedores) { conexionDesconetada datos = new conexionDesconetada();

datos.copiarBaseDatos();

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 14

Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); Product listprod = new Product(); List<Product> itemproducts = new List<Product>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } //Cargamos un dataview ya que el nos permite hacer filtros sobre la tabla seleccionada DataView vistaFiltro = new DataView(datos.DataSetPrincipal.Tables["Products"]); if (Categorias != "0") { vistaFiltro.RowFilter = "CategoryID = " + Categorias; } if (Proveedores != "0") { vistaFiltro.RowFilter = "SupplierID = " + Proveedores; } foreach (DataRowView dr in vistaFiltro) { itemproducts.Add(new Product { ProductID = dr["ProductID"].ToString(), ProductName=dr["ProductName"].ToString(), SupplierID= dr["SupplierID"].ToString(), CategoryID= dr["CategoryID"].ToString(), QuantityPerUnit= dr["QuantityPerUnit"].ToString(), UnitPrice= dr["UnitPrice"].ToString(), UnitsInStock= dr["UnitsInStock"].ToString(), UnitsOnOrder= dr["UnitsOnOrder"].ToString() });

}

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 15

listprod.Productos = itemproducts; ViewBag.productos = listprod.Productos; listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View(); } [HttpPost] public ActionResult Ingresardatos(string Categorias, string Proveedores, string ProductName,string QuantityPerUnit,string UnitPrice,string UnitsInStock,string UnitsOnOrder) { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); datos.insertarProducto(datos.DataSetPrincipal, Categorias, Proveedores, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); Product listprod = new Product(); List<Product> itemproducts = new List<Product>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Products"].Rows) { itemproducts.Add(new Product

{

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 16

ProductID = dr["ProductID"].ToString(), ProductName = dr["ProductName"].ToString(), SupplierID = dr["SupplierID"].ToString(), CategoryID = dr["CategoryID"].ToString(), QuantityPerUnit = dr["QuantityPerUnit"].ToString(), UnitPrice = dr["UnitPrice"].ToString(), UnitsInStock = dr["UnitsInStock"].ToString(), UnitsOnOrder = dr["UnitsOnOrder"].ToString() }); } listprod.Productos = itemproducts; ViewBag.productos = listprod.Productos; listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View("Index"); } [ActionName("Actualizar")] public ActionResult Actualizar(string ProductID, string Categorias, string Proveedores, string ProductName, string QuantityPerUnit, string UnitPrice, string UnitsInStock, string UnitsOnOrder) { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); datos.actualizarProducto(datos.DataSetPrincipal,int.Parse(ProductID), Categorias, Proveedores, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); Product listprod = new Product(); List<Product> itemproducts = new List<Product>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() });

}

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 17

foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Products"].Rows) { itemproducts.Add(new Product { ProductID = dr["ProductID"].ToString(), ProductName = dr["ProductName"].ToString(), SupplierID = dr["SupplierID"].ToString(), CategoryID = dr["CategoryID"].ToString(), QuantityPerUnit = dr["QuantityPerUnit"].ToString(), UnitPrice = dr["UnitPrice"].ToString(), UnitsInStock = dr["UnitsInStock"].ToString(), UnitsOnOrder = dr["UnitsOnOrder"].ToString() }); } listprod.Productos = itemproducts; ViewBag.productos = listprod.Productos; listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View("Index"); } [HttpPost] public ActionResult Add() { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) {

itemscat.Add(new SelectListItem

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 18

{ Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View(); } [ActionName("Edit")] public ActionResult Edit(string ProductID) { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString()

});

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 19

} listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View(datos.mostrardatos(int.Parse(ProductID), datos.DataSetPrincipal)); } [ActionName("Eliminar")] public ActionResult Eliminar(string ProductID) { conexionDesconetada datos = new conexionDesconetada(); datos.copiarBaseDatos(); datos.eliminarProducto(datos.DataSetPrincipal, int.Parse(ProductID)); Product listprod = new Product(); List<Product> itemproducts = new List<Product>(); Category listcat = new Category(); List<SelectListItem> itemscat = new List<SelectListItem>(); Suppliers listsup = new Suppliers(); List<SelectListItem> itemssupp = new List<SelectListItem>(); foreach (DataRow dr in datos.DataSetPrincipal.Tables["Categories"].Rows) { itemscat.Add(new SelectListItem { Text = dr["CategoryName"].ToString(), Value = dr["CategoryId"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Suppliers"].Rows) { itemssupp.Add(new SelectListItem { Text = dr["CompanyName"].ToString(), Value = dr["SupplierID"].ToString() }); } foreach (DataRow dr in datos.DataSetPrincipal.Tables["Products"].Rows) { itemproducts.Add(new Product { ProductID = dr["ProductID"].ToString(),

ProductName = dr["ProductName"].ToString(),

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 20

SupplierID = dr["SupplierID"].ToString(), CategoryID = dr["CategoryID"].ToString(), QuantityPerUnit = dr["QuantityPerUnit"].ToString(), UnitPrice = dr["UnitPrice"].ToString(), UnitsInStock = dr["UnitsInStock"].ToString(), UnitsOnOrder = dr["UnitsOnOrder"].ToString() }); } listprod.Productos = itemproducts; ViewBag.productos = listprod.Productos; listsup.proveedores = itemssupp; ViewBag.proveedores = listsup.proveedores; listcat.Categorias = itemscat; ViewBag.Categorias = listcat.Categorias; return View("Index"); } } }

16. Ahora, creara las vistas de nuestra aplicación. Para ello, agregue una nueva vista con el nombre “Index.cshtml” dentro de nuestra carpeta Views>Default, en donde se alojará todo el código que gestionará los procesos con la base de datos y los enviara a la vista.

Digite el siguiente código:

@{ ViewBag.Title = "UNIVERSIDAD DON BOSCO"; } <h2>LISTA DE PRODUCTOS</h2> @using (Html.BeginForm("Add", "Default", FormMethod.Post)) { <button type="submit" id="btnNuevo" class="btn btn-lg btn-primary top-right " onclick="location.href('@Url.Action("Add","Default")')">Nueva Producto</button> } @using (Html.BeginForm("Index", "Default", FormMethod.Post)) { <div class="form-inline" role="form"> <div class="form-group col-lg-4"> Categoria: </div> <div class="form-group col-lg-8"> proveedores: </div> </div> <div class="form-inline" role="form"> <div class="form-group col-lg-4"> @Html.DropDownList("Categorias", null, new { @class = "form-control" }) </div> <div class="form-group col-lg-4"> @Html.DropDownList("proveedores", null, new { @class = "form-control" }) </div> <br /> <button type="submit" id="btnBuscar" class="btn btn-lg btn-primary " onclick="location.href('@Url.Action("Index","Default")')">BUSCAR</button> </div>

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 21

} <form id="exportWebGrid" action="Meeting/ExportHeade" method="post"> <div name="webView"> @{ var objweb = new WebGrid(ViewBag.productos, rowsPerPage: 15, canPage: true); } @objweb.GetHtml( tableStyle: "table table-responsive table-hover", fillEmptyRows: true, headerStyle: "thead-dark", footerStyle: "pie-grid", mode: WebGridPagerModes.All, firstText: "<< Primera", previousText: "< Anterior", nextText: "Siguiente >", lastText: "Última >>", columns: objweb.Columns( objweb.Column(columnName: "ProductID", header: "ID"), objweb.Column(columnName: "ProductName", header: "Producto"), objweb.Column(columnName: "SupplierID", header: "Proveedor"), objweb.Column(columnName: "CategoryID", header: "Categoría"), objweb.Column(columnName: "QuantityPerUnit", header: "Cant/Unidad"), objweb.Column(columnName: "UnitPrice", header: "Precio"), objweb.Column(columnName: "UnitsInStock", header: "Disponibles"), objweb.Column(columnName: "UnitsOnOrder", header: "Ordenadas"), objweb.Column(format: @<text>@Html.ActionLink("Editar", "Edit", "Default", new { ProductID = item.ProductID }, null)| @Html.ActionLink("Eliminar", "Eliminar", "Default", new { ProductID = item.ProductID }, null)</text>)) ) </div> </form>

17. Ahora, creara las vistas de nuestra aplicación. Para ello, agregue una nueva vista con el nombre “Add.cshtml” dentro de nuestra carpeta Views>Default, en donde se alojará todo el código que gestionará los procesos con la base de datos y los enviara a la vista.

Digite el siguiente código:

@model SitioWeb9_CARNET.Models.Product @{ ViewBag.Title = "Add"; } <h2>Add</h2> @using (Html.BeginForm("Ingresardatos", "Default", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Product</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.Label("Nombre de Producto", new { @class = "control-label col-md-2" })

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 22

<div class="col-md-10"> @Html.EditorFor(model => model.ProductName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.ProductName, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Proveedor", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownList("proveedores", null, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.SupplierID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Categoria", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownList("Categorias", null, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.CategoryID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Cantidad de unidades", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.QuantityPerUnit, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.QuantityPerUnit, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Precio por unidad", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.UnitPrice, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitPrice, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Cantidad disponibles", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.UnitsInStock, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitsInStock, "", new { @class = "text-danger" }) </div> </div> <div class="form-group">

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 23

@Html.Label("Cantidad ordenadas", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.UnitsOnOrder, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitsOnOrder, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button type="submit" id="btnBuscar" class="btn btn-lg btn-primary " onclick="location.href('@Url.Action("Ingresar", "Default")')">Ingresar</button> </div> </div> </div> } <div> @Html.ActionLink("Regresar lista de productos", "Index") </div>

18. Ahora, creara las vistas de nuestra aplicación. Para ello, agregue una nueva vista con el nombre Edit.cshtml dentro de nuestra carpeta Views>Default, en donde se alojará todo el código que gestionará los procesos con la base de datos y los enviara a la vista. Digite el siguiente código:

@model SitioWeb9_CARNET.Models.Product @{ ViewBag.Title = "Edit"; } <h2>Edit</h2> @using (Html.BeginForm("Actualizar", "Default", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Product</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.ProductID) <div class="form-group"> @Html.Label("ID Producto", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.ProductID, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.ProductID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Nombre Producto", new { @class = "control-label col-md-2" }) <div class="col-md-10">

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 24

@Html.EditorFor(model => model.ProductName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.ProductName, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Proveedores", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownList("proveedores", null, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.SupplierID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Categoria", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownList("Categorias", null, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.CategoryID, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Cantidad", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.QuantityPerUnit, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.QuantityPerUnit, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Precio", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.UnitPrice, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitPrice, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Disponibles", new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.UnitsInStock, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitsInStock, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.Label("Ordenadas", new { @class = "control-label col-md-2" }) <div class="col-md-10">

Guía #9: Conectando a Fuentes de Datos – Parte II

Desarrollo de Aplicaciones con Software Propietario 25

@Html.EditorFor(model => model.UnitsOnOrder, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.UnitsOnOrder, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button type="submit" id="btnBuscar" class="btn btn-lg btn-primary " onclick="location.href('@Url.Action("Actualizar","Default")')">Guardar</button> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div>

19. Proceda a probar la aplicación, iniciando en la vista Index. Realice búsquedas, inserciones, actualizaciones y eliminaciones de datos.

VI. BIBLIOGRAFÍA

1. Thierry GROUSSARD. (2013). C# 5: Los fundamentos del lenguaje – Desarrollar con Visual Studio 2012. Barcelona: ENI