Compartir a través de


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

  1. 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.

  2. Haga clic con el botón secundario en la carpeta App_Data y, a continuación, haga clic en Agregar nuevo elemento.

  3. 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.

  4. 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.

  5. Haga clic en Agregar nueva tabla.

  6. 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

  7. Guarde la tabla y asígnele el nombre BookReviews.

  8. 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

  1. 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.

  2. Haga clic con el botón secundario del mouse en la carpeta App_Code y, a continuación, haga clic en Agregar nuevo elemento.

  3. 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.

  4. 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.

  5. Guarde el archivo Reviews.dbml.

  6. 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.

  7. 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

  1. En Visual Studio, cree una nueva página web ASP.NET y cambie a la vista Código fuente.

  2. 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.

  3. Establezca la propiedad ContextTypeName en ReviewsDataContext.

  4. Establezca la propiedad TableName en BookReviews.

  5. 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

  1. 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.

  2. Establezca la propiedad DataSourceID en LinqDataSource1.

  3. Establezca la propiedad DataKeyNames en BookID.

    Debe establecer la propiedad DataKeyNames si desea usar el control DetailsView para actualizar o eliminar datos.

  4. Establezca la propiedad AllowPaging en true.

  5. 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.

  6. Guarde los cambios.

  7. Presione CTRL+F5 para ver la página en un explorador.

    El control DetailsView muestra las columnas del registro actual de la tabla BookReviews.

  8. 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

  1. Presione CTRL+F5 para ver la página en un explorador.

  2. Seleccione un registro y, a continuación, haga clic en el vínculo Editar. No actualice todavía el registro.

  3. En el Explorador de servidores, haga clic con el botón secundario en la tabla BookReviews y haga clic en Mostrar datos de tabla.

  4. Cambie un valor en el mismo registro que abrió en el explorador web.

  5. 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.

  6. En el explorador web, cambie un valor en el registro para actualizarlo.

  7. 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:

Vea también

Conceptos

Información general sobre el control de servidor web LinqDataSource

Referencia

LinqDataSource