Consultar datos con el control SqlDataSource (C#)

por Scott Mitchell

Descargar PDF

En los tutoriales anteriores usamos el control ObjectDataSource para separar completamente la capa de presentación de la capa de acceso a datos. A partir de este tutorial, aprendemos cómo se puede usar el control SqlDataSource para aplicaciones sencillas que no requieren una separación tan estricta del acceso a los datos y la presentación.

Introducción

Todos los tutoriales que hemos examinado hasta ahora han usado una arquitectura en capas que consta de capas de presentación, lógica de negocios y acceso a datos. La capa de acceso a datos (DAL) se creó en el primer tutorial (Creación de una capade acceso a datos) y la capa lógica de negocios en el segundo (Creación de una capade lógica de negocios). A partir del tutorial Mostrar datos con objectDataSource, vimos cómo usar ASP.NET nuevo control ObjectDataSource de 2.0 para interactuar mediante declaración con la arquitectura de la capa de presentación.

Aunque todos los tutoriales hasta ahora han usado la arquitectura para trabajar con datos, también es posible acceder, insertar, actualizar y eliminar datos de base de datos directamente desde una página de ASP.NET, omitiendo la arquitectura. Si lo hace, coloca las consultas de base de datos específicas y la lógica de negocios directamente en la página web. Para aplicaciones suficientemente grandes o complejas, el diseño, la implementación y el uso de una arquitectura en capas es vitalmente importante para el éxito, la portabilidad y el mantenimiento de la aplicación. Sin embargo, el desarrollo de una arquitectura sólida puede ser innecesario al crear aplicaciones sencillas y sencillas.

ASP.NET 2.0 proporciona cinco controles de origen de datos integrados SqlDataSource, AccessDataSource, ObjectDataSource, XmlDataSource ySiteMapDataSource . SqlDataSource se puede usar para acceder a datos y modificarlos directamente desde una base de datos relacional, como Microsoft SQL Server, Microsoft Access, Oracle, MySQL y otros. En este tutorial y los tres siguientes, examinaremos cómo trabajar con el control SqlDataSource, exploraremos cómo consultar y filtrar datos de base de datos, así como cómo usar SqlDataSource para insertar, actualizar y eliminar datos.

ASP.NET 2.0 Includes Five Built-In Data Source Controls

Figura 1: ASP.NET 2.0 incluye cinco controles de origen de datos integrados

Comparación de ObjectDataSource y SqlDataSource

Conceptualmente, los controles ObjectDataSource y SqlDataSource son simplemente servidores proxy a los datos. Como se describe en el tutorial Mostrar datos con ObjectDataSource, ObjectDataSource tiene propiedades que indican el tipo de objeto que proporciona los datos y los métodos que se van a invocar para seleccionar, insertar, actualizar y eliminar datos del tipo de objeto subyacente. Una vez configuradas las propiedades de ObjectDataSource, se puede enlazar un control web de datos, como GridView, DetailsView o DataList, mediante los métodos ObjectDataSource s Select(), Insert(), Delete()y Update() para interactuar con la arquitectura subyacente.

SqlDataSource proporciona la misma funcionalidad, pero funciona en una base de datos relacional en lugar de en una biblioteca de objetos. Con SqlDataSource, debemos especificar la cadena de conexión de la base de datos y las consultas SQL ad hoc o los procedimientos almacenados que se van a ejecutar para insertar, actualizar, eliminar y recuperar datos. Los métodos SqlDataSource s Select(), Insert(), Update(), y Delete(), cuando se invocan, se conectan a la base de datos especificada y emiten la consulta SQL adecuada. Como se muestra en el diagrama siguiente, estos métodos realizan el trabajo grunt de conectarse a una base de datos, emitir una consulta y devolver los resultados.

The SqlDataSource Serves as a Proxy to the Database

Figura 2: SqlDataSource actúa como proxy para la base de datos

Nota:

En este tutorial nos centraremos en recuperar datos de la base de datos. En el tutorial Inserción, actualización y eliminación de datos con el control SqlDataSource, veremos cómo configurar SqlDataSource para admitir la inserción, actualización y eliminación.

Controles SqlDataSource y AccessDataSource

Además del control SqlDataSource, ASP.NET 2.0 también incluye un control AccessDataSource. Estos dos controles diferentes llevan a muchos desarrolladores nuevos a ASP.NET 2.0 para sospechar que el control AccessDataSource está diseñado para funcionar exclusivamente con Microsoft Access con el control SqlDataSource diseñado para trabajar exclusivamente con Microsoft SQL Server. Aunque AccessDataSource está diseñado para funcionar específicamente con Microsoft Access, el control SqlDataSource funciona con cualquier base de datos relacional a la que se pueda acceder a través de .NET. Esto incluye cualquier almacén de datos compatible con OleDb o ODBC, como Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL y PostgreSQL, entre muchos otros.

La única diferencia entre los controles AccessDataSource y SqlDataSource es cómo se especifica la información de conexión de la base de datos. El control AccessDataSource solo necesita la ruta de acceso del archivo al archivo de base de datos de Access. SqlDataSource, por otro lado, requiere una cadena de conexión completa.

Paso 1: Crear las páginas web SqlDataSource

Antes de empezar a explorar cómo trabajar directamente con los datos de base de datos mediante el control SqlDataSource, primero dedique un momento a crear las páginas de ASP.NET en nuestro proyecto de sitio web que necesitaremos para este tutorial y las tres siguientes. Empiece agregando una nueva carpeta denominada SqlDataSource. Después, agregue las siguientes páginas ASP.NET a esa carpeta, asegurándose de asociar cada página a la página maestra Site.master:

  • Default.aspx
  • Querying.aspx
  • ParameterizedQueries.aspx
  • InsertUpdateDelete.aspx
  • OptimisticConcurrency.aspx

Add the ASP.NET Pages for the SqlDataSource-Related Tutorials

Figura 3: Agregue las páginas de ASP.NET para los tutoriales relacionados con el control SqlDataSource

Igual que en las otras carpetas, Default.aspx en la carpeta SqlDataSource enumerará los tutoriales en su sección. Recuerde que el control de usuario SectionLevelTutorialListing.ascx proporciona esta funcionalidad. Por lo tanto, agregue este control de usuario a Default.aspx arrastrándolo desde el Explorador de soluciones a la vista Diseño de la página.

Add the SectionLevelTutorialListing.ascx User Control to Default.aspx

Figura 4: Agregue el control de usuario SectionLevelTutorialListing.ascx a Default.aspx (haga clic aquí para ver la imagen a tamaño completo)

Por último, agregue las siguientes cuatro páginas como entradas al archivo Web.sitemap. En concreto, agregue el marcado siguiente después de agregar botones personalizados a DataList y Repeater <siteMapNode>:

<siteMapNode url="~/SqlDataSource/Default.aspx"
    title="Using the SqlDataSource Control"
    description="Work directly with database data using the SqlDataSource control.">
    <siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"
        description="Examines how to query data from a database that can then be
                     displayed  through a data Web control."/>
    <siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"
        title="Parameterized Queries"
        description="Learn how to specify parameterized WHERE clauses in the
                     SqlDataSource's SELECT statement." />
    <siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"
        title="Inserting, Updating, and Deleting Database Data"
        description="See how to configure the SqlDataSource to include INSERT, UPDATE,
                      and DELETE statements." />
    <siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"
        title="Using Optimistic Concurrency"
        description="Explore how to augment the SqlDataSource to include support for
                     optimistic concurrency." />
</siteMapNode>

Después de actualizar Web.sitemap, dedique un momento a ver el sitio web de tutoriales a través de un explorador. El menú de la izquierda ahora incluye elementos para la edición, inserción y eliminación de tutoriales.

The Site Map Now Includes Entries for the SqlDataSource Tutorials

Figura 5: El mapa del sitio ahora incluye entradas para los tutoriales de SqlDataSource

Paso 2: Agregar y configurar el control de SqlDataSource

Para empezar, abra la Querying.aspx página en la carpeta SqlDataSource y cambie a la vista Diseño. Arrastre un control SqlDataSource desde el Cuadro de herramientas hasta el Diseñador y establezca su ID en ProductsDataSource. Al igual que con ObjectDataSource, SqlDataSource no genera ninguna salida representada y, por tanto, aparece como un cuadro gris en la superficie de diseño. Para configurar SqlDataSource, haga clic en el vínculo Configurar origen de datos desde la etiqueta inteligente SqlDataSource.

Click on the Configure Data Source Link from the SqlDataSource s Smart Tag

Figura 6: Haga clic en el vínculo Configurar Data Source Link de la etiqueta inteligente SqlDataSource

Esto abre el Asistente para configurar orígenes de datos del control SqlDataSource. Aunque los pasos del asistente difieren de los controles ObjectDataSource, el objetivo final es el mismo para proporcionar los detalles sobre cómo recuperar, insertar, actualizar y eliminar datos a través del origen de datos. Para SqlDataSource, esto implica especificar la base de datos subyacente que se va a usar y proporcionar las instrucciones SQL ad hoc o los procedimientos almacenados.

El primer paso del asistente nos solicita la base de datos. La lista desplegable incluye esas bases de datos que se encuentran en la carpeta de App_Data la aplicación web y las que se han agregado al nodo Conexiones de datos en el Explorador de servidores. Puesto que ya hemos agregado una cadena de conexión para la base de datos NORTHWIND.MDF de la carpeta App_Data al archivo Web.config del proyecto, la lista desplegable incluye una referencia a esa cadena de conexión, NORTHWINDConnectionString. Elija este elemento en la lista desplegable y haga clic en Siguiente.

Choose the NORTHWINDConnectionString from the Drop-Down List

Figura 7: Elegir en NORTHWINDConnectionString la lista desplegable

Después de elegir la base de datos, el asistente solicita que la consulta devuelva datos. Podemos especificar las columnas de una tabla o vista para devolver o especificar una instrucción SQL personalizada o especificar un procedimiento almacenado. Puede alternar entre esta opción a través de los botones de radio Especificar una instrucción SQL personalizada o un procedimiento almacenado y Especificar columnas de una tabla o vista.

Nota:

En este primer ejemplo, vamos a usar la opción Especificar columnas de una tabla o vista. Volveremos al asistente más adelante en este tutorial y exploraremos la opción Especificar una instrucción SQL personalizada o un procedimiento almacenado.

En la figura 8 se muestra la pantalla Configurar la instrucción Select cuando se selecciona el botón de radio Especificar columnas de una tabla o vista. La lista desplegable contiene el conjunto de tablas y vistas de la base de datos Northwind, con las columnas de la tabla o vista seleccionadas mostradas en la lista de casillas de verificación siguiente. En este ejemplo, vamos a devolver las columnas ProductID, ProductNamey UnitPrice de la tabla Products. Como se muestra en la figura 8, después de realizar estas selecciones, el asistente muestra la instrucción SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]SQL resultante.

