Share via


Tutorial: Creación de una aplicación de datos de n niveles con ADO.NET y .NET Framework

Nota:

Los conjuntos de datos y las clases relacionadas son tecnologías heredadas de .NET Framework de principios de la década de 2000 que permiten a las aplicaciones trabajar con datos en memoria mientras están desconectadas de la base de datos. Son especialmente útiles para las aplicaciones que permiten a los usuarios modificar los datos y conservar los cambios en la base de datos. Aunque los conjuntos de datos han demostrado ser una tecnología de gran éxito, se recomienda que las nuevas aplicaciones de .NET usen Entity Framework Core. Entity Framework proporciona una manera más natural de trabajar con datos tabulares como modelos de objetos y tiene una interfaz de programación más sencilla.

Las aplicaciones de datos con n niveles son aplicaciones que acceden a datos y que están separadas en varias capas lógicas o niveles. Al separar los componentes de la aplicación en estos niveles individuales, se aumenta la facilidad de mantenimiento y la escalabilidad de la aplicación. Esto se consigue mediante una integración más sencilla de nuevas tecnologías, que se pueden aplicar a un solo nivel sin necesidad de volver a diseñar la solución completa. Una arquitectura típica con n niveles incluye un nivel de presentación, un nivel intermedio y una capa de datos. El nivel intermedio incluye normalmente una capa de acceso a datos, una capa de la lógica empresarial y componentes compartidos, tales como autenticación y validación. La capa de datos incluye una base de datos relacional. Las aplicaciones con n niveles normalmente almacenan la información confidencial en la capa de acceso a datos del nivel intermedio para aislar esa información de los usuarios finales que obtienen acceso al nivel de presentación. Para más información, consulte Introducción a las aplicaciones de datos de n niveles.

Una manera de separar los distintos niveles de una aplicación con n niveles consiste en crear proyectos independientes para cada nivel que se desee incluir en la aplicación. Los conjuntos de datos con tipo contienen una propiedad DataSet Project que determina en qué proyectos deben ir el conjunto de datos y el código de TableAdapter generados.

Este tutorial muestra cómo separar el código de conjunto de datos y TableAdapter en proyectos de bibliotecas de clases individuales mediante el Diseñador de DataSet. Tras separar el conjunto de datos y el código de TableAdapter cree servicios de Windows Communication Foundation y WCF Data Services in un servicio de Visual Studio a los que llamar en el nivel de acceso a datos. Finalmente, cree una aplicación de Windows Forms como nivel de presentación. Este nivel obtiene acceso a los datos desde el servicio de datos.

En este tutorial, se realizarán los siguientes pasos:

  • Crear una solución con n niveles que contendrá varios proyectos.

  • Agregar dos proyectos de bibliotecas de clases a la solución con n niveles.

  • Crear un conjunto de datos con tipo mediante el Asistente para configuración de orígenes de datos.

  • Separar en proyectos independientes el código de las clases de conjunto de datos y los objetos TableAdapter generados.

  • Crear un servicio de Windows Communication Foundation (WCF) para realizar llamadas al nivel de acceso a datos.

  • Crear funciones en el servicio para recuperar datos del nivel de acceso a datos.

  • Crear una aplicación de Windows Forms que actúe como nivel de presentación.

  • Crear controles de formularios Windows Forms enlazados al origen de datos.

  • Escribir código para rellenar las tablas de datos.

Requisitos previos

Para completar este tutorial, necesita que las cargas de trabajo de desarrollo de escritorio de .NET y de almacenamiento y procesamiento de datos estén instaladas en Visual Studio. Para instalarlas, abra el Instalador de Visual Studio y elija Modificar (o Más>modificar) junto a la versión de Visual Studio que desea modificar. Vea Modificación de Visual Studio.

