Tutorial: Usar una marca de tiempo con el control LinqDataSource para comprobar la integridad de los datos
Actualización: noviembre 2007
En este tutorial, obtendrá información sobre cómo usar una marca de tiempo con un control LinqDataSource para comprobar si existen conflictos de datos al actualizar datos. El control LinqDataSource almacena el valor de marca de tiempo en la página web. Cuando el usuario actualiza o elimina datos, el control LinqDataSource comprueba el valor de marca de tiempo con respecto al valor de marca de tiempo actual de la base de datos. Si el control LinqDataSource detecta que el valor en la columna de marca de tiempo ha cambiado, no actualiza ni elimina el registro. En este caso, otro proceso ha cambiado el registro. Lo que hace el control LinqDataSource es provocar una excepción que indica que el registro ha cambiado.
SQL Server actualiza automáticamente una columna de marca de tiempo cada vez que se modifica el registro. Para obtener más información, vea Timestamp (Transact-SQL). En la clase de entidad, una columna de marca de tiempo se marca mediante el establecimiento de la propiedad IsVersion en true.
Si no usa una columna de marca de tiempo, el control LinqDataSource comprueba la simultaneidad de los datos mediante el almacenamiento de los valores en la página web. Los valores de simultaneidad constan de columnas que se usan como clave principal en la tabla o que se marca con UpdateCheck.Always o con UpdateCheck.WhenUpdated en la propiedad UpdateCheck del atributo ColumnAttribute. LINQ to SQL comprueba esos valores con respecto a la base de datos antes de actualizar o eliminar los datos. Este enfoque puede crear una página web de gran tamaño si el registro de datos contiene muchas columnas o valores de columna grandes. También puede representar un riesgo para la seguridad si el registro contiene datos que no desea exponer en la página.
Usará Diseñador relacional de objetos para crear una clase que represente la tabla de base de datos. El control LinqDataSource interactuará con esta clase generada para recuperar, actualizar, insertar y eliminar los datos.
Requisitos previos
Para implementar los procedimientos en su propio entorno de desarrollo, necesitará:
Visual Web Developer Express o Visual Studio 2008.
SQL Server Express Edition instalado en el equipo. Si tiene SQL Server instalado, puede usarlo, pero debe realizar pequeños ajustes en algunos procedimientos.
Un sitio Web de ASP.NET.
Crear una tabla de base de datos
Para realizar los pasos de este tutorial, debe disponer de una tabla de base de datos que contenga una columna de marca de tiempo. Si todavía no cuenta con una tabla así, puede crear una siguiendo los pasos del procedimiento siguiente. Si usa una tabla existente, los pasos en algunos de los procedimientos no coincidirán exactamente con la base de datos. Sin embargo, los conceptos ilustrados en el tutorial serán los mismos.
Para crear una tabla de base de datos con una columna de marca de tiempo
Si el sitio web no tiene todavía una carpeta App_Data, en el Explorador de soluciones, haga clic con el botón secundario en el proyecto, haga clic en Agregar carpeta ASP.NET y, a continuación, en App_Data.
Haga clic con el botón secundario en la carpeta App_Data y, a continuación, haga clic en Agregar nuevo elemento.
En Plantillas instaladas, seleccione Base de datos de SQL, cambie el nombre de archivo a Reviews.mdf y, a continuación, haga clic en Agregar.
En el Explorador de servidores, abra el nodo Reviews.mdf y, a continuación, haga clic con el botón secundario en la carpeta Tablas.
Haga clic en Agregar nueva tabla.
Cree las columnas siguientes en la tabla:
Nombre de columna
Tipo de datos
Propiedades
BookID
int
IsIdentity = Sí
Not null
Clave principal
Title
nvarchar(50)
Author
nvarchar(50)
RecommendToBookGroup
bit
Not null
Review
nvarchar(1000)
Marca de hora
timestamp
Not null
Guarde la tabla y asígnele el nombre BookReviews.
Agregue varios registros a la tabla BookReviews con datos de ejemplo.
En el Explorador de servidores, haga clic con el botón secundario en la tabla BookReviews y haga clic en Mostrar datos de tabla. No tiene que especificar un valor para BookID ni Timestamp porque los genera la base de datos.
Crear clases para representar entidades de base de datos
Para trabajar con el control LinqDataSource, trabaja con clases que representan entidades de base de datos. Puede usar una herramienta de Visual Web Developer Express o Visual Studio 2008 para crear estas clases.
Para crear una clase para la tabla BookReviews
Si el sitio web no tiene todavía una carpeta App_Code, en el Explorador de soluciones, haga clic con el botón secundario en el proyecto, haga clic en Agregar carpeta ASP.NET y, a continuación, en App_Code.
Haga clic con el botón secundario del mouse en la carpeta App_Code y, a continuación, haga clic en Agregar nuevo elemento.
En Plantillas instaladas, seleccione LINQ a clases SQL, cambie el nombre del archivo a Reviews.dbml y, a continuación, haga clic en Agregar.
Se muestra la ventana Diseñador relacional de objetos.
En el Explorador de servidores, arrastre la tabla BookReviews a la ventana Diseñador relacional de objetos.
La tabla BookReviews y sus columnas se representan como una entidad denominada BookReview en la ventana del diseñador.
Guarde el archivo Reviews.dbml.
En el Explorador de soluciones, abra el archivo Reviews.designer.cs o Reviews.designer.vb.
La entidad tiene ahora las clases denominadas ReviewsDataContext y BookReview. Los atributos de columna de todas las columnas se marcan con UpdateCheck=UpdateCheck.Never. Sin embargo, el atributo de columna de la columna de marca de tiempo se marca con IsVersion=true.
Cierre el archivo Reviews.dbml.
Crear y configurar un control LinqDataSource
Ahora cuenta con una tabla de base de datos y clases que representan entidades de base de datos. Puede usar un control LinqDataSource en una página web ASP.NET para administrar los datos que se van a mostrar y actualizar.
Para crear y configurar un control LinqDataSource
En Visual Studio, cree una nueva página web ASP.NET y cambie a la vista Código fuente.
En la ficha Datos del Cuadro de herramientas, arrastre un control LinqDataSource y colóquelo dentro del elemento form en la página Web.
Puede dejar la propiedad ID como LinqDataSource1.
Establezca la propiedad ContextTypeName en ReviewsDataContext.
Establezca la propiedad TableName en BookReviews.
Establezca las propiedades EnableUpdate y EnableDelete en true.
En el ejemplo siguiente se muestra el código declarativo del control LinqDataSource.
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="BookReviews" EnableUpdate="true" EnableDelete="true" ID="LinqDataSource1" > </asp:LinqDataSource>
Agregar un control para mostrar y actualizar datos
Ahora puede agregar un control DetailsView y enlazarlo al control LinqDataSource. El control DetailsView permite a los usuarios mostrar y actualizar datos administrados por el control LinqDataSource.
Para enlazar un control DetailsView a los datos del control LinqDataSource
En la ficha Datos del Cuadro de herramientas, haga doble clic en el control DetailsView para agregarlo a la página.
Puede dejar la propiedad ID como DetailsView1.
Establezca la propiedad DataSourceID en LinqDataSource1.
Establezca la propiedad DataKeyNames en BookID.
Debe establecer la propiedad DataKeyNames si desea usar el control DetailsView para actualizar o eliminar datos.
Establezca la propiedad AllowPaging en true.
Establezca las propiedades AutoGenerateEditButton y AutoGenerateDeleteButton en true.
En el siguiente ejemplo se muestra el marcado declarativo.
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="BookID" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" AllowPaging="true" ID="DetailsView1" > </asp:DetailsView>
En la base de datos BookReviews, las columnas BookID y Timestamp se establecen automáticamente. Los usuarios no pueden cambiar sus valores.
Guarde los cambios.
Presione CTRL+F5 para ver la página en un explorador.
El control DetailsView muestra las columnas del registro actual de la tabla BookReviews.
Cierre el explorador.
Comprobar si existen conflictos de datos
Para ver cómo la columna de marca de tiempo evita las actualizaciones cuando han cambiado los datos, puede realizar una prueba. Seleccionará un registro para actualizar en una página web pero cambiará ese mismo registro fuera de la página web. Al enviar la actualización a través de la página web, el control LinqDataSource la bloqueará.
Para probar la integridad de datos
Presione CTRL+F5 para ver la página en un explorador.
Seleccione un registro y, a continuación, haga clic en el vínculo Editar. No actualice todavía el registro.
En el Explorador de servidores, haga clic con el botón secundario en la tabla BookReviews y haga clic en Mostrar datos de tabla.
Cambie un valor en el mismo registro que abrió en el explorador web.
Cierre la ventana para escribir el cambio en la base de datos.
Cuando el cambio se guarda, SQL Server actualiza automáticamente la columna de marca de tiempo del registro.
En el explorador web, cambie un valor en el registro para actualizarlo.
Haga clic en el vínculo Actualizar.
Verá un mensaje de error donde se indica que la fila ha cambiado. La marca de tiempo guardada en la página no coincide con la marca de tiempo del registro en la base de datos.
Si desea realizar una acción cuando se muestre este error, puede crear un controlador para el evento Updating.
Pasos siguientes
En este tutorial, ha visto cómo se optimizan las comprobaciones de la integridad de la información al usar el control LinqDataSource. Puede aprovechar las funciones del control LinqDataSource de las maneras siguientes:
Crear un controlador de eventos para administrar la excepción que se provoca al cambiar los datos. Para obtener más información, vea los eventos Updating o Deleting.
Filtrar los registros de datos que se devuelven. Al no especificar un valor para la propiedad Select, el control LinqDataSource recupera todas las columnas de la tabla de base de datos. Podría desear seleccionar un subconjunto de columnas si no muestra todas las columnas en el control DetailsView. Para obtener más información, vea Tutorial: Seleccionar y filtrar un subconjunto de datos con los controles LinqDataSource y GridView.
Agrupar datos y agregar valores, como calcular la suma o la media de valores de columna. Para obtener más información, vea Cómo: Agrupar y agregar datos utilizando el control LinqDataSource.
Vea también
Conceptos
Información general sobre el control de servidor web LinqDataSource