Compartir a través de


Tipos de cursores

Los cursores de Microsoft SQL Server Compact 4.0 son similares a los utilizados en SQL Server. En esta sección se describen las diferencias entre ellos. Para obtener una explicación completa de los cursores de base de datos, vea los Libros en pantalla de SQL Server.

SQL Server Compact 4.0 admite los siguientes tipos de cursores:

  • Tabla base

  • Estáticos

  • Solo avance

  • Solo avance o solo lectura

  • Dirigidos por conjuntos de claves

Cursores de tabla base

Los cursores de tabla base constituyen el nivel inferior de cursor disponible. Estos cursores funcionan directamente con el motor de almacenamiento y son los más rápidos de todos los admitidos. Los cursores de tabla base pueden desplazarse hacia adelante o hacia atrás con un costo mínimo, y se pueden actualizar.

También se puede abrir un cursor directamente en un índice. Los índices se admiten para ordenar las filas de una tabla, habilitar las búsquedas de valores específicos y restringir las filas en función de un intervalo de valores dentro de un índice.

Los cursores de tabla base tienen pertenencia dinámica. En este tipo de pertenencia, dos cursores abiertos sobre la misma tabla pueden de forma inmediata ver inserciones, eliminaciones y modificaciones de los datos, en el supuesto de que ambos se encuentren en el mismo ámbito de transacción. Puesto que es posible actualizar los cursores de tabla base, un cliente puede utilizarlos para realizar cambios en los datos subyacentes.

Los cursores de tabla base no pueden representar el resultado de una consulta. Mediante un cursor de tabla base no se devuelven resultados de consultas, como SELECT * FROM tablename. En su lugar, se utiliza uno de los cursores de resultado de consulta admitidos.

A continuación, se ofrece un ejemplo de cómo obtener un cursor de tabla base mediante ADO .NET:

//Base Table Cursor

cmd.CommandText = "tablename";

cmd.CommandType = CommandType.TableDirect;

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);

A continuación, se ofrece un ejemplo de cómo obtener un cursor de índice mediante ADO .NET:

cmd.CommandText = "tablename";

cmd.IndexName = "indexname";

cmd.CommandType = CommandType.TableDirect;

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);

Cursores estáticos

Un cursor estático, denominado cursor de consulta desplazable en versiones anteriores de SQL Server Compact 4.0, crea y almacena una copia completa del conjunto de resultados. La excepción a esto son los datos de valor largo que se recuperan cuando un usuario los solicita expresamente. Este conjunto de resultados solo se llena cuando es necesario. En SQL Server es diferente, ya que el conjunto de resultados se llena en el momento de crear el cursor. Los cursores estáticos admiten el desplazamiento hacia atrás y hacia adelante, pero no las actualizaciones. Los cursores estáticos no ven los cambios externos en los datos inapropiados. Los resultados de la consulta se almacenan en caché durante la vigencia del cursor. Aunque los cursores estáticos son más funcionales que los cursores de solo avance, también son más lentos y utilizan más memoria. Se recomienda tener en cuenta los cursores estáticos únicamente si el desplazamiento es necesario y un cursor de conjunto de claves no es adecuado.

A continuación se incluye un ejemplo de cómo obtener un cursor estático utilizando ADO.NET:

cmd.CommandText = "Select * from tablename";

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Insensitive);

Cursores de solo avance

El cursor de solo avance es el más rápido que se puede actualizar, pero no admite el desplazamiento. Solo admite la captura de filas en serie desde el principio hasta el final del cursor. Las filas no se obtienen en la base de datos hasta que se capturan. Los efectos de todas las instrucciones INSERT, UPDATE y DELETE realizadas por el usuario actual o confirmadas por otros usuarios que afecten a las filas del conjunto de resultados se pueden ver cuando se capturan las filas en el cursor. Como el cursor no se puede desplazar hacia atrás, los cambios realizados en las filas de la base de datos tras capturar la fila no se pueden ver utilizando el cursor.