En este tutorial se usa LocalDB de SQL Server Express y la base de datos de ejemplo Northwind.

  1. Si no tiene LocalDB de SQL Server Express, instálelo desde la página de descarga de SQL Server Express, o bien mediante el Instalador de Visual Studio. En el Instalador de Visual Studio, puede instalar LocalDB de SQL Server Express como parte de la carga de trabajo de desarrollo de escritorio de .NET o como un componente individual.

  2. Siga estos pasos para instalar la base de datos de ejemplo Northwind:

    1. En Visual Studio, abra la ventana Explorador de objetos de SQL Server (Explorador de objetos de SQL Server se instala como parte de la carga de trabajo Almacenamiento y procesamiento de datos en el Instalador de Visual Studio). Expanda el nodo SQL Server. Haga clic con el botón derecho en la instancia de LocalDB y seleccione Nueva consulta.

      Se abre una ventana del editor de consultas.

    2. Copie el script de Transact-SQL Northwind en el Portapapeles. Este script de T-SQL crea la base de datos Northwind desde cero y la rellena con datos.

    3. Pegue el script de T-SQL en el editor de consultas y, después, elija el botón Ejecutar.

      Después de un breve tiempo, la consulta termina de ejecutarse y se crea la base de datos Northwind.

    1. En Visual Studio, abra la ventana Explorador de objetos de SQL Server (Explorador de objetos de SQL Server se instala como parte de la carga de trabajo Almacenamiento y procesamiento de datos en el Instalador de Visual Studio). Expanda el nodo SQL Server. Haga clic con el botón derecho en la instancia de LocalDB y seleccione Nueva consulta.

      Si no ve la instancia de LocalDB, use el botón de la barra de herramientas Agregar SQL Server. Aparece el cuadro de diálogo. En él, expanda Local y elija MSSQLLocalDB. Escriba las credenciales adecuadas. Puede dejar la opción predeterminada para la base de datos.

      Captura de pantalla del cuadro de diálogo Conectar a SQL Database

    2. Pulse Conectar. Se agrega un nodo para LocalDB en el Explorador de objetos de SQL Server.

    3. Haga clic con el botón derecho en la instancia de LocalDB y seleccione Nueva consulta.

      Se abre una ventana del editor de consultas.

    4. Copie el script de Transact-SQL Northwind en el Portapapeles. Este script de T-SQL crea la base de datos Northwind desde cero y la rellena con datos.

    5. Pegue el script de T-SQL en el editor de consultas y, después, elija el botón Ejecutar.

      Después de un breve tiempo, la consulta termina de ejecutarse y se crea la base de datos Northwind.

Creación de la solución de n niveles y la biblioteca de clases que alberga el conjunto de datos (DataEntityTier)

El primer paso de este tutorial consiste en crear una solución y dos proyectos de biblioteca de clases. La primera biblioteca de clases contiene el conjunto de datos (la clase DataSet con tipo y los objetos DataTable que contendrán los datos de la aplicación). Este proyecto se utiliza como la capa de entidad de datos de la aplicación, y se ubica normalmente en el nivel intermedio. El conjunto de datos crea el conjunto de datos inicial y separa automáticamente el código en las dos bibliotecas de clases.

Nota

Asegúrese de asignar el nombre correcto al proyecto y a la solución antes de hacer clic en Aceptar. De este modo, será más fácil poder completar este tutorial.

Para crear la solución con n niveles y la biblioteca de clases DataEntityTier

  1. En Visual Studio, cree un proyecto con la plantilla de proyecto de Aplicación de Windows Forms (.NET Framework) para C# o Visual Basic. No se admiten .NET Core, .NET 5 ni las versiones posteriores.

  2. Asigne al proyecto el nombre DataEntityTier.

  3. Asigne a la solución el nombre NTierWalkthrough y elija Aceptar.

    Se crea una solución NTierWalkthrough que contiene el proyecto DataEntityTier y se agrega al Explorador de soluciones.

Creación de la biblioteca de clases que va a alberga los objetos TableAdapter (DataAccessTier)

El paso siguiente después de crear el proyecto DataEntityTier consiste en crear otro proyecto de biblioteca de clases. Este proyecto contiene los objetos TableAdapter generados y constituye el nivel de acceso a datos de la aplicación. El nivel de acceso a datos contiene la información que se requiere para conectarse a la base de datos, y se encuentra normalmente en el nivel intermedio.

Para crear una biblioteca de clases independiente para los objetos TableAdapter

  1. Haga clic con el botón derecho en la solución en el Explorador de soluciones y seleccione Agregar>Nuevo proyecto.

  2. Elija la plantilla de proyecto Biblioteca de clases (.NET Framework).

  3. Asigne el nombre DataAccessTier al proyecto y haga clic en Aceptar.

    Se crea el proyecto DataAccessTier y se agrega a la solución NTierWalkthrough.

Creación del conjunto de datos