Return Data from the Products Table

Figura 8: Devolver datos de la Products tabla

Una vez configurado el asistente para devolver las columnas ProductID, ProductNamey UnitPrice de la tabla Products, haga clic en el botón Siguiente. Esta pantalla final ofrece la oportunidad de examinar los resultados de la consulta configurada desde el paso anterior. Al hacer clic en el botón Test Query (Consulta de prueba), se ejecuta la instrucción configurada SELECT y se muestran los resultados en una cuadrícula.

Click the Test Query Button to Review Your SELECT Query

Figura 9: Haga clic en el botón Probar consulta para revisar la SELECT consulta

Para finalizar el asistente, haga clic en Finalizar.

Al igual que con ObjectDataSource, el asistente de SqlDataSource simplemente asigna valores a las propiedades del control, es decir, las ConnectionString propiedades y SelectCommand. Después de completar el Asistente de SqlDataSource, el marcado declarativo resultante debe ser similar al siguiente:

<asp:SqlDataSource ID="ProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>

La ConnectionString propiedad proporciona información sobre cómo conectarse a la base de datos. A esta propiedad se le puede asignar un valor de cadena de conexión completo codificado de forma rígida o puede apuntar a una cadena de conexión en Web.config. Para hacer referencia a un valor de cadena de conexión en Web.config, use la sintaxis <%$ expressionPrefix:expressionValue %>. Normalmente, expressionPrefix es ConnectionStrings y expressionValue es el nombre de la cadena de conexión de la Web.config<connectionStrings> sección. Sin embargo, la sintaxis se puede usar para hacer referencia <appSettings> a elementos o contenido de archivos de recursos. Consulte información general sobre expresiones de ASP.NET para obtener más información sobre esta sintaxis.

La SelectCommand propiedad especifica la instrucción SQL ad-hoc o el procedimiento almacenado que se va a ejecutar para devolver los datos.

Paso 3: Agregar un control web de datos y enlazarlo al SqlDataSource

Una vez configurado SqlDataSource, se puede enlazar a un control web de datos, como GridView o DetailsView. Para este tutorial, vamos a mostrar los datos en una clase GridView. En el Cuadro de herramientas, arrastre un Control GridView a la página y conéctelo a ProductsDataSource SqlDataSource eligiendo el origen de datos en la lista desplegable de la etiqueta inteligente gridView.

Add a GridView and Bind it to the SqlDataSource Control

Figura 10: Agregar un control GridView y Enlazarlo al control SqlDataSource (haga clic para ver la imagende tamaño completo)

Una vez que haya seleccionado el control SqlDataSource de la lista desplegable de la etiqueta inteligente GridView, Visual Studio agregará automáticamente un BoundField o CheckBoxField a GridView para cada una de las columnas devueltas por el control de origen de datos. Dado que SqlDataSource devuelve tres columnas de base de datos ProductID, ProductNamey UnitPrice hay tres campos en GridView.

Tómese un momento para configurar GridView s tres BoundFields. Cambie la propiedad HeaderText del campo ProductName a Nombre del producto y el campo UnitPrice s a Precio. Dar formato también al UnitPrice campo como moneda. Después de realizar estas modificaciones, el marcado declarativo de GridView debe ser similar al siguiente:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="Product Name"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:c}"
            HtmlEncode="False" />
    </Columns>
</asp:GridView>

Ahora pruebe esta página a través de un explorador. Como se muestra en la figura 11, GridView enumera los valores ProductID, ProductName y UnitPricede cada producto.

The GridView Displays Each Product s ProductID, ProductName, and UnitPrice Values

Figura 11: GridView muestra cada producto ProductID, ProductNamey UnitPrice valores (haga clic para ver la imagen de tamaño completo)

Cuando se visita la página, GridView invoca su método de control de Select() origen de datos. Cuando usamos el control ObjectDataSource, esto llamó al método s GetProducts() de la clase ProductsBLL. Sin embargo, con SqlDataSource, el Select() método establece una conexión a la base de datos especificada y emite ( SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]SelectCommand, en este ejemplo). SqlDataSource devuelve sus resultados que, a continuación, enumera GridView, creando una fila en GridView para cada registro de base de datos devuelto.

Las características integradas del control web de datos y el control SqlDataSource

En general, las características inherentes a los controles web de datos paginación, ordenación, edición, eliminación, inserción, etc. son específicas del control web de datos y no dependen del control de origen de datos utilizado. Es decir, GridView puede usar su paginación integrada, ordenar, editar y eliminar si está enlazado a ObjectDataSource o a SqlDataSource. Sin embargo, ciertas características de control web de datos son sensibles al control de origen de datos que se usa o a la configuración del control de origen de datos.

Por ejemplo, en el tutorial Paginación eficaz a través de grandes cantidades de datos hemos explicado cómo, de forma predeterminada, la lógica de paginación de los controles web de datos devuelve de forma ingenua todos los registros del origen de datos subyacente y, a continuación, muestra solo el subconjunto adecuado de registros dado el índice de página actual y el número de registros que se van a mostrar por página. Este modelo es muy ineficaz al paginar a través de conjuntos de resultados suficientemente grandes. Afortunadamente, ObjectDataSource se puede configurar para admitir la paginación personalizada, que devuelve solo el subconjunto preciso de registros que se van a mostrar. Sin embargo, el control SqlDataSource carece de las propiedades para implementar la paginación personalizada.

Otra sutileza con la paginación y la ordenación surgen con SqlDataSource. De forma predeterminada, los datos devueltos desde SqlDataSource se pueden paginar o ordenar a través de GridView. Para demostrarlo, compruebe las opciones Habilitar paginación y Habilitar ordenación en la etiqueta inteligente GridView en Querying.aspx y compruebe que funciona según lo previsto.

La ordenación y la paginación funcionan porque SqlDataSource recupera los datos de la base de datos en un DataSet de tipo flexible. El número total de registros devueltos por la consulta es un aspecto esencial para implementar la paginación se puede determinar desde DataSet. Además, los resultados del DataSet se pueden ordenar a través de un DataView. SqlDataSource usa automáticamente estas funcionalidades cuando GridView solicita datos paginados o ordenados.

SqlDataSource se puede configurar para devolver un objeto DataReader en lugar de un objeto DataSet cambiando su DataSourceMode propiedad de DataSet (valor predeterminado) a DataReader. Es posible que se prefiera usar DataReader en situaciones en las que se pasan los resultados de SqlDataSource al código existente que espera dataReader. Además, dado que DataReaders son objetos considerablemente más sencillos que DataSets, ofrecen un mejor rendimiento. Sin embargo, si realiza este cambio, el control web de datos no puede ordenar ni página, ya que SqlDataSource no puede determinar cuántos registros devuelve la consulta, ni el DataReader ofrece ninguna técnica para ordenar los datos devueltos.

Paso 4: Especificar una instrucción SQL o un procedimiento almacenado personalizado