Los cursores de solo avance y de solo avance o solo lectura son los cursores más rápidos basados en consultas. Deben utilizarse en aquellos casos en que lo más importante sea la velocidad y la memoria.

A continuación, se ofrece un ejemplo de cómo obtener un cursor de solo avance mediante ADO .NET:

cmd.CommandText = "Select * from tablename";

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);

Cursores de solo avance y solo lectura

Los cursores de solo avance o solo lectura, denominados cursores de solo avance en versiones anteriores de SQL Server Compact 4.0, son los cursores más rápidos, pero no se pueden actualizar.

A continuación se incluye un ejemplo de cómo obtener un cursor de solo avance o solo lectura utilizando ADO.NET:

cmd.CommandText = "Select * from tablename";

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.None);

Nota No se pueden crear cursores de solo lectura en consultas que devuelven únicamente columnas de solo lectura, ya que internamente todos los cursores de SQL Server Compact 4.0 se pueden actualizar. SQL Server Compact 4.0 no puede actualizar las columnas de solo lectura devueltas en SqlCeResultSet. Por lo tanto, se produciría el error "No se puede generar un cursor actualizable para la consulta porque no hay una columna actualizable".

Cursores controlados por conjunto de claves

El cursor controlado por conjunto de claves de SQL Server Compact 4.0 es un cursor desplazable que se puede actualizar. Este tipo de cursor está controlado por un conjunto de identificadores físicos conocidos como conjunto de claves. El conjunto de claves se basa en todas las filas válidas para la instrucción SELECT en el momento de apertura del cursor. El conjunto de claves se crea en una tabla temporal al abrir el cursor. En un cursor controlado por conjunto de claves, la pertenencia se determina en el momento de ejecutar la consulta.

Los cursores controlados por conjuntos de claves de SQL Server Compact 4.0 son ligeramente diferentes de los de SQL Server. En SQL Server, el cursor controlado por conjunto de claves utiliza un conjunto de identificadores únicos como claves del conjunto de claves. En SQL Server Compact 4.0, las claves son marcadores de la ubicación de almacenamiento lógico de los valores en una tabla. No son identificadores únicos.

Aunque el cursor controlado por conjunto de claves es sensible a diferentes cambios, no lo es tanto como otros cursores. Por ejemplo, una inserción fuera del cursor no se verá, pero las inserciones dentro del cursor se verán al final. En este caso, se recomienda que cierre y vuelva a abrir el cursor, o utilice uno de los cursores de solo avance.

Puesto que SQL Server Compact 4.0 utiliza marcadores para definir un conjunto de claves, todos los cambios en los valores de datos para las filas incluidas en el conjunto de claves se pueden ver utilizando el cursor. Esto es aplicable a los cambios realizados tanto dentro como fuera del cursor.

Las eliminaciones en un cursor de conjuntos de claves, ya sea dentro o fuera del cursor, causarán que se indique que la fila se ha eliminado si se intenta capturarla.

A continuación, se ofrece un ejemplo de cómo obtener un cursor controlado por conjunto de claves mediante ADO .NET:

cmd.CommandText = "Select * from tablename";

SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);

Trabajar con combinaciones

Si la consulta que se utiliza para abrir un cursor controlado por conjunto de claves incluye columnas combinadas, éstas no se pueden actualizar. El usuario puede insertar nuevos valores en ellas, pero no se admiten actualizaciones.

Si se utiliza el conjunto de claves para rellenar un control actualizable por el usuario, como un objeto DataGrid, los usuarios pueden intentar actualizar los valores del control y la actualización producirá un error. Si está desarrollando una aplicación en la que se utiliza DataGrid para mostrar datos de columnas combinadas, asegúrese de configurar las columnas combinadas de DataGrid en solo lectura.

Vea también

Conceptos

Cursores (SQL Server Compact)

Elegir un tipo de cursor

Cursores y bloqueo

Conversiones de cursor implícitas

Actualizar cursores controlados por conjunto de claves