El paso siguiente consiste en crear un conjunto de datos con tipo. Los conjuntos de datos con tipo se crean tanto con la clase de conjunto de datos (incluidas las clases DataTables) como con las clases TableAdapter en un solo proyecto. (todas las clases se generan en un solo archivo). Al separar el conjunto de datos y los objetos TableAdapter en proyectos diferentes, es la clase de conjunto de datos la que se traslada al otro proyecto, mientras que las clases TableAdapter se quedan en el proyecto original. Por consiguiente, cree el conjunto de datos en el proyecto que finalmente contendrá los objetos TableAdapter (el proyecto DataAccessTier). Cree el conjunto de datos mediante el Asistente para configuración de orígenes de datos.

Nota

Debe tener acceso a la base de datos de ejemplo Northwind para crear la conexión. Para obtener información sobre cómo configurar la base de datos de ejemplo Northwind, vea Procedimientos para instalar bases de datos de ejemplo.

Crear el conjunto de datos

  1. Seleccione DataAccessTier en el Explorador de soluciones.

  2. En el menú Datos, seleccione Mostrar orígenes de datos.

    Se abre la ventana Orígenes de datos.

  3. En la ventana Orígenes de datos, seleccione Agregar nuevo origen de datos para iniciar el Asistente para configuración de orígenes de datos.

  4. En la página Elegir un tipo de origen de datos, seleccione Base de datos y, luego, seleccione Siguiente.

  5. En la página Elegir la conexión de datos, realice una de las siguientes acciones:

    Si una conexión de datos a la base de datos de ejemplo Northwind está disponible en la lista desplegable, selecciónela.

    o

    Seleccione Nueva conexión para abrir el cuadro de diálogo Agregar conexión.

  6. Si la base de datos requiere una contraseña, seleccione la opción para incluir datos confidenciales y, después, seleccione Siguiente.

    Nota

    Si ha seleccionado un archivo de base de datos local (en lugar de conectarse a SQL Server), se le podría preguntar si desea agregar el archivo al proyecto. Elija para agregar el archivo de base de datos al proyecto.

  7. Seleccione Siguiente en la página Guardar cadena de conexión en el archivo de configuración de la aplicación.

  8. Expanda el nodo Tablas en la página Elija los objetos de base de datos .

  9. Seleccione las casillas de las tablas Clientes y Órdenes y, después, seleccione Finalizar.

    NorthwindDataSet se agrega al proyecto DataAccessTier y aparece en la ventana Orígenes de datos.

Separación de los objetos TableAdapter del conjunto de datos

Después de crear el conjunto de datos, separe la clase de conjunto de datos generada de los TableAdapters. Esto se hace configurando la propiedad DataSet Project con el nombre del proyecto en el que se va a almacenar la clase de conjunto de datos separada.

Para separar los TableAdapters del conjunto de datos

  1. Haga doble clic en NorthwindDataSet.xsd en el Explorador de soluciones para abrir el conjunto de datos en el Diseñador de DataSet.

  2. Seleccione un área vacía del diseñador.

  3. Busque el nodo DataSet Project en la ventana Propiedades.

  4. En la lista DataSet Project, seleccione DataEntityTier.

  5. En el menú Compilar, seleccione Compilar solución.

    El conjunto de datos y los TableAdapters se separan en los dos proyectos de biblioteca de clases. El proyecto que originalmente contenía el conjunto de datos entero (DataAccessTier) contiene ahora sólo los objetos TableAdapter. El proyecto designado en la propiedad DataSet Project (DataEntityTier) contiene el conjunto de datos con tipo: NorthwindDataSet.Dataset.Designer.vb (o NorthwindDataSet.Dataset.Designer.cs).

Nota

Cuando los conjuntos de datos se separan de los TableAdapters (estableciendo la propiedad DataSet Project), las clases de conjunto de datos parciales existentes no se trasladarán automáticamente. Las clases de conjunto de datos parciales existentes se deberán trasladar manualmente al proyecto de conjunto de datos.

Creación de una aplicación de servicio

Este tutorial muestra cómo acceder al nivel de acceso a datos mediante un servicio WCF, así que vamos a crear una nueva aplicación de servicio WCF.

Para crear una nueva aplicación de servicio WCF

  1. Haga clic con el botón derecho en la solución en el Explorador de soluciones y seleccione Agregar>Nuevo proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, en el panel izquierdo, seleccione WCF. En el panel central, seleccione Biblioteca de servicios WCF.

  3. Asigne el nombre DataService al proyecto y haga clic en Aceptar.

    Se crea el proyecto DataService y se agrega a la solución NTierWalkthrough.

Creación de métodos en el nivel de acceso a datos para devolver los datos de clientes y pedidos