Al configurar el control SqlDataSource, la consulta que se usa para devolver datos se puede especificar en uno de los dos enfoques como una instrucción SQL personalizada o un procedimiento almacenado, o como columnas de una tabla o vista existente. En el paso 2 hemos examinado la selección de columnas de la Products tabla. Echemos un vistazo al uso de una instrucción SQL personalizada.

Agregue otro control GridView a la Querying.aspx página y elija crear un nuevo origen de datos en la lista desplegable de la etiqueta inteligente. A continuación, indique que los datos se extraerán de una base de datos que creará un nuevo control SqlDataSource. Asigne al control el nombre ProductsWithCategoryInfoDataSource.

Create a New SqlDataSource Control Named ProductsWithCategoryInfoDataSource

Figura 12: Crear un nuevo control SqlDataSource denominado ProductsWithCategoryInfoDataSource

La siguiente pantalla nos pide que especifiquemos la base de datos. Como hicimos en la figura 7, seleccione en NORTHWINDConnectionString la lista desplegable y haga clic en Siguiente. En la pantalla Configurar la instrucción Select, elija el botón de radio Especificar una instrucción SQL personalizada o un procedimiento almacenado y haga clic en Siguiente. Se abrirá la pantalla Definir instrucciones personalizadas o procedimientos almacenados, que ofrece pestañas con la etiqueta SELECT, UPDATE, INSERT y DELETE. En cada pestaña puede escribir una instrucción SQL personalizada en el cuadro de texto o elegir un procedimiento almacenado en la lista desplegable. En este tutorial veremos cómo escribir una instrucción SQL personalizada; En el siguiente tutorial se incluye un ejemplo que usa un procedimiento almacenado.

Enter a Custom SQL Statement or Pick a Stored Procedure

Figura 13: Especificar una instrucción SQL personalizada o elegir un procedimiento almacenado

La instrucción SQL personalizada se puede escribir manualmente en el cuadro de texto o se puede construir gráficamente haciendo clic en el botón Generador de consultas. En el Generador de consultas o en el cuadro de texto, use la siguiente consulta para devolver los ProductID campos y ProductName de la Products tabla mediante un JOIN para recuperar los productos CategoryName de la Categories tabla:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
    INNER JOIN Products ON
        Categories.CategoryID = Products.CategoryID

You can Graphically Construct the Query Using the Query Builder

Figura 14: Puede construir gráficamente la consulta mediante el Generador de consultas

Después de especificar la consulta, haga clic en Siguiente para continuar con la pantalla Consulta de prueba. Haga clic en Finalizar para completar el asistente SqlDataSource.

Después de completar el asistente, GridView tendrá tres BoundFields agregados a él mostrando las columnas ProductID, ProductName y CategoryName devueltas de la consulta y dando como resultado el siguiente marcado declarativo:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName"
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
            SortExpression="CategoryName" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="
        SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
        FROM Categories
        INNER JOIN Products ON Categories.CategoryID = Products.CategoryID">
</asp:SqlDataSource>

The GridView Shows Each Product s ID, Name, and Associated Category Name

Figura 15: GridView muestra cada id. de producto, nombre y nombre de categoría asociado (haga clic para ver la imagende tamaño completo).

Resumen

En este tutorial hemos visto cómo consultar y mostrar datos mediante el control SqlDataSource. Al igual que ObjectDataSource, SqlDataSource actúa como proxy, lo que proporciona un enfoque declarativo para acceder a los datos. Sus propiedades especifican la base de datos a la que conectarse y la consulta SQL SELECT que se va a ejecutar; se pueden especificar a través de la ventana Propiedades o mediante el Asistente para configurar DataSource.

Los SELECT ejemplos de consulta que examinamos en este tutorial devolvieron todos los registros de la consulta especificada. Sin embargo, el control SqlDataSource puede incluir una WHERE cláusula con parámetros cuyos valores se asignan mediante programación o se extraen automáticamente de un origen especificado. Examinaremos cómo crear y usar consultas con parámetros en el siguiente tutorial.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos:

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede ponerse en contacto con él a través de mitchell@4GuysFromRolla.com. o a través de su blog, que se puede encontrar en http://ScottOnWriting.NET.

Agradecimientos especiales a

Muchos revisores han evaluado esta serie de tutoriales. Los revisores principales de este tutorial fueron Susan Connery, Bernadette Leigh y David Suru. ¿Le interesa revisar mis próximos artículos de MSDN? Si es así, escríbame a mitchell@4GuysFromRolla.com.