Seleccionar datos mediante el control SqlDataSource
Actualización: noviembre 2007
Puede utilizar el control SqlDataSource para recuperar datos de una base de datos empleando muy poco o ningún código. El control SqlDataSource se puede utilizar con cualquier base de datos que disponga de un proveedor ADO.NET asociado establecido en la sección DbProviderFactories de la configuración, entre los que se incluyen Microsoft SQL Server, Oracle, ODBC o bases de datos OLE DB como Microsoft Access. La base de datos que utilice determinará la sintaxis de las instrucciones SQL para las que debe configurar el control SqlDataSource y si puede utilizar características de bases de datos más avanzadas, como los procedimientos almacenados. Sin embargo, el control de origen de datos funciona de la misma manera para todas las bases de datos.
Para poder recuperar datos de una base de datos mediante el control SqlDataSource, debe establecer al menos las siguientes propiedades:
ProviderName Establézcala en el nombre del proveedor ADO.NET que representa la base de datos con la que está trabajando. Si está trabajando con Microsoft SQL Server, establezca la propiedad ProviderName en "System.Data.SqlClient"; si está trabajando con una base de datos de Oracle, establezca la propiedad ProviderName en "System.Data.OracleClient"; y así sucesivamente.
ConnectionString Establézcala en una cadena de conexión que sea apropiada para su base de datos.
SelectCommand Establézcala en una consulta SQL o en un procedimiento almacenado que devuelva datos de la base de datos. La consulta que establezca para la propiedad SelectCommand es la misma que la establecida para la propiedad CommandText de un objeto IDbCommand de ADO.NET al escribir código de acceso a datos de ADO.NET. La sintaxis real de la consulta SQL depende del esquema de los datos y de la base de datos que se esté utilizando.
En las secciones siguientes se describen estas propiedades más detalladamente.
Especificar un nombre de proveedor
Establezca la propiedad ProviderName en el nombre del proveedor ADO.NET asociado con el tipo de base de datos en el que están almacenados los datos. La lista de proveedores permitidos está registrada en la sección DbProviderFactories del archivo de configuración, ya sea en el archivo Machine.config o en el archivo Web.config. De forma predeterminada, el control SqlDataSource utiliza el proveedor ADO.NET System.Data.SqlClient, que corresponde a Microsoft SQL Server. Por consiguiente, si se conecta a una base de datos de SQL Server, no necesita especificar de forma explícita un proveedor. Sin embargo, también puede especificar los proveedores System.Data.OracleClient, System.Data.Odbc u System.Data.OleDb. Para obtener más información, vea ADO.NET.
Nota: |
---|
No establezca la propiedad ProviderName en el valor de un proveedor ADO no administrado, como SQLOLEDB o MSDAORA. |
Especificar una cadena de conexión
Establezca la propiedad ConnectionString en una cadena de conexión que se utilice para una base de datos determinada. Sin embargo, establecer la propiedad ConnectionString de un control SqlDataSource en una cadena de conexión específica no es una estrategia aconsejable para sitios de gran tamaño. Además, dicha cadena se almacena como texto sin formato en la página ASP.NET. Para facilitar el mantenimiento y mejorar la seguridad de las aplicaciones Web, se recomienda almacenar las cadenas de conexión en el elemento connectionStrings del archivo de configuración de la aplicación. De esta forma, se puede hacer referencia a la cadena de conexión almacenada mediante una expresión de conexión como la del ejemplo siguiente:
<asp:SqlDataSource
ID="SqlDataSource1"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>
Para obtener seguridad adicional, puede cifrar el contenido de la sección de configuración <connectionStrings>. Para obtener más información, vea Cifrar y descifrar secciones de configuración.
Especificar el comando Select
Puede especificar una consulta SQL para que la ejecute el control SqlDataSource estableciendo la propiedad SelectCommand. En el ejemplo siguiente se muestra una consulta SQL que recupera un conjunto de resultados consistente en los apellidos de todos los empleados de la tabla Employees:
SELECT LastName FROM Employees;
En el ejemplo de código siguiente se muestra cómo establecer las propiedades ConnectionString y SelectCommand de un control SqlDataSource para mostrar los datos de los empleados en un control GridView:
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
Si la base de datos con la que trabaja admite el uso de procedimientos almacenados, puede establecer la propiedad SelectCommand en el nombre del procedimiento almacenado y la propiedad SelectCommandType en StoredProcedure para indicar que la propiedad SelectCommand hace referencia a un procedimiento almacenado. En el ejemplo siguiente se muestra un procedimiento almacenado sencillo que puede crear en SQL Server:
CREATE PROCEDURE sp_GetAllEmployees AS
SELECT * FROM Employees;
GO
Si desea configurar el control SqlDataSource para que utilice este procedimiento almacenado, establezca el texto SelectCommand en "sp_GetAllEmployees" y la propiedad SelectCommandType en StoredProcedure.
La mayoría de los procedimientos almacenados utilizan parámetros. Para obtener más información sobre el uso de procedimientos almacenados con parámetros, vea Utilizar parámetros con el control SqlDataSource.
En tiempo de ejecución, el control SqlDataSource envía el texto de la propiedad SelectCommand a la base de datos y ésta devuelve el resultado de la consulta o el procedimiento almacenado a dicho control. Los controles Web enlazados al control de origen de datos muestran el conjunto de resultados en la página ASP.NET.
Pasar parámetros a las instrucciones SQL
Los usuarios interactúan a menudo con datos basados en parámetros que sólo se pueden resolver o evaluar en tiempo de ejecución. Por ejemplo, los datos mostrados en una página Web ASP.NET podrían representar un informe para una fecha concreta. Si el usuario selecciona otra fecha, los datos del informe también podrían cambiar. Tanto si es el usuario quien modifica la fecha de forma explícita como si lo hace la aplicación Web mediante programación, es posible conseguir que la consulta SQL que se envía a la base de datos sea más flexible y tenga un mantenimiento más fácil si es una consulta SQL parametrizada, en la que los elementos de la instrucción SQL están enlazados a variables de la aplicación Web y se evalúan en tiempo de ejecución.
El control SqlDataSource admite el uso de consultas SQL parametrizadas si los parámetros que se agregan a la colección SelectParameters se asocian a marcadores de posición en la consulta SelectCommand. Los valores de los parámetros se pueden obtener de otro control de la página, del estado de la sesión, del perfil de usuario y de otros elementos. Para obtener más información, vea Utilizar parámetros con el control SqlDataSource.
La sintaxis utilizada para los marcadores de posición varía dependiendo del tipo de la base de datos. Si utiliza SQL Server, el nombre del parámetro comienza por el carácter '@' y su nombre se corresponde con el nombre del objeto Parameter de la colección SelectParameters. Si trabaja con una base de datos ODBC u OLE DB, no se asigna nombre a los parámetros de una instrucción parametrizada; en su lugar, se especifican con el carácter marcador de posición '?'.
En el ejemplo siguiente se muestra cómo una consulta SQL parametrizada recupera todos los pedidos de la base de datos Northwind de SQL Server, basándose en el id. del empleado conectado actualmente.
SELECT * FROM Orders WHERE EmployeeID = @empid
En este ejemplo, la expresión @empid es el parámetro que se evalúa en tiempo de ejecución.
En el ejemplo de código siguiente se muestra una consulta SQL parametrizada que toma el valor del parámetro de otro control de la página:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<p><asp:dropdownlist
id="DropDownList1"
autopostback="True">
<asp:listitem selected="True">Sales Representative</asp:listitem>
<asp:listitem>Sales Manager</asp:listitem>
<asp:listitem>Vice President, Sales</asp:listitem>
</asp:dropdownlist></p>
<asp:sqldatasource
id="SqlDataSource1"
connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
<selectparameters>
<asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
</selectparameters>
</asp:sqldatasource>
<p><asp:listbox
id="ListBox1"
datasourceid="SqlDataSource1"
datatextfield="LastName">
</asp:listbox></p>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<p><asp:dropdownlist
id="DropDownList1"
autopostback="True">
<asp:listitem selected="True">Sales Representative</asp:listitem>
<asp:listitem>Sales Manager</asp:listitem>
<asp:listitem>Vice President, Sales</asp:listitem>
</asp:dropdownlist></p>
<asp:sqldatasource
id="SqlDataSource1"
connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
<selectparameters>
<asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
</selectparameters>
</asp:sqldatasource>
<p><asp:listbox
id="ListBox1"
datasourceid="SqlDataSource1"
datatextfield="LastName">
</asp:listbox></p>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<p><asp:DropDownList
id="DropDownList1"
AutoPostBack="True">
<asp:ListItem Selected="True">Sales Representative</asp:ListItem>
<asp:ListItem>Sales Manager</asp:ListItem>
<asp:ListItem>Vice President, Sales</asp:ListItem>
</asp:DropDownList></p>
<asp:SqlDataSource
id="SqlDataSource1"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
<SelectParameters>
<asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</SelectParameters>
</asp:SqlDataSource>
<p><asp:ListBox
id="ListBox1"
DataSourceID="SqlDataSource1"
DataTextField="LastName">
</asp:ListBox></p>
</form>
</body>
</html>
Para obtener más información sobre el uso de parámetros con el control SqlDataSource, vea Utilizar parámetros con el control SqlDataSource. Para obtener más información general sobre el uso de parámetros de origen de datos, vea Utilizar parámetros con controles de origen de datos.
Especificar cómo se devuelven los datos
La propiedad DataSourceMode del control SqlDataSource determina cómo mantiene los datos dicho control SqlDataSource. De forma predeterminada, la propiedad DataSourceMode se establece en DataSet, lo que significa que el control SqlDataSource almacena en la memoria del servidor el conjunto de resultados devuelto de la base de datos. Cuando el control SqlDataSource recupera los datos en el modo DataSet, los controles enlazados a datos asociados, como GridView y DetailsView, pueden ofrecer características de presentación de datos enriquecidos, como la ordenación y la paginación automáticas.
Opcionalmente, puede establecer la propiedad DataSourceMode en DataReader, lo que significa que el conjunto de resultados no se almacena en memoria. En aquellos escenarios en los que no es necesario conservar un conjunto de resultados en la memoria del servidor, utilice el modo DataReader.
En el ejemplo de código siguiente se muestra cómo establecer la propiedad DataSourceMode del control SqlDataSource en DataReader para un escenario que no requiere ordenación, paginación o filtros.
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
Agregar procesos personalizados utilizando eventos del control SqlDataSource
El control SqlDataSource expone eventos que puede controlar para que ejecuten su propio código antes y después de que el control realice una operación de recuperación de datos.
El control SqlDataSource produce el evento Selecting antes de llamar al método Select para ejecutar la consulta SQL establecida en la propiedad SelectCommand. Puede controlar el evento Selecting para examinar la consulta SQL antes de que se ejecute y para validar los parámetros incluidos en la colección SelectParameters o para realizar tareas adicionales antes de la recuperación de datos. Por ejemplo, si utiliza un objeto FormParameter con el control SqlDataSource, podría controlar el evento Selecting para validar el valor del parámetro antes de recuperar los datos. (El objeto FormParameter toma el valor expuesto en un elemento HTML y lo envía a la base de datos sin efectuar ninguna validación.) Si el valor no es aceptable, puede cancelar la consulta estableciendo la propiedad Cancel del objeto SqlDataSourceSelectingEventArgs en true.
El control SqlDataSource produce el evento Selected una vez recuperados los datos. El evento Selected se puede para determinar si se ha producido una excepción durante la operación de base de datos o para examinar los valores devueltos por la operación de datos.
Mostrar los datos
Para mostrar los datos en una página ASP.NET, utilice controles enlazados a datos, como GridView, DetailsView o FormView, o controles como ListBox o DropDownList. El control enlazado a datos actúa como un consumidor de los datos recuperados por el control SqlDataSource. Establezca la propiedad DataSourceID del control enlazado a datos en el identificador del control SqlDataSource. Cuando se represente la página, el control SqlDataSource recuperará los datos y los pondrá a disposición del control enlazado a datos, que a su vez los mostrará. Para obtener más información sobre los controles enlazados a datos y su uso junto con los controles de origen de datos para mostrar datos, vea Información general sobre los controles de servidor Web ASP.NET enlazados a datos.
En el ejemplo de código siguiente se indica cómo mostrar los resultados de la consulta mediante un control GridView.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" >
<asp:SqlDataSource
id="SqlDataSource1"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>