El servicio de datos tiene que llamar a dos métodos del nivel de acceso a datos: GetCustomers y GetOrders. Estos métodos devolverán las tablas Customers y Orders de Northwind. Cree los métodos GetCustomers y GetOrders en el proyecto DataAccessTier.

Para crear un método en el nivel de acceso a datos que devuelva la tabla Customers

  1. En el Explorador de soluciones, haga doble clic en el archivo NorthwindDataset.xsd para abrir el conjunto de datos.

  2. Haga clic con el botón derecho en CustomersTableAdapter y haga clic en Agregar consulta.

  3. En la página Elija un tipo de comando, deje el valor predeterminado Usar instrucciones SQL y haga clic en Siguiente.

  4. En la página Elija un tipo de consulta, deje el valor predeterminado SELECT que devuelve filas y haga clic en Siguiente.

  5. En la página Especifique una instrucción SELECT de SQL, deje la consulta predeterminada y haga clic en Siguiente.

  6. En la página Elija los métodos que se van a generar, escriba GetCustomers como Nombre del método en la sección Devolver un DataTable.

  7. Haga clic en Finalizar

Para crear un método en el nivel de acceso a datos que devuelva la tabla Orders

  1. Haga clic con el botón derecho en OrdersTableAdapter y elija Agregar consulta.

  2. En la página Elija un tipo de comando, deje el valor predeterminado Usar instrucciones SQL y haga clic en Siguiente.

  3. En la página Elija un tipo de consulta, deje el valor predeterminado SELECT que devuelve filas y haga clic en Siguiente.

  4. En la página Especifique una instrucción SELECT de SQL, deje la consulta predeterminada y haga clic en Siguiente.

  5. En la página Elija los métodos que se van a generar, escriba GetOrders como Nombre del método en la sección Devolver un DataTable.

  6. Haga clic en Finalizar

  7. En el menú Compilar , haga clic en Compilar solución.

Adición de una referencia a los niveles de entidad de datos y acceso a datos en el servicio de datos

Dado que el servicio de datos requiere información del conjunto de datos y los TableAdapters, agregue referencias a los proyectos DataEntityTier y DataAccessTier.

Para agregar referencias al servicio de datos

  1. En el Explorador de soluciones, haga clic con el botón derecho en DataService y después haga clic en Agregar referencia.

  2. En el cuadro de diálogo Agregar referencia, haga clic en la ficha Proyectos.

  3. Seleccione los proyectos DataAccessTier y DataEntityTier.

  4. Haga clic en OK.

Adición de funciones al servicio para llamar a los métodos GetCustomers y GetOrders del nivel de acceso a datos

Ahora que el nivel de acceso a datos contiene los métodos para devolver los datos, cree los métodos correspondientes en el servicio de datos para llamar a esos métodos del nivel de acceso a datos.

Nota

Para los proyectos de C#, deberá agregar una referencia al ensamblado System.Data.DataSetExtensions a fin de que el código siguiente pueda compilarse.

Para crear las funciones GetCustomers y GetOrders en el servicio de datos

  1. En el proyecto DataService, haga doble clic en IService1.vb o IService1.cs.

  2. Agregue el código siguiente debajo del comentario Agregue aquí las operaciones del servicio:

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    Nota

    El código de este tutorial está disponible en C# y Visual Basic. Para cambiar el lenguaje de código de esta página entre C# y Visual Basic, use el conmutador del lenguaje de código situado en la parte superior derecha de la página.

  3. En el proyecto DataService, haga doble clic en Service1.vb (o en Service1.cs).

  4. Agregue el código siguiente a la clase Service1:

    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    }
    
  5. En el menú Compilar , haga clic en Compilar solución.

Creación de un nivel de presentación para mostrar los datos del servicio de datos

Ahora que la solución contiene el servicio de datos que tiene métodos, que realizan llamadas al nivel de acceso a datos, cree otro proyecto que realice llamadas al servicio de datos y presentará los datos a los usuarios. Para este tutorial, cree una aplicación de formularios Windows Forms; éste es el nivel de presentación de la aplicación con n niveles.

Para crear el proyecto de nivel de presentación

  1. Haga clic con el botón derecho en la solución en el Explorador de soluciones y seleccione Agregar>Nuevo proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, en el panel izquierdo, seleccione Escritorio de Windows. En el panel central, seleccione Aplicación de Windows Forms.

  3. Denomine el proyecto PresentationTier y haga clic en Aceptar.

    Se crea el proyecto PresentationTier y se agrega a la solución NTierWalkthrough.

Establecimiento del proyecto PresentationTier como proyecto de inicio

Estableceremos el proyecto PresentationTier para que sea el proyecto de inicio de la solución, ya que es la aplicación cliente real que presenta los datos e interactúa con ellos.

Para establecer el nuevo proyecto de nivel de presentación como proyecto de inicio

  • En el Explorador de soluciones, haga clic con el botón derecho en PresentationTier y después haga clic en Establecer como proyecto de inicio.

Adición de referencias al nivel de presentación

La aplicación cliente PresentationTier requiere una referencia de servicio al servicio de datos para poder acceder a los métodos del servicio. Además, se requiere una referencia al conjunto de datos para que el servicio WCF pueda compartir los tipos. Mientras no se habilite el uso compartido de tipos a través del servicio de datos, el código agregado a la clase de conjunto de datos parcial no estará disponible en el nivel de presentación. Como normalmente se agrega código, como el código de validación para los eventos de cambio de fila y columna de una tabla de datos, es probable que desee tener acceso a este código desde el cliente.

Para agregar una referencia al nivel de presentación

  1. En el Explorador de soluciones, haga clic con el botón derecho en PresentationTier y seleccione Agregar referencia.

  2. En el cuadro de diálogo Agregar referencia, seleccione la pestaña Proyectos.

  3. Seleccione DataEntityTier y elija Aceptar.

Para agregar una referencia de servicio al nivel de presentación

  1. En el Explorador de soluciones, haga clic con el botón derecho en PresentationTier y seleccione Agregar referencia de servicio.

  2. En el cuadro de diálogo Agregar referencia de servicio, seleccione Detectar.

  3. Seleccione Service1 y haga clic en Aceptar.

    Nota

    Si dispone de varios servicios en el equipo actual, seleccione el servicio que creó previamente en este tutorial (el servicio que contiene los métodos GetCustomers y GetOrders).

Adición de DataGridViews al formulario para mostrar los datos devueltos por el servicio de datos

Después de agregar la referencia de servicio al servicio de datos, la ventana Orígenes de datos se rellena automáticamente con los datos devueltos por el servicio.

Para agregar al formulario Windows Forms dos DataGridViews enlazados a datos

  1. En el Explorador de soluciones, seleccione el proyecto PresentationTier.

  2. En la ventana Orígenes de datos, expanda NorthwindDataSet y busque el nodo Customers.

  3. Arrastre el nodo Customers hasta Form1.

  4. En la ventana Orígenes de datos, expanda el nodo Customers y busque el nodo Orders relacionado (el nodo Orders anidado dentro del nodo Customers).

  5. Arrastre el nodo Orders relacionado hasta Form1.

  6. Cree un controlador de eventos para el evento Form1_Load haciendo doble clic sobre un área vacía del formulario.

  7. Agregue el código siguiente al controlador de eventos Form1_Load.

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

Aumento del tamaño máximo de mensaje permitido por el servicio

El valor predeterminado de maxReceivedMessageSize no es suficientemente grande como para contener los datos recuperados de las tablas Customers y Orders. En los pasos siguientes, aumentará el valor a 6553600. Cambie el valor en el cliente, lo que actualizará automáticamente la referencia del servicio.

Nota

El tamaño predeterminado más bajo está pensado para limitar la exposición a ataques por denegación de servicio (DOS). Para obtener más información, vea MaxReceivedMessageSize.

Para aumentar el valor de maxReceivedMessageSize

  1. En el Explorador de soluciones, haga doble clic en el archivo app.config del proyecto PresentationTier.

  2. Busque el atributo de tamaño maxReceivedMessageSize y cambie su valor a 6553600. Si no ve la entrada basicHttpBinding, agregue una como la del ejemplo siguiente:

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

Prueba de la aplicación

Ejecute la aplicación presionando F5. Los datos de las tablas Customers y Orders se recuperan del servicio de datos y se muestran en el formulario.

Pasos siguientes

En función de los requisitos de la aplicación, hay varios pasos que es posible que desee realizar después de guardar los datos relacionados en la aplicación basada en Windows. Por ejemplo, a continuación se indican algunas de las mejoras que podría realizar en esta aplicación:

  • Agregar validación al conjunto de datos.

  • Agregar métodos adicionales al servicio para actualizar los datos de nuevo en la base de datos.