martes, 17 de agosto de 2010
martes, 10 de agosto de 2010
martes, 20 de julio de 2010
lunes, 19 de julio de 2010
miércoles, 14 de julio de 2010
martes, 13 de julio de 2010
martes, 6 de julio de 2010
lunes, 5 de julio de 2010
miércoles, 30 de junio de 2010
lunes, 28 de junio de 2010
miércoles, 23 de junio de 2010
martes, 22 de junio de 2010
lunes, 21 de junio de 2010
lunes, 14 de junio de 2010
lunes, 7 de junio de 2010
Manual de Mysql 5
Algunos de los temas en el manual:
- Información General
- Instalar MySQL
- Tutorial de MySQL
- Usar los programas de MySQL
- Administración de Base de Datos
- Replicación en MySQL, etc
http://rapidshare.com/files/396343677/Manual_de_MySql.pdf
- Información General
- Instalar MySQL
- Tutorial de MySQL
- Usar los programas de MySQL
- Administración de Base de Datos
- Replicación en MySQL, etc
http://rapidshare.com/files/396343677/Manual_de_MySql.pdf
Tutorial de Erwin
Descargar libro de la sgte dirección:
http://rapidshare.com/files/396341996/ldErwin.PDF
http://rapidshare.com/files/396341996/ldErwin.PDF
Base de Datos con SQL Server 200
El texto está diseñado para programadores, analistas o técnicos de sistemas que deseen conocer la mecánica de trabajo de las bases de datos a través del uso de una de ellas en concreto: Microsoft SQL Server 2000.
Aspectos que se revisan:
1- Conceptos teóricos sobre Bases de Datos.
2- Diseño y modelización de datos tomando como base el modelo Entidad/Relación
3- Generalidades de SQL Server 2000
4- Lenguaje SQL a través de la implementación del mismo en SQL Server 2000 (Transact SQL)
5- Ejemplos de diseño utilizando una herramienta CASE: Power Designor
Aspectos que se revisan:
1- Conceptos teóricos sobre Bases de Datos.
2- Diseño y modelización de datos tomando como base el modelo Entidad/Relación
3- Generalidades de SQL Server 2000
4- Lenguaje SQL a través de la implementación del mismo en SQL Server 2000 (Transact SQL)
5- Ejemplos de diseño utilizando una herramienta CASE: Power Designor
Procedimientos almacenados en Mysql 5
Hoy, mientras leía mensajes del correo antiguo rescaté unos apuntes de un curso de programación que hice el pasado verano. Los apuntes eran de MySQL 5, más específicamente de cómo hacer procedimientos almacenados , triggers , handlers, funciones y toda esa parafernalia que MySQL implementa en su versión 5.
MySQL ha sido siempre un motor de bases de datos muy rápido y muy utilizado para proyectos open source de código abierto, sobre todo para proyectos web dada su gran velocidad. Pero también a sido muy criticado por la falta de características avanzadas que otros Sistemas Gestores de Bases de Datos , como Oracle, SQLServer de Microsoft o PostgreSQL si tenían. Estas características avanzadas son sobre todo los procedimientos almacenados, triggers, transacciones y demás cosas.
MySQL, que ahora forma parte de Sun, se puso las pilas y en su versión 5 implementó muchas de estas características, dejando un SGBD muy rápido y además muy bien preparado para implementar bases de datos realmente grandes y mantenibles.
Pero, ¿qué es realmente un procedimiento almacenado? Pues es un programa que se almacena físicamente en una tabla dentro del sistema de bases de datos. Este programa esta hecho con un lenguaje propio de cada Gestor de BD y esta compilado, por lo que la velocidad de ejecución será muy rápida.
Principales Ventajas :
- Seguridad:Cuando llamamos a un procedimiento almacenado, este deberá realizar todas las comprobaciones pertinentes de seguridad y seleccionará la información lo más precisamente posible, para enviar de vuelta la información justa y necesaria y que por la red corra el mínimo de información, consiguiendo así un aumento del rendimiento de la red considerable.
- Rendimiento: el SGBD, en este caso MySQL, es capaz de trabajar más rápido con los datos que cualquier lenguaje del lado del servidor, y llevará a cabo las tareas con más eficiencia. Solo realizamos una conexión al servidor y este ya es capaz de realizar todas las comprobaciones sin tener que volver a establecer una conexión. Esto es muy importante, una vez leí que cada conexión con la BD puede tardar hasta medios segundo, imagínate en un ambiente de producción con muchas visitas como puede perjudicar esto a nuestra aplicación… Otra ventaja es la posibilidad de separar la carga del servidor, ya que si disponemos de un servidor de base de datos externo estaremos descargando al servidor web de la carga de procesamiento de los datos.
- Reutilización: el procedimiento almacenado podrá ser invocado desde cualquier parte del programa, y no tendremos que volver a armar la consulta a la BD cada que vez que queramos obtener unos datos.
Desventajas:
El programa se guarda en la BD, por lo tanto si se corrompe y perdemos la información también perderemos nuestros procedimientos. Esto es fácilmente subsanable llevando a cabo una buena política de respaldos de la BD.
Tener que aprender un nuevo lenguaje… esto es siempre un engorro, sobre todo si no tienes tiempo.
¿Alguna otra?
Por lo tanto es recomendable usar procedimientos almacenados siempre que se vaya a hacer una aplicación grande, ya que nos facilitará la tarea bastante y nuestra aplicación será más rápida.
Vamos a ver un ejemplo :
Abrimos una consola de MySQL seleccionamos una base de datos y empezamos a escribir:
Vamos a crear dos tablas en una almacenaremos las personas mayores de 18 años y en otra las personas menores.
CREATE TABLE ninos(edad int, nombre varchar(50)); CREATE TABLE adultos(edad int, nombre varchar(50));
Imagínate que ahora queremos introducir personas en las tablas pero dependiendo de la edad queremos que se introduzcan en una tabla u otra, si estamos usando PHP podríamos comprobar mediante código si la persona es mayor de edad. Lo haríamos así:
$nombre = $_POST[‘nombre’]; $edad = $_POST[‘edad’]; if($edad < 18){ mysql_query(‘insert into ninos values(’ . $edad . ‘ , “’.$nombre.’”)’); }else{ mysql_query(‘insert into adultos values(’ . $edad . ‘ , “’.$nombre.’”)’); }
Si la consulta es corta como en este caso, esta forma es incluso más rápida que tener que crear un procedimiento almacenado, pero si tienes que hacer esto muchas veces a lo largo de tu aplicación es mejor hacer lo siguiente:
Creamos el procedimiento almacenado:
delimiter // CREATE procedure introducePersona(IN edad int,IN nombre varchar(50)) begin IF edad < 18 then INSERT INTO ninos VALUES(edad,nombre); else INSERT INTO adultos VALUES(edad,nombre); end IF; end; //
Ya tenemos nuestro procedimiento , vamos a por una visión más detallada…
La primera linea es para decirle a mySQL que a partir de ahroa hasta que no introduzcamos // no se acaba la sentencia, esto lo hacemos así por que en nuestro procedimiento almacenado tendremos que introducir el carcter “;” para las sentencias, y si pulamos enter MySQL pensará que ya hemos acabado la consulta y dará error.
Con create procedure empezamos la definición de procedimiento con nombre introducePersona. En un procedimiento almacenado existen parámetros de entrada y de salida, los de entrada (precedidos de “in”) son los que le pasamos para usar dentro del procedimiento y los de salida (precedidos de “out”) son variables que se establecerán a lo largo del procedimiento y una vez esta haya finalizado podremos usar ya que se quedaran en la sesión de MySQL.
En este procedimiento simple solo vamos usar de entrada, más adelante veremos como usar parámetros de salida.
Para hacer una llamada a nuestro procedimiento almacenado usaremos la sentencia call:
call introducePersona(25,”JoseManuel”);
Una vez tenemos ya nuestro procedimiento simplemente lo ejecutaremos desde PHP mediante una llamada como esta:
$nombre = $_POST['nombre']; $edad = $_POST['edad']; mysql_query(‘call introducePersona(’ . $edad . ‘ ,“ ’.$nombre.’ ”);’);
De ahora en adelante, usaremos siempre el procedimiento para introducir personas en nuestra BD de manera que si tenemos 20 scritps PHP que lo usan y un buen día decidimos que la forma de introducir personas no es la correcta, solo tendremos que modificar el procedimiento introducePersona y no los 20 scrits.
Como Redireccionar una Página de WordPress
Buenas, aquí les traigo otra técnica interesante para WordPress que nos permitirá redireccionar a cualquier URL desde una página de nuestro blog, existen plugins que hacen esto, pero para que usar uno si lo podemos hacer con una simples líneas y sin consumir nuestro ancho de banda (tal vez un poco pero no tanto al usar un plugin).
Esta técnica fue hecha por Dave Stewart y para usarla tenemos que crear una plantilla para usarla en la pagina que vamos a redireccionar, empecemos.
Paso 1:
Primero vamos a crear un archivo llamado template-redirect.php dentro de la carpeta de nuestro theme, por ejemplo, wordpress_root_directory/wp-content/themes/default/ y ahi debemos crear el archivo, quedándonos así ya con el archivo creado: wordpress_root_directory/wp-content/themes/default/template-redirect.php. Aun nos falta copiar las siguientes líneas al archivo recién creado con algún software, como por ejemplo, Adobe Dreamweaver o simplemente el Bloc de Notas que trae Windows.
Paso 2:Código HTML:/* Template Name: Page Redirect * @author Dave Stewart * @email dave@davestewart.co.uk * @web www.davestewart.co.uk * @name Page Redirect * @type PHP page * @desc Wordpress template that redirects the current page based on the content of the database entry it loads * @requires Wordpress * @install Copy this file to the directory of the theme you wish to use * usage 1. Create a new Page in your Wordpress control panel 2. Enter the URL (or local path, relative to your Wordpress directory) you want to redirect to as the only page content 3. Set the Page Template to "Page Redirect" 4. Publish */ if (function_exists('have_posts') && have_posts()){ while (have_posts()){ // get the post the_post(); // get content ob_start(); the_content(); $contents = ob_get_contents(); ob_end_clean(); // correctly build the link // grab the 'naked' link $link = strip_tags($contents); $link = preg_replace('/\s/', '', $link); // work out if(!preg_match('%^http://%', $link)){ $host = $_SERVER['HTTP_HOST']; $dir = dirname($_SERVER['PHP_SELF']); $link = "http://$host$dir/$link"; } // do the link header("Location: $link"); die(''); } } ?>
Ya creado el archivo con su respectivo código debemos ir a nuestro panel de administración en WordPress, de ahí tenemos que crear una nueva página para nuestro sitio, para ello, vamos a Páginas-> Crear y en la lista de Plantillas va a aparecer la que recién creamos, la elegimos y en el contenido ingresamos la URL donde queremos que se redireccione nuestra página al entrar.
Listo, solo nos queda probar si funciona yendo al inicio de nuestro blog y accediendo a la página creada, si funciona, se debería redireccionar a la URL indicada en el contenido de la pagina creada. Si no has podido o no sabes crear el archivo con su código, lo puedes bajar desde aquí.
Transacciones anidadas - MySQL
Las transacciones anidadas
Recordemos como funcionan las transacciones. Tenemos 4 sentencias que son:
• BEGIN TRAN: Comienza una transacción y aumenta en 1 @@TRANCOUNT
• COMMIT TRAN: Reduce en 1 @@TRANCOUNT, y si @@TRANCOUNT llega a 0 guarda la transacción
• ROLLBACK TRAN: Deshace la transacción actual, o si estamos en transacciones anidadas deshace la más externa y todas las internas. Además pone @@TRANCOUNT a 0
• SAVE TRAN: Guarda un punto (con nombre) al que podemos volver con un ROLLBACK TRAN si es que estamos en transacciones anidadas y no queremos deshacer todo hasta la más externa.
Un par de ejemplos dejarán las cosas más claras:
Uso del commit
Uso del rollback
En cuanto al SAVE TRAN podemos recordarlo con el siguiente ejemplo:
Un ROLLBACK a un SAVE TRAN no deshace la transacción en curso ni modifica @@TRANCOUNT, simplemente cancela lo ocurrido desde el ‘SAVE TRAN nombre‘ hasta su ‘ROLLBACK TRAN nombre’
Transacciones y procedimientos almacenados…
Cuando trabajamos con procedimientos almacenados debemos recordar que cada procedimiento almacenado es una unidad. Cuando se ejecuta lo hace de manera independiente de quien lo llama. Sin embargo si tenemos un ROLLBACK TRAN dentro de un procedimiento almacenado cancelaremos la transacción en curso, pero si hay una transacción externa al procedimiento en el que estamos trabajando se cancelará esa transacción externa.
Con esto no quiero decir que no se pueda usar, simplemente que hay que tener muy claras las 4 normas sobre las sentencias BEGIN, ROLLBACK y COMMIT que comentamos al principio de este artículo.
Veamos como se comporta una transacción en un procedimiento almacenado llamado desde una transacción.
En principio parece que si ejecutamos el procedimiento ‘Inserta1’ el resultado sería:
Pero lo que obtenemos es:
Si analizamos estos mensajes vemos que se inserta la primera fila, se salta al segundo procedimiento almacenado y se inserta la segunda fila. Se ejecuta el ‘ROLLBACK TRAN –Dos’ del segundo procedimiento almacenado y se deshacen las dos inserciones porque este ROLLBACK cancela la transacción exterior, la del primer procedimiento almacenado.
A continuación se termina el segundo procedimiento almacenado y como este procedimiento tiene un ‘BEGIN TRAN –Dos’ y no tiene un COMMIT o un ROLLBACK (recordemos que el ‘ROLLBACK TRAN –Dos’ termina el ‘BEGIN TRAN –Uno’) se produce un error y nos avisa que el procedimiento almacenado termina con una transacción pendiente.
Al volver al procedimiento almacenado externo se ejecuta el INSERT que inserta la tercera fila y a continuación el ‘COMMIT TRAN –-Uno’. Aquí aparece otro error puesto que este ‘COMMIT TRAN –Uno’ estaba ahí para finalizar una transacción que ya ha sido cancelada anteriormente.
El modo correcto
Para que nuestras transacciones se comporten como se espera dentro de un procedimiento almacenado podemos recurrir al SAVE TRAN.
Veamos como:
Ahora el ‘ROLLBACK TRAN guardado’ del segundo procedimiento almacenado deshace la transacción sólo hasta el punto guardado. Además este ROLLBACK no decrementa el @@TRANCOUNT ni afecta a las transacciones en curso.
El resultado obtenido al ejecutar este procedimiento almacenado es:
Una vez vistos estos ejemplos queda claro que no hay problema en utilizar transacciones dentro de procedimientos almacenados siempre que tengamos en cuenta el comportamiento del ROLLBACK TRAN y que utilicemos el SAVE TRAN de manera adecuada.
Recordemos como funcionan las transacciones. Tenemos 4 sentencias que son:
• BEGIN TRAN: Comienza una transacción y aumenta en 1 @@TRANCOUNT
• COMMIT TRAN: Reduce en 1 @@TRANCOUNT, y si @@TRANCOUNT llega a 0 guarda la transacción
• ROLLBACK TRAN: Deshace la transacción actual, o si estamos en transacciones anidadas deshace la más externa y todas las internas. Además pone @@TRANCOUNT a 0
• SAVE TRAN: Guarda un punto (con nombre) al que podemos volver con un ROLLBACK TRAN si es que estamos en transacciones anidadas y no queremos deshacer todo hasta la más externa.
Un par de ejemplos dejarán las cosas más claras:
BEGIN TRAN
-- Primer BEGIN TRAN y ahora @@TRANCOUNT = 1
BEGIN TRAN
-- Ahora @@TRANCOUNT = 2
COMMIT TRAN
-- Volvemos a @@TRANCOUNT = 1
-- Pero no se guarda nada ni se hacen efectivos los posibles cambios
COMMIT TRAN
-- Por fin @@TRANCOUNT = 0
-- Si hubiera cambios pendientes se llevan a la base de datos
-- Y volvemos a un estado normal con la transacción acabada
Uso del commit
BEGIN TRAN
-- Primer BEGIN TRAN y @@TRANCOUNT = 1
BEGIN TRAN
-- Ahora @@TRANCOUNT = 2
COMMIT TRAN
-- Como antes @@TRANCOUNT = 1
--Y como antes nada se guarda
ROLLBACK TRAN
-- Se cancela TODA la transacción. Recordemos que el COMMIT
-- de antes no guardo nada, solo redujo @@TRANCOUNT
-- Ahora @@TRANCOUNT = 0
COMMIT TRAN
-- No vale para nada porque @@TRANCOUNT es 0 por el efecto del ROLLBACK
Uso del rollback
En cuanto al SAVE TRAN podemos recordarlo con el siguiente ejemplo:
CREATE TABLE Tabla1 (Columna1 varchar(50))
GO
BEGIN TRAN
INSERT INTO Tabla1 VALUES (‘Primer valor’)
SAVE TRAN Punto1
INSERT INTO Tabla1 VALUES (‘Segundo valor’)
ROLLBACK TRAN Punto1
INSERT INTO Tabla1 VALUES (‘Tercer valor’)
COMMIT TRAN
SELECT * FROM Tabla1
Columna1
--------------------------------------------------
Primer valor
Tercer valor
(2 filas afectadas)
Un ROLLBACK a un SAVE TRAN no deshace la transacción en curso ni modifica @@TRANCOUNT, simplemente cancela lo ocurrido desde el ‘SAVE TRAN nombre‘ hasta su ‘ROLLBACK TRAN nombre’
Transacciones y procedimientos almacenados…
Cuando trabajamos con procedimientos almacenados debemos recordar que cada procedimiento almacenado es una unidad. Cuando se ejecuta lo hace de manera independiente de quien lo llama. Sin embargo si tenemos un ROLLBACK TRAN dentro de un procedimiento almacenado cancelaremos la transacción en curso, pero si hay una transacción externa al procedimiento en el que estamos trabajando se cancelará esa transacción externa.
Con esto no quiero decir que no se pueda usar, simplemente que hay que tener muy claras las 4 normas sobre las sentencias BEGIN, ROLLBACK y COMMIT que comentamos al principio de este artículo.
Veamos como se comporta una transacción en un procedimiento almacenado llamado desde una transacción.
CREATE PROCEDURE Inserta2
AS
BEGIN TRAN --Uno
INSERT INTO Tabla1 VALUES ('Valor2')
ROLLBACK TRAN --Uno
GO
CREATE PROCEDURE Inserta1
AS
BEGIN TRAN --Dos
INSERT INTO Tabla1 VALUES ('Valor 1')
EXEC Inserta2
INSERT INTO Tabla1 VALUES ('Valor3')
COMMIT TRAN --Dos
GO
En principio parece que si ejecutamos el procedimiento ‘Inserta1’ el resultado sería:
EXECUTE inserta1
SELECT * FROM tabla1
txt
--------------------------------------------------
Valor1
Valor3
(2 filas afectadas)
Pero lo que obtenemos es:
EXECUTE inserta1
SELECT * FROM tabla1
(1 filas afectadas)
(1 filas afectadas)
Servidor: mensaje 266, nivel 16, estado 2, procedimiento Inserta2, línea 8
El recuento de transacciones después de EXECUTE indica que falta una
instrucción COMMIT o ROLLBACK TRANSACTION. Recuento anterior = 1,
recuento actual = 0.
(1 filas afectadas)
Servidor: mensaje 3902, nivel 16, estado 1, procedimiento Inserta1, línea 8
La petición COMMIT TRANSACTION no tiene la correspondiente BEGIN TRANSACTION.
txt
--------------------------------------------------
Valor3
(1 filas afectadas)
Si analizamos estos mensajes vemos que se inserta la primera fila, se salta al segundo procedimiento almacenado y se inserta la segunda fila. Se ejecuta el ‘ROLLBACK TRAN –Dos’ del segundo procedimiento almacenado y se deshacen las dos inserciones porque este ROLLBACK cancela la transacción exterior, la del primer procedimiento almacenado.
A continuación se termina el segundo procedimiento almacenado y como este procedimiento tiene un ‘BEGIN TRAN –Dos’ y no tiene un COMMIT o un ROLLBACK (recordemos que el ‘ROLLBACK TRAN –Dos’ termina el ‘BEGIN TRAN –Uno’) se produce un error y nos avisa que el procedimiento almacenado termina con una transacción pendiente.
Al volver al procedimiento almacenado externo se ejecuta el INSERT que inserta la tercera fila y a continuación el ‘COMMIT TRAN –-Uno’. Aquí aparece otro error puesto que este ‘COMMIT TRAN –Uno’ estaba ahí para finalizar una transacción que ya ha sido cancelada anteriormente.
El modo correcto
Para que nuestras transacciones se comporten como se espera dentro de un procedimiento almacenado podemos recurrir al SAVE TRAN.
Veamos como:
CREATE PROCEDURE Inserta2
AS
SAVE TRAN Guardado
INSERT INTO Tabla1 VALUES ('Valor2')
ROLLBACK TRAN Guardado
GO
CREATE PROCEDURE Inserta1
AS
BEGIN TRAN
INSERT INTO Tabla1 VALUES ('Valor 1')
EXEC Inserta2
INSERT INTO Tabla1 VALUES ('Valor 3')
COMMIT TRAN
GO
Ahora el ‘ROLLBACK TRAN guardado’ del segundo procedimiento almacenado deshace la transacción sólo hasta el punto guardado. Además este ROLLBACK no decrementa el @@TRANCOUNT ni afecta a las transacciones en curso.
El resultado obtenido al ejecutar este procedimiento almacenado es:
EXECUTE inserta1
SELECT * FROM tabla1
(1 filas afectadas)
(1 filas afectadas)
(1 filas afectadas)
txt
--------------------------------------------------
Valor 1
Valor 3
(2 filas afectadas)
Una vez vistos estos ejemplos queda claro que no hay problema en utilizar transacciones dentro de procedimientos almacenados siempre que tengamos en cuenta el comportamiento del ROLLBACK TRAN y que utilicemos el SAVE TRAN de manera adecuada.
lunes, 31 de mayo de 2010
Metodos para redireccionar URL´s
Método 1. HTML
El primer método es usar el elemento META. Veamos la sintaxis de uso para nuestro propósito:Código :
<meta http-equiv="acción" content="segundos"; url="url destino" />
Supongamos que has cambiado de servidor o has movido una página a otro directorio. Mostraremos un mensaje acerca de ello y redireccionaremos a nuestro usuario a la nueva ubicación de la página. En este ejemplo, la acción será "refresh", el tiempo en que tardará en refrescar la página será de cinco (5) segundos:
Código :
<html> <head> <meta http-equiv="Refresh" content="5;url=http://www.pagina.com"> </head> <body> <p>Nos hemos mudado! Serás dirigido automáticamente en cinco segundos. En caso contrario, puedes acceder haciendo click <a href="http://www.cristalab.com">aquí</a></p> </body> </html>
Método 2. PHP
El siguiente ejemplo, redireccionará al usuario sin aviso previo:Código :
<?php header ("Location: http://www.pagina.com"); ?>
Método 3. JavaScript
Podemos lograr con JavaScript, los métodos anteriormente vistos. En el caso de un redireccionamiento en espera, debemos usar un "temporizador". Veamos un ejemplo:Código :
<html> <head> <script type="text/javascript"> function redireccionar(){ window.locationf="http://www.pagina.com"; } setTimeout ("redireccionar()", 5000); //tiempo expresado en milisegundos </script> </head> <body> <p> Espere por favor, será redireccionado en 5 segundos.</p> </body> </html>
Haciéndolo directamente, sin espera:
Código :
<body> <script type="text/javascript"> window.location="http://www.pagina.com"; </script> </body>
Eliminar variables del query_string
//$str = 'idioma=es&pagina=5&id=2&lugar=madrid&ref=a50'; $str = $_SERVER['QUERY_STRING']; parse_str($str, $info);
unset($info['idioma'], $info['pagina']);
echo http_build_query($info);
unset($info['idioma'], $info['pagina']);
echo http_build_query($info);
Control de flujo en procedimientos almacenados para MySQL 5
Seguimos con los procedimientos almacenados. Vamos a ver como llevar a cabo el control de flujo de nuestro procedimiento. También es interesante observar el uso de las variables dentro de los procedimientos. Si se declara una variable dentro de un procedimiento mediante el código :
Esta tendrá un ámbito local y cuando se acabe el procedimiento no podrá ser accedida. Una vez la variable es declarada, para cambiar su valor usaremos la sentencia SET de este modo :
Para poder acceder a una variable a la finalización de un procedimiento se tiene que usar parámetros de salida.
Vamos a ver unos ejemplos para comprobar lo sencillo que es :
IF THEN ELSE
SWITCH
Creo que no hacen falta explicaciones.
COMPARACIÓN DE CADENAS
La función strcmp devuelve 0 si las cadenas son iguales, si no devuelve 0 es que son diferentes.
USO DE WHILE
Un while de toda la vida.
USO DEL REPEAT
El repeat es similar a un “do while” de toda la vida.
LOOP LABEL
Este es otro tipo de loop, la verdad es que teniendo los anteriores no se me ocurre aplicación para usar este tipo de loop, pero es bueno saber que existe por si algún día te encuentras algún procedimiento muy antiguo que lo use. El código que haya entre loop_label : loop y end loop; se ejecutara hasta que se encuentre la sentencia leave loop_label; que hemos puesto en la condición, por lo tanto el loop se repetirá hasta que la variable v sea >= que 5.
El loop puede tomar cualquier nombre, es decir puede llamarse miLoop: loop, en cuyo caso se repetirá hasta que se ejecute la sentencia leave miLoop.
declare miVar int;
SET miVar = 56 ;
Vamos a ver unos ejemplos para comprobar lo sencillo que es :
IF THEN ELSE
delimiter // CREATE procedure miProc(IN p1 int) /* Parámetro de entrada */ begin declare miVar int; /* se declara variable local */ SET miVar = p1 +1 ; /* se establece la variable */ IF miVar = 12 then INSERT INTO lista VALUES(55555); else INSERT INTO lista VALUES(7665); end IF; end; //
delimiter // CREATE procedure miProc (IN p1 int) begin declare var int ; SET var = p1 +2 ; case var when 2 then INSERT INTO lista VALUES (66666); when 3 then INSERT INTO lista VALUES (4545665); else INSERT INTO lista VALUES (77777777); end case; end; //
COMPARACIÓN DE CADENAS
delimiter // CREATE procedure compara(IN cadena varchar(25), IN cadena2 varchar(25)) begin IF strcmp(cadena, cadena2) = 0 then SELECT "son iguales!"; else SELECT "son diferentes!!"; end IF; end; //
USO DE WHILE
delimiter // CREATE procedure p14() begin declare v int; SET v = 0; while v < 5 do INSERT INTO lista VALUES (v); SET v = v +1 ; end while; end; //
USO DEL REPEAT
delimiter // CREATE procedure p15() begin declare v int; SET v = 20; repeat INSERT INTO lista VALUES(v); SET v = v + 1; until v >= 1 end repeat; end; //
LOOP LABEL
delimiter // CREATE procedure p16() begin declare v int; SET v = 0; loop_label : loop INSERT INTO lista VALUES (v); SET v = v + 1; IF v >= 5 then leave loop_label; end IF; end loop; end; //
El loop puede tomar cualquier nombre, es decir puede llamarse miLoop: loop, en cuyo caso se repetirá hasta que se ejecute la sentencia leave miLoop.
TEMA 4: Propiedades ADO
AbsolutePage, propiedad (ADO)
Especifica en qué página reside el registro actual.
Se aplica a Objeto Recordset (ADO).
Configuración y valores devueltos
Establece o devuelve un valor de tipo Long entre 1 y el número Recordset (PageCount) o devuelve una de las constantes siguientes:
adPosUnknown | El objeto Recordset está vacío, la posición actual se desconoce o el proveedor no admite la propiedad AbsoltitePage. |
adPosBOF | El puntero del registro actual está al comienzo del archivo (C5 decir, la propiedad BOF tiene el valor True). |
adPosEOF | El puntero del registro actual está al final del archivo (es decir, la propiedad EOF tiene el valor True). |
Utilice la propiedad AbsolutePage para identificar el número de la página en que se encuentra el registro actual. Utilice la propiedad PageSize para dividir lógicamente el objeto Recordset en varias páginas, cada una de las cuales debe tener un número de registros igual a PageSize (excepto la última página, que puede tener menos registros). El proveedor debe ser compatible con la funcionalidad apropiada para que esta propiedad esté disponible. Al igual que la propiedad AbsolutePosition, la propiedad AbsolutePage está en base 1 v es igual a 1 cuando el registro actual es el primer registro del objeto Recordset. Establezca esta propiedad para moverse al primer registro de una página específica. Obtenga el número total de páginas a partir de la propiedad PageCount.
AbsolutePosition, propiedad (ADO)
Especifica la posición ordinal del registro actual de un objeto Recordset.
Se aplica a
Objeto Recordset (ADO).
Configuración y valores devueltos
Establece o devuelve un valor de tipo Long entre 1 y el número de registros del objeto Recordset (RecordCount) o devuelve una de las constantes siguientes: Constante Descripción
adPosUnknown | El objeto Recordset está vacío, la posición actual se desconoce o el proveedor no admite la propiedad AbsoltitePage. |
adPosBOF | El puntero del registro actual está al comienzo del archivo (C5 decir, la propiedad BOF tiene el valor True). |
adPosEOF | El puntero del registro actual está al final del archivo (es decir, la propiedad EOF tiene el valor True). |
Utilice la propiedad AbsolutePosition para moverse a un registro según su posición ordinal en el objeto Recordset o para determinar la posición ordinal del registro actual. El proveedor debe ser compatible con la funcionalidad apropiada para que esta propiedad esté disponible. Al igual que la propiedad AbsolutePage, la propiedad AbsolutePosition está en base 1 y es igual a 1 cuando el registro actual es el púrner registro del objeto Recordset. Puede obtener el número total de registros contenidos en dicho objeto Recordset a partir de la propiedad RecordCount. Cuando establece la propiedad AbsoiutePos¡tion, incluso si es para un registro contenido en la memoria caché actual, ADO vuelve a cargar la memoria caché con un nuevo grupo de registros que comienza con el registro especificado. La propiedad CacheSize determina el tamaño de este grupo.
Nota: No debería utilizar la propiedad AbsolutePosition como un número de registro sustirntorio. La posición de un registro dado cambia cuando se elimina un registro anterior Tampoco hay ninguna seguridad de que un registro dado tendrá la misma propiedad AbsolutePosition si se vuelve a consultar o se vuelve a abrir el objeto Recordset. Los marcadores siguen siendo la forma recomendada para conservar y volver a una posición dada, v son la única manera de posicionamiento en todos los tipos de objetos Recordset.
Ejemplo
Este ejemplo muestra cómo la propiedad AbsolutePosition puede llevar cuenta del progreso de un bucle que enumera todos los registros de un Recordset. Utiliza la propiedad CursorLocation para habilitar la propiedad AbsolutePosition ajustando el cursor a un cursor de cliente:
Public Sub AbsolutePositionX()
Dim rstEmployees As ADODB.Recordset
Dim strCnn As String
Dim strMessage As String
' Open a recordset for the Employee table
' using a client cursor.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
Set rstEmployees = New ADODB.Recordset
' Use client cursor to enable AbsolutePosition property.
rstEmployees.CursorLocation = adUseClient
rstEmployees.Open "employee", strCnn, , , adCmdTable
' Enumerate Recordset.
Do While Not rstEmployees.EOF
' Display current record information.
strMessage = "Employee: " & rstEmployees!lName & vbCr & _
"(record " & rstEmployees.AbsolutePosition & _
" of " & rstEmployees.RecordCount & ")"
If MsgBox(strMessage, vbOKCancel) = vbCancel _
Then Exit Do
rstEmployees.MoveNext
Loop
rstEmployees.Close
End Sub
BOF, EOF, propiedades (ADO)
BOF indica que la posición del registro actual está antes del primer registro de un objeto Recordset EOF indica que la posición del registro actual esta después del último registro de un objeto Recordset.
Valor devuelto
Las propiedades BOF y EOF devuelven valores Boolean.
Se aplica a Objeto Recordset ADO.
Utilice las propiedades BOF y BOF para determinar si un objeto Recordset contiene registros o si se han sobrepasado los límites de un objeto Recordset al moverse de un registro a otro.
La propiedad BOF devuelve True (-1) si la posición del registro actual está antes del primer registro, y devuelve False (O) si la posición del retristro actual esta en o después del primer registro.
La propiedad EOF devuelve True si la posición del registro actual está después del último registro, y devuelve False si la posición del registro actual está en o después del último registro.
Si una de las dos propiedades BOF o EOF es true. no hay ningún registro actual.
Si se abre un objeto Recordset que no contiene registros las propiedades BOF y EOF se establecen a True y el valor de la propiedad RecordCount del objeto Recordset es cero.
Cuando se abre un objeto Recordset que contiene. al menos. un registro. el primer registro es el registro actual y las propiedades BOF y BOF tienen el valor False.
Si se elimina el último registro que queda en el objeto Recordset, las propiedades BOF y EOF pueden conservar el valor False hasta que se intente volver a colocar el registro actual.
Esta tabla muestra qué métodos Move se permiten con diferentes combinaciones de las propiedades BOF y EOF:
MoveFirst, MoveLast | MovePrevious, Move | Move O | MoveNext, Move>O | |
BOF=True,EOF=False | Permitido | Error | Error | Permitido |
BOF=False,EOF=True | Permitido | Permitido | Error | Error |
Ambas True | Error | Error | Error | Error |
Ambas False | Permitido | Permitido | Permitido | Permitido |
Permitir un método Move no garantiza que el método localizará correctamente un registro, sólo significa que al llamar al método Move especificado no se producirá un error. La tabla siguiente muestra qué ocurre en los valores de las propiedades BOF y EOF cuando se llama a varios métodos Move, pero no puede localizar correctamente un registro:
BOF | EOF | |
MoveFirst, MoveLast | Se establece a True. | Se establece a True. |
Move O | Ningún cambio | Ningún cambio |
MovePrevious, Move | Se establece a True. | Ningún cambio |
MoveNext, Move > O | Ningún cambio | Se establece a True. |
E¡emplo
Este ejemplo utiliza las propiedades BOF y EOF para visualizar un mensaje si un usuario intenta desplazarse más allá del primer o último registro de un Recordset. Utiliza la propiedad Bookmark para permitir al usuario etiquetar un registro en un Recordset y volver a él más tarde:
Public Sub BOFX()
Dim rstPublishers As ADODB.Recordset
Dim strCnn As String
Dim strMessage As String
Dim intCommand As Integer
Dim varBookmark As Variant
' Open recordset with data from Publishers table.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
Set rstPublishers = New ADODB.Recordset
rstPublishers.CursorType = adOpenStatic
' Use client cursor to enable AbsolutePosition property.
rstPublishers.CursorLocation = adUseClient
rstPublishers.Open "SELECT pub_id, pub_name FROM publishers " & _
"ORDER BY pub_name", strCnn, , , adCmdText
rstPublishers.MoveFirst
Do While True
' Display information about current record
' and get user input.
strMessage = "Publisher: " & rstPublishers!pub_name & _
vbCr & "(record " & rstPublishers.AbsolutePosition & _
" of " & rstPublishers.RecordCount & ")" & vbCr & vbCr & _
"Enter command:" & vbCr & _
"[1 - next / 2 - previous /" & vbCr & _
"3 - set bookmark / 4 - go to bookmark]"
intCommand = Val(InputBox(strMessage))
Select Case intCommand
' Move forward or backward, trapping for BOF
' or EOF.
Case 1
rstPublishers.MoveNext
If rstPublishers.EOF Then
MsgBox "Moving past the last record." & _
vbCr & "Try again."
rstPublishers.MoveLast
End If
Case 2
rstPublishers.MovePrevious
If rstPublishers.BOF Then
MsgBox "Moving past the first record." & _
vbCr & "Try again."
rstPublishers.MoveFirst
End If
' Store the bookmark of the current record.
Case 3
varBookmark = rstPublishers.Bookmark
' Go to the record indicated by the stored
' bookmark.
Case 4
If IsEmpty(varBookmark) Then
MsgBox "No Bookmark set!"
Else
rstPublishers.Bookmark = varBookmark
End If
Case Else
Exit Do
End Select
Loop
rstPublishers.Close
End Sub
Este ejemplo utiliza las propiedades Bookmark y Filter para crear una vista limitada del Recordset. Sólo son accesibles los registros referenciados por la matriz de marcadores:
Public Sub BOFX2()
Dim rs As New ADODB.Recordset
Dim bmk(10)
rs.CursorLocation = adUseClient
rs.ActiveConnection = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=;"
rs.Open "select * from authors", , adOpenStatic, adLockBatchOptimistic
Debug.Print "Number of records before filtering: ", rs.RecordCount
ii = 0
While rs.EOF <> True And ii < 11
bmk(ii) = rs.Bookmark
ii = ii + 1
rs.Move 2
Wend
rs.Filter = bmk
Debug.Print "Number of records after filtering: ", rs.RecordCount
rs.MoveFirst
While rs.EOF <> True
Debug.Print rs.AbsolutePosition, rs("au_lname")
rs.MoveNext
Wend
End Sub
CommandTimeout, propiedad (ADO) Descripción
Indica el intervalo de espera para que se ejecute un comando antes de que finalice el intento y se genere un error.
Se aplica a
Objeto Command (ADO), Objeto Connection (ADO).
Configuración y valores devueltos
Establece o devuelve un valor Long que indica, en segundos, el intervalo de espera para que se ejecute un comando. El valor predeterminado es 30.
Comentarios
Use la propiedad CommandTimeout en un objeto Connection o en un objeto Command para permitir la cancelación de una llamada al método Execute, debida a demoras en el tráfico de la red o a una sobrecarga en el servidor. Si transcurre el intervalo establecido en la propiedad CommandTimeout antes de que termine la ejecución de la orden, se produce un error y ADO cancela el comando. Si establece la propiedad a cero, ADO esperará indefinidamente hasta que termine la ejecución. Compruebe que el proveedor y el origen de datos para los que está escribiendo código admiten la funcionalidad CommandTimeout. El valor de CommandTimieout en un objeto Connection no afecta al valor de CommandTimeout en un objeto Command de la misma Connection,. es decir, la propiedad CommandTimeout del objeto Command no hereda el valor de CommandTimeout del objeto Connection. En un objeto Connection, la propiedad CommandTimeout permanece en modo lectura/escritura después de que se abra Connection.
ConnectionString, propiedad (ADO)
Contiene la información que se utiliza para establecer una conexión a un origen de datos.
Se aplica a
Objeto Connection (ADO).
Configuración y valores devueltos
Establece o devuelve un valor String.
Use la propiedad ConnectionString para especificar un origen de datos pasando una cadena de conexión detallada que contenga una serie de instrucciones argumento = valor separadas con punto y coma.
ADO admite cuatro argumentos con la propiedad ConnectionString; cualquier otro argumento pasa directamente al proveedor sin que ADO lo procese. Los argumentos compatibles con ADO son los siguientes:
Argumento | Descripción |
Provider= | Especifica el nombre del proveedor que se usa con la conexion |
File Name= | Indica el nombre de un archivo especifico del proveedor (por Qíempío, un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida. |
Remote provider= | Especifica el nombre de un proveedor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). |
Remote Server= | Especifica la ruta de acceso del servidor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). |
Argumento Descripción Provider Especifica el nombre del proveedor que se usa con la conexion. Indica el nombre de un archivo especifico del proveedor (por Qíempío, un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida. File Name Remote provider
Especifica el nombre de un proveedor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service).
Remote Server Especifica la ruta de acceso del servidor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service).
Después de que se establezca la propiedad ConnectionString y se abra el objeto Connection. es posible que el proveedor modifique el contenido de la propiedad: por ejemplo, asignando los nombres de argumento definidos con ADO a sus equivalentes en el proveedor. La propiedad ConnectionString hereda automáticamente el valor que se utiliza con el argumento Connections del método Open para que se pueda hacer caso omiso de la propiedad connectionString actual durante la llamada al método Open. Debido a que el argumento File Name hace que ADO cargue el proveedor asociado. no se pueden pasar ambos argumentos, Provider y File Name. La propiedad ConnectionString es de lectura/escútura cuando la conexión está cerrada y de sólo lectura cuando está abierta.
Uso de Remote Data Service. Cuando se usa el objeto Connection del lado del cliente, la propiedad ConnectionString solamente puede incluir los parámetros Remote provider y Remote Server
Count, propiedad (ADO)
Indica el número de objetos de una coleccion.
Devuelve un valor Long.
Se aplica a
Colección Errors (ADO). Colección Fields (ADO) Colección Parameter (ADO). Colección Properties (ADO).
Use la propiedad Count para determinar cuántos objetos hay en una colección dada. Debido a que la numeración de miembros de una colección empieza por cero, debe codificar siempre los bucles empezando siempre con el miembro cero y terminando con el valor de la propiedad Count menos 1. Si está usando Microsoft Visual Basic y desea hacer un recorrido por los miembros de una colección sin comprobar la propiedad Count use el comando For Each...Next. Si la propiedad Count es cero. no hay ningún objeto en la colección.
CursorLocation, propiedad (ADO) Descripción
Establece o devuelve la posición de un motor de cursores.
Se aplica a
Objeto Connection (ADO), Objeto Recordset (ADO).
Establece o devuelve un valor Long que se puede establecer a alguna de las siguientes constantes:
Constante | Descripción |
adUseNone | No se usan servicios de cursor. (Esta constante es obsoleta y aparece únicamente por compatibilidad con versiones anteriores.) |
adUseClient | Usa cursores del lado del cliente suministrados por una biblioteca de cursores locales. Los motores de cursores locales admitirán a menudo muchas características que los cursores proporcionados por controladores no admitirán; por tanto, el uso de esta configuración puede proporcionar una ventaja con respecto a características que serán habilitadas. Por compatibilidad con versiones anteriores. se admite también el sinónimo adUseClientBatch. |
adUseServer | Predeterminado. Usa cursores suministrados por el controlador o por el proveedor de datos. Estos cursores son, en ocasiones. muy flexibles y conceden un margen de sensibilidad adicional a los cambios realizados por otros usuarios en el origen de datos. No obstante. algunas características de Microsoft Client Cursor Provider (como los conjuntos de registros disociados) no pueden ser simuladas con cursores del lado del servidor y no estarán disponibles con esta configuración. |
Esta propiedad le permite elegir entre distintas bibliotecas de cursores accesibles para el proveedor. Normalmente, puede elegir entre usar una biblioteca de cursores del lado del cliente o una ubicada en el servidor.
El valor de esta propiedad afecta solamente a las conexiones establecidas después de que se haya establecido la propiedad. Los cambios en la propiedad CursorLocation no afectan a las conexiones existentes. Esta propiedad es de lectura/escritura en un Connection o Recordset cerrado, y de sólo lectura en un Recordset abierto. Los cursores de Connection.Execute heredarán esta configuración. Los objetos Recordset heredarán automáticamente esta configuración de sus conexiones asociadas.
Uso de Remote Data Service. Cuando se usa en un objeto Recordset o Connection (ADOR) del lado del cliente, la propiedad CursorLocation sólo se puede establecer a adUseClient:
Direction, propiedad (ADO)
Indica si Parameter representa un parámetro de entrada, un parámetro de salida o ambos bien, si el parámetro es el valor devuelto por un procedimiento almacenado. Se aplica a
Objeto Parameter (ADO).
Establece o devuelve uno de los siguientes valores de ParameterDirectionEnum:
Constante | Descripción |
adParamUnknown | Indica que la dirección del parámetro es desconocida. |
adParamlnput | Valor predeterminado. Indica un parámetro de entrada. |
adParamOutput | Indica un parámetro de salida. |
adParamlnputOutput | Indica un parámetro de entrada y otro de salida. |
adParamReturnValue | Indica un valor devuelto. |
Utilice la propiedad Direction para especificar cómo se pasa un parámetro hacia o desde un procedimiento. La propiedad Direction es de lectura/escritura; esto le permite trabajar con proveedores que no devuelven esta información o establecer esta información cuando desea que ADO realice una llamada adicional al proveedor para recuperar información acerca del parámetro. No todos los proveedores pueden determinar la dirección de los parámetros en sus procedimientos almacenados. En estos casos, debe establecer la propiedad Direction antes Ejecutar la consulta.
Ejemplo
Este ejemplo utiliza las propiedades ActiveConnection, CommandText, CommandTimeout, CommandType. Size y Direction para ejecutar un procedimiento almacenado:
Public Sub ActiveConnectionX()
Dim cnn1 As ADODB.Connection
Dim cmdByRoyalty As ADODB.Command
Dim prmByRoyalty As ADODB.Parameter
Dim rstByRoyalty As ADODB.Recordset
Dim rstAuthors As ADODB.Recordset
Dim intRoyalty As Integer
Dim strAuthorID As String
Dim strCnn As String
' Define a command object for a stored procedure.
Set cnn1 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
cnn1.Open strCnn
Set cmdByRoyalty = New ADODB.Command
Set cmdByRoyalty.ActiveConnection = cnn1
cmdByRoyalty.CommandText = "byroyalty"
cmdByRoyalty.CommandType = adCmdStoredProc
cmdByRoyalty.CommandTimeout = 15
' Define the stored procedure's input parameter.
intRoyalty = Trim(InputBox( _
"Enter royalty:"))
Set prmByRoyalty = New ADODB.Parameter
prmByRoyalty.Type = adInteger
prmByRoyalty.Size = 3
prmByRoyalty.Direction = adParamInput
prmByRoyalty.Value = intRoyalty
cmdByRoyalty.Parameters.Append prmByRoyalty
' Create a recordset by executing the command.
Set rstByRoyalty = cmdByRoyalty.Execute()
' Open the Authors table to get author names for display.
Set rstAuthors = New ADODB.Recordset
rstAuthors.Open "authors", strCnn, , , adCmdTable
' Print current data in the recordset, adding
' author names from Authors table.
Debug.Print "Authors with " & intRoyalty & _
" percent royalty"
Do While Not rstByRoyalty.EOF
strAuthorID = rstByRoyalty!au_id
Debug.Print , rstByRoyalty!au_id & ", ";
rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
Debug.Print rstAuthors!au_fname & " " & _
rstAuthors!au_lname
rstByRoyalty.MoveNext
Loop
rstByRoyalty.Close
rstAuthors.Close
cnn1.Close
End Sub
PageCount, propiedad (ADO)
Indica cuántas páginas de datos contiene el objeto Recordset.
Se aplica a
Objeto Recordset (ADO).
Devuelve un valor de tipo Long.
Utilice la propiedad PageCount para determinar cuántas páginas de datos hay en el objeto Recordset. Las páginas son grupos de registros cuyo tamaño es igual al valor de la propiedad PageSize. Incluso si la última página no está completa, debido a que hay menos regístros que el valor de la propiedad PageSize, se cuenta como una página adicional en el valor de PageCount.
Si el objeto Recordset no admite esta propiedad, el valor será -l para indicar que no se puede determinar el valor de PageCount. Vea las propiedades PageSize y AbsolutePage para obtener más información acerca de la funcionalidad de las páginas.
Ejemplo
Este ejemplo utiliza las propiedades AbsolutePage, PageCount y PageSize para visualizar nombres y tomar fechas de la tabla Empleado cinco registros cada vez:
Public Sub AbsolutePageX()
Dim rstEmployees As ADODB.Recordset
Dim strCnn As String
Dim strMessage As String
Dim intPage As Integer
Dim intPageCount As Integer
Dim intRecord As Integer
' Open a recordset using a client cursor
' for the employee table.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
Set rstEmployees = New ADODB.Recordset
' Use client cursor to enable AbsolutePosition property.
rstEmployees.CursorLocation = adUseClient
rstEmployees.Open "employee", strCnn, , , adCmdTable
' Display names and hire dates, five records
' at a time.
rstEmployees.PageSize = 5
intPageCount = rstEmployees.PageCount
For intPage = 1 To intPageCount
rstEmployees.AbsolutePage = intPage
strMessage = ""
For intRecord = 1 To rstEmployees.PageSize
strMessage = strMessage & _
rstEmployees!fname & " " & _
rstEmployees!lname & " " & _
rstEmployees!hire_date & vbCr
rstEmployees.MoveNext
If rstEmployees.EOF Then Exit For
Next intRecord
MsgBox strMessage
Next intPage
rstEmployees.Close
End Sub
PageSize, propiedad (ADO)
Indica cuántos registros constituyen una página en el objeto Recordset.
Se aplica a
Objeto Recordset (ADO).
Establece o devuelve un valor de tipo Long que indica cuántos registros hay en una página. El valor predeterminado es 10.
Utilice la propiedad PageSize para determinar cuántos registros componen una página lógica de datos. Al establecer un tamaño de página, puede utilizar la propiedad AbsolutePage para moverse al primer registro de una página específica. Esto es útil en las situaciones de servidor Web cuando se desea permitir que el usuario pase páginas de datos y vea cierto número de registros al mismo tiempo. Esta propiedad se puede establecer en cualquier momento y su valor se utilizará para calcular la ubicación del primer registro de una página específica.
RecordCount, propiedad (ADO)
Indica el número actual de registros de un objeto Recordset.
Se aplica a
Objeto Recordset (ADO).
Devuelve un valor de tipo Long.
Utilice la propiedad RecordCount para averiguar cuántos registros hay en un objeto Recordset. La propiedad devuelve -1 cuando ADO no puede determinar el número de registros. Al leer la propiedad RecordCount de un objeto Recordset cerrado, se produce un error. Si el objeto Recordset admite el posicionamiento aproximado o los marcadores, es decir, si las propiedades Supports (adApproxPosition) o Supports (adBookmark), respectivamente, devuelven True, este valor será el número exacto de registros del objeto Recordset independientemente de si se ha llenado completamente. Si el objeto Recordset no admite el posicionamiento aproximado, esta propiedad puede consumir muchos recursos debido a que será necesario recuperar y contar todos los recursos para devolver un valor preciso de RecordCount.
Ejemplo
Este ejemplo utiliza la propiedad Filter para abrir un Recordset nuevo basado en una condición específica aplicada a un Recordset existente. Utiliza la propiedad RecordCount para mostrar el número de registros en los dos Recordsets. Es necesaria la función FilterField para que funcione este procedimiento:
Public Sub FilterX()
Dim rstPublishers As ADODB.Recordset
Dim rstPublishersCountry As ADODB.Recordset
Dim strCnn As String
Dim intPublisherCount As Integer
Dim strCountry As String
Dim strMessage As String
' Open recordset with data from Publishers table.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
Set rstPublishers = New ADODB.Recordset
rstPublishers.CursorType = adOpenStatic
rstPublishers.Open "publishers", strCnn, , , adCmdTable
' Populate the Recordset.
intPublisherCount = rstPublishers.RecordCount
' Get user input.
strCountry = Trim(InputBox( _
"Enter a country to filter on:"))
If strCountry <> "" Then
' Open a filtered Recordset object.
Set rstPublishersCountry = _
FilterField(rstPublishers, "Country", strCountry)
If rstPublishersCountry.RecordCount = 0 Then
MsgBox "No publishers from that country."
Else
' Print number of records for the original
' Recordset object and the filtered Recordset
' object.
strMessage = "Orders in original recordset: " & _
vbCr & intPublisherCount & vbCr & _
"Orders in filtered recordset (Country = '" & _
strCountry & "'): " & vbCr & _
rstPublishersCountry.RecordCount
MsgBox strMessage
End If
rstPublishersCountry.Close
End If
End Sub
Public Function FilterField(rstTemp As ADODB.Recordset, _
strField As String, strFilter As String) As ADODB.Recordset
' Set a filter on the specified Recordset object and then
' open a new Recordset object.
rstTemp.Filter = strField & " = '" & strFilter & "'"
Set FilterField = rstTemp
End Function
Nota: Cuando sabe los datos que desea seleccionar, suele ser más eficiente abrir un Recordset con una sentencia SQL. Este ejemplo muestra cómo puede crear un único Recordset y obtener registros de un país en particular.
Public Sub FilterX2()
Dim rstPublishers As ADODB.Recordset
Dim strCnn As String
' Open recordset with data from Publishers table.
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog= pubs;UserId=sa;Password=; "
Set rstPublishers = New ADODB.Recordset
rstPublishers.CursorType = adOpenStatic
rstPublishers.Open "SELECT * FROM publishers " & _
"WHERE Country = 'USA'", strCnn, , , adCmdText
' Print current data in recordset.
rstPublishers.MoveFirst
Do While Not rstPublishers.EOF
Debug.Print rstPublishers!pub_name & ", " & _
rstPublishers!country
rstPublishers.MoveNext
Loop
rstPublishers.Close
End Sub
Sort, propiedad (ADO)
Especifica uno o más nombres de campos por los que se ordena el objeto Recordset y si cada campo se ordena de forma ascendente o descendente.
Configuración y valores devueltos
Establece o devuelve un valor de tipo String con los nombres de los campos utilizados para ordenar separados por comas, donde cada nombre es un objeto Field del objeto Recordset Y, opcionalmente, está seguido de un espacio en blanco y de la palabra clave ASCENDING o DESCENDING, que especifica el orden del campo.
Los datos no se vuelven a ordenar físicamente, sino que, simplemente, se tiene acceso a los mismos en el orden indicado. Se creará un índice temporal para cada uno de los campos especificados en la propiedad Sort si la propiedad CursorLocation se establece a adUseClient y no existe ya un índice. Al establecer la propiedad Sort a una cadena vacía. se restablecen las filas a su orden original y se eliminan los índices temporales. Los índices existentes no se eliminarán.
TEMA 3: Objetos ADO
Command, objeto (ADO) Descripción
Un objeto Command es la definición de un comando específico que se piensa ejecutar contra un origen de datos.
Utilice un objeto Command para consultar una base de datos y obtener registros en un objeto Recordset para ejecutar una operación de manejo masivo de datos o para manipular la estructura de una base de datos. Dependiendo de la funcionalidad del proveedor, algunas colecciones, métodos o propiedades de Command pueden generar un error cuando se les haga referencia. Con las colecciones, métodos y propiedades de un objeto Command, puede hacer lo siguiente:
· Definir el texto ejecutable del comando (por ejemplo, una instrucción SQL) con la propiedad CommandText.
· Definir consultas parametrizadas o argumentos de procedimientos almacenados con los objetos Parameter y la colección Parameters.
· Ejecutar un comando y obtener un objeto Recordset si resulta apropiado con el método Execute.
· Especificar el tipo de comando con la propiedad CommandType antes de la ejecución para optimizar el rendimiento.
· Controlar con la propiedad Prepared, si el proveedor guarda una versión preparada (o compilada) del comando antes de la ejecución.
· Establecer el número de segundos que un proveedor esperará que el comando se ejecute con la propiedad CommandTimeout.
· Asociar una conexión abierta con un objeto Command estableciendo su propiedad ActiveConnection.
· Establecer la propiedad Name para identificar el objeto Command como un método del objeto Connection asociado.
· Pasar un objeto Command a la propiedad Source de un Recordset para obtener los datos.
Nota: Para ejecutar una consulta sin utilizar un objeto Command, pase una cadena de consulta al método Execute de un objeto Connection o al método Open de un objeto Recordset. Sin embargo, se requiere un objeto Command cuando quiera que el texto del comando persista y volver a ejecutarlo, o utilizar parámetros en la consulta.
Para crear un objeto Command independientemente de un objeto Connection previamente definido, establezca su propiedad ActiveConnection a una cadena de conexión válida. ADO sigue creando un objeto Connection, pero no asigna dicho objeto a una variable de objeto. Sin embargo, si va a asociar varios objetos Command con la misma conexión, tiene que crear y abrir de forma explícita un objeto Connection; esto asigna el objeto Connection a una variable de objeto. Si no establece la propiedad ActiveConnection de los objetos Command a esta variable de objeto, ADO crea un nuevo objeto Connection por cada objeto Command, incluso si utiliza la misma cadena de conexión. Para ejecutar un Command, sólo invóquelo utilizando su propiedad Name en el objeto Connection asociado. El objeto Command ha de tener su propiedad ActiveConnection establecida al objeto Connection. Si el objeto Command tuviera parámetros, pase los valores de los parámetros como argumentos del método.
Propiedades
Propiedad ActiveConnection (ADO), Propiedad CommandTect (ADO), Propiedad
CommandTimeout (ADO), Propiedad CommandType (ADO), Propiedad Prepared (ADO), Propiedad State (ADO).
Métodos
Método Cancel (ADO), Método CreateParameter (ADO), Método Execute (ADO Command), Método Execute (ADO Connection).
Colecciones
Colección Properties, Colección Parameters.
Connection, objeto (ADO) Descripción
Un objeto Connection representa una conexión abierta con un origen de datos.
Un objeto Connection representa una sesión única con un origen de datos. En el caso de un sistema de base de datos cliente/servidor, puede ser equivalente a una conexión de red actual con el servidor. Dependiendo de la funcionalidad que acepte el proveedor, algunas colecciones, métodos o propiedades de un objeto Connection puede que no estén disponibles. Mediante las colecciones, métodos y propiedades de un objeto Connection puede hacer lo siguiente:
· Configurar la conexión antes de abrirla con las propiedades ConnectionString, ConnectionTimeout y Mode.
· Establecer la propiedad CursorLocation para invocar al Client Cursor Provider, que acepta actualizaciones por lotes.
· Establecer la base de datos predeterminada para la conexión con la propiedad DefaultDatabase.
· Establecer el nivel de aislamiento de las transacciones abiertas en la conexión con la propiedad IsolationLevel.
· Especificar un proveedor de OLE DB con la propiedad Provider.
· Establecer, y después romper, la conexión física con el origen de datos con los métodos Open y Close.
· Ejecutar un comando en la conexión con el método Execute y configurar la ejecución con la propiedad CommandTimeout.
· Administrar transacciones en la conexión abierta, incluyendo transacciones anidadas si el proveedor las acepta, con los métodos BeginTrans, CommitTrans y Rolí-backjrans y la propiedad Attributes.
· Examinar los errores devueltos por el origen de datos con la colección Errors.
· Leer la versión de la implementación de ADO en uso con la propiedad Version.
· Obtener información del esquema de la base de datos con el método OpenSchema.
Nota: Para ejecutar una consulta sin utilizar un objeto Command, pase una cadena de consulta al método Execute de un objeto Connection. Sin embargo, se requiere un objeto Command cuando se quiere que el texto del comando persista y se vuelva a ejecutar, o utilice parámetros en la consulta.
Puede crear objetos Connection de forma independiente de cualquier objeto previamente definido.
Nota: Se pueden ejecutar comandos o procedimientos almacenados como si fuesen métodos nativos del objeto Connection.
Para ejecutar un comando, dé un nombre al comando mediante la propiedad Name del objeto Command. Establezca la propiedad ActiveConecction del objeto Command como la conexión. Después emita una instrucción donde el nombre del comando se utilice como si fuese un método del objeto Connection, seguido de cualquier parámetro, seguido de un objeto Recordset si se devuelve alguna fila. Establezca las propiedades del Recordset para personalizar el conjunto de registros resultante:
Para ejecutar un procedimiento almacenado, emita una instrucción donde se utilice el nombre del procedimiento almacenado como si fuese un método del objeto Connection, seguido de sus parámetros. ADO realizará una "mejor suposición" de los tipos de parámetros
Propiedades
Propiedad Attributes (ADO), Propiedad CommandTimeout (ADO), Propiedad ConnectionString (ADO), Propiedad ConnectjonTimeout (ADO), Propiedad CursorLocation (ADO), Propiedad DefaultIDatabase (ADO), Propiedad IsolationLevel (ADO), Propiedad Mode (ADO), Propiedad Provider (ADO), Propiedad State (ADO), Propiedad Version (ADO). Objetos ADO 1315
Métodos
Métodos BeginTrans, CommitTrans y RollbackTrans (ADO>, Método Cancel (ADO), Método Close (ADO), Método Execute (Comando ADO), Método Execute (Conexión ADO), Método Open (Conexión ADO), Método Open (Conjunto de Registros ADO), Método OpenSchema (ADO), Método Save (Conjunto de Registros ADO).
Colecciones
Colección Properties, Colección Errors.
Error, objeto (ADO) Descripción
Un objeto Error contiene los detalles sobre los errores de acceso a los datos pertenecientes a una única operación relacionada con el proveedor.
Cualquier operación relacionada con objetos ADO puede generar uno o varios errores del proveedor. Al ocurrir los errores, uno o varios objetos Error se agregan a la colección Errors del objeto Connection. Cuando otra operación ADO genera un error, se borra la colección Errors y el nuevo conjunto de objetos Error se agrega a la colección Errors.
Nota: Cada objeto Error representa un error del proveedor concreto, no un error de ADO. Los errores de ADO pasan al mecanismo de control de excepciones de ejecución. Por ejemplo, en Microsoft Visual Basic, la ocurrencia de un error concreto de ADO desencadenará un evento On Error y aparecerá en el objeto Err. Para obtener la lista completa de los errores de ADO, vea el tema Códigos de error ADO tema.
Puede leer las propiedades de un objeto Error para obtener detalles específicos sobre cada error, incluyendo los siguientes:
· La propiedad Description, que contiene el texto del error.
· La propiedad Number, que contiene el valor entero Long de la constante del error.
· La propiedad Source, que identifica el objeto que ha provocado el error. Esto es particularmente útil cuando tiene varios objetos Error en la colección Errors después de una petición a un origen de datos.
· Las propiedades SQLState y NativeError, que proporcionan información desde orígenes de datos SQL.
Cuando ocurre un error en el proveedor, se agrega a la colección Errors del objeto Connection. ADO acepta la devolución de varios errores por una misma operación ADO para permitir tener acceso a la información de error específica del proveedor. Para obtener esta rica información de error en un controlador de errores, utilice las funciones de interceptación de errores apropiadas de su lenguaje o entorno de trabajo y después utilice bucles anidados para enumerar las propiedades de cada objeto Error de la colección Errors.
Microsoft Visual Basic y VBScript. Si no hay un objeto Connection válido, tendrá que obtener la información de error desde el objeto Err.
Igual que los proveedores, ADO borra el objeto OLE Error Info antes de hacer una llamada que pueda generar un nuevo error del proveedor. Sin embargo, la colección Errors del objeto Connection sólo se borra y se llena cuando el proveedor genera un nuevo error, o cuando se invoca el método Clear. Algunas propiedades y métodos devuelven advertencias que aparecen como objetos Error en la colección Errors, pero no detienen la ejecución de los programas. Antes de invocar los métodos Resync, UpdateBatch o CancelBatcb de un objeto Recordset, el método Open de un objeto Connection, o de establecer la propiedad Filter de un objjeto Recordset, invoque el método Clear de la colección Errors para que pueda leer la propiedad Count de la colección Errors y comprobar las advertencias devueltas.
Propiedades
Propiedad Description (ADO), Propiedad NaviteError (ADO), Propiedad Number (ADO), Propiedad Source (ADO Error), Propiedad SQLState (ADO), Archivo Help.
Field, objeto (ADO)
Un objeto Field representa una columna de datos con un tipo de datos comun.
Un objeto Recordset tiene una colección Fields que consiste en varios objetos Field. Cada objeto Field se corresponde con una columna del Recordset. La propiedad Value de los objetos Field se utiliza para establecer u obtener los datos del registro actual. Dependiendo de la funcionalidad ofrecida por el proveedor, algunas colecciones, métodos o propiedades de un objeto Field puede que no estén disponibles.
Con las colecciones, métodos y propiedades de un objeto Field, puede hacer lo siguiente:
· Obtener el nombre de un campo con la propiedad Name.
· Ver o modificar los datos del campo con la propiedad Value.
· Obtener las características básicas de un campo con las propiedades Type, Precision y NumericScale. · Obtener el tamaño declarado de un campo con la propiedad DefinedSize.
· Obtener el tamaño actual de los datos de un campo dado con la propiedad ActualSize.
· Determinar qué tipos de funcionalidad se aceptan para un campo dado con la propiedad Attributes y la colección Properties.
· Manipular los valores de los campos que contengan datos binarios o de gran tamaño con los métodos AppendChunk y GetChunk. · Si el proveedor acepta actualizaciones por lotes, resolver discrepancias en los valores de tos campos durante una actualización por lotes con las propiedades OriginalValue y UnderlyingValue.
Todas las propiedades de metadatos (Name, Type, DefinedSize, Precision y NumericScale) están disponibles antes de abrir el Recordset del objeto Field. Su establecimiento en tal momento es útil en la generación dinámica de formularios.
Propiedades Propiedad ActualSize (ADO), Propiedad Attributes (ADO), Propiedad DefinedSize (ADO), Propiedad Name (ADO), Propiedad NumericScale (ADO), Propiedad OriginalValue (ADO), Propiedad Precision (ADO), Propiedad Type (ADO), Propiedad UnderlyingValue (ADO), Propiedad Value (ADO).
Métodos Método AppendChunk (ADO), Método GetChunk (ADO).
Colecciones Colección Properties.
Parameter, objeto (ADO)
Un objeto Parameter representa un parámetro o un argumento asociado con un objeto Command basado en una consulta parametrizada o en un procedimiento almacenado.
Muchos proveedores aceptan comandos parametrizados. Estos son comandos en los que la acción deseada está definida una sola vez, pero se utilizan variables (o parámetros) para alterar algunos detalles del comando. Por ejemplo, una instrucción SQL SELECT podría utilizar un parámetro para definir los criterios de búsqueda de la cláusula WHERE, y otro para definir el nombre de la columna de la cláusula SORT BY. Los objetos Parameter representan parámetros asociados con consultas parametrizadas, o los argumentos de entrada/salida y los valores devueltos por los procedimientos almacenados. Dependiendo de la funcionalidad del proveedor, algunas colecciones, métodos o propiedades de un objeto Parameter puede que no estén disponibles. Con las colecciones, métodos y propiedades de un objeto Parameter, puede hacer lo siguiente:
· Establecer u obtener el nombre de un parámetro con la propiedad Name.
· Establecer u obtener el valor de un parámetro con la propiedad Value.
· Establecer u obtener características de un parámetro con las propiedades Attributes, Direction, Precision, NumericScale. Size y Type.
· Pasar datos binarios o de gran tamaño a un parámetro con el método AppendChunk.
Si conoce los nombres y las propiedades de los parámetros asociados con el procedimiento almacenado o la consulta parametrizada a la que vaya a invocar, puede utilizar el método Createparameter para crear objetos Parameter con los valores apropiados y utilizar el método Append para agregarlos a la colección Parameters. Esto le permite establecer y obtener valores de parámetros sin tener que invocar el método Refresh de la colección Parameters para obtener información de los parámetros desde el proveedor, una operación que potencialmente consume bastantes recursos.
Propiedades
Propiedad Attributes (ADO), Propiedad Direction (ADO), Propiedad Name (ADO>, Propiedad NumericScale (ADO), Propiedad Precision (ADO), Propiedad Size (ADO), Propiedad Type (ADO), Propiedad Value (ADO).
Métodos
Método AppendChunk (ADO), Método Delete (Colección de parámetros ADO), Método Delete (Conjunto de Registros ADO).
Colecciones
Colección Properties.
Recordset, objeto (ADO)
Un objeto Recordset representa todo el conjunto de registros de una tabla o del resultado de un comando ejecutado. En cualquier momento, el objeto Recordset sólo hace referencia a un único registro dentro del conjunto, llamado registro actual.
Los objetos Recordset se utilizan para manipular los datos de un proveedor. Cuando se utiliza ADO, se manipulan los datos casi completamente con objetos Recordset. Tollos los objetos Recordset se construyen utilizando registros (filas) y campos (columnas). Dependiendo de la funcionalidad aceptada por el proveedor, algunos métodos o propiedades del objeto Recordset puede que no estén disponibles.
ADOR.Recordset y ADODB.Recordset son ProgID que se utilizan para crear objetos Recordset. Los objetos Recordset que resultan se comportan de forma idéntica, independientemente del ProgID. ADOR.Recordset se instala con Internet Explorer de Microsoft®; ADODB.Recordset se instala con ADO. El comportamiento de un objeto Recordset esta afectado por su entorno (esto es, cliente, servidor, Internet Explorer, etc.). Las diferencias se describen en los temas de Ayuda de sus propiedades. métodos y eventos. Hay cuatro tipos diferentes de cursores en ADO:
· Cursor dinámico: le permite ver inserciones, modificaciones y eliminaciones de otros usuarios, y permite todos los tipos de movimientos a través del Recordset que estén relacionados con marcadores; permite marcadores si el proveedor los acepta.
· Cursor de conjunto de claves: se comporta como un cursor dinámico, excepto que impide ver registros agregados por otros usuarios, e impide el acceso a registros eliminados por otros usuarios. Las modificaciones en los datos efectuadas por otros usuarios siguen siendo visibles. Acepta siempre marcadores y, por tanto, permite todos los tipos de movimientos a través del Recordset.
· Cursor estático: proporciona una copia estática de un conjunto de registros para que se utilicen en búsquedas de datos o para generar informes; permite siempre los marcadores y, por tanto, permite todos los tipos de movimientos a través del Recordset. Las inserciones, modificaciones o eliminaciones efectuadas por otros usuarios no serán visibles. Este es el único tipo de cursor permitido cuando se abre un objeto Recordset en el lado del cliente (ADOR).
· Cursor de tipo Forward-only: se comporta de forma idéntica al cursor dinámico, excepto en que sólo le permite recorrer los registros hacia delante. Esto aumenta el rendimiento en situaciones en las que sólo tenga que efectuar un paso a través de un Recordset.
Establezca la propiedad CursorType antes de abrir el Recordset para elegir el tipo de cursor, o pase un argumento CursorType con el método Open. Algunos proveedores no aceptan todos los tipos de cursores. Compruebe la documentación del proveedor. Si no se especifica el tipo del cursor, ADO abre un cursor de tipo Forward-only de manera predeterminada. Cuando se utilizan con algunos proveedores (como Microsoft ODBC Provider para OLE DB junto con Microsoft SQL Server), se pueden crear objetos Recordset independientemente de un objeto Connection definido previamente pasando una cadena de conexión al método Open. ADO sigue creando un objeto Connection, pero no asigna dicho objeto a una variable de objeto. Sin embargo, si se están abriendo varios objetos Recordset en la misma conexión, se tiene que crear y abrir explícitamente un objeto Connection; así se asigna el objeto Connection a una variable de objeto. Si no se utiliza dicha variable de objeto cuando se abren los objetos Recordset, ADO crea un nuevo objeto Connection por cada nuevo Recordset, incluso si se pasa la misma cadena de conexión. Se pueden crear tantos objetos Recordset como sea necesario. Cuando se abre un Recordset, el registro actual está situado en el primer registro (si lo hay) y las propiedades BOBy EOF están establecidas a False. Si no hay registros, los valores de las propiedades BOF y EOF son True. Pueden utilizarse los métodos Movelfirst, MoveLast, MoveNext y MovePrevious, así como el método Move, y las propiedades AbsolutePosition, AbsolutePage y Filter para volver a colocar el registro actual, asumiendo que el proveedor acepta la funcionalidad necesaria. Los objetos Recordset de tipo Forward-only sólo aceptan el método MoveNext. Cuando se utilizan métodos Move para visitar todos los registros (o para enumerar el Recordset), se puede utilizar las propiedades BOF y EOF para saber si ha llegado al principio o al final del Recordset. Los objetos Recordset pueden aceptar dos tipos de actualización: inmediata y por lotes. En la actualización inmediata, todas las modificaciones se escriben inmediatamente en el origen de datos después de invocar el método Update. También se pueden pasar matrices de valores como parámetros en los métodos AddNew y Update y actualizar de forma simultánea varios campos de un registro. Si un proveedor acepta la actualización por lotes, se puede hacer que el proveedor guarde en la caché las modificaciones efectuadas en varios registros y transmitirlos después en una sola llamada a la base de datos con el método UpdateBatch. Esto se aplica a las modificaciones efectuadas con los métodos AddNew, Update y Delete. Después de invocar el método UpdateBatch, se puede utilizar la propiedad Status para comprobar si ha habido algún conflicto en los datos para resolverlo.
Nota: Para ejecutar una consulta sin utilizar un objeto Command, pase una cadena de consulta al método Open de un objeto Recordset. Sin embargo. se requiere un objeto Command cuando quiera que el texto del comando persista para volver a ejecutarlo, o cuando utilice parámetros en la consulta.
Propiedades
Propiedad AbsolutePage (ADO), Propiedad AbsolutePosition (ADO), Propiedad ActiveConnection (ADO), Propiedad BOF, EOF (ADO), Propiedad Bookmark (ADO), Propiedad CacheSize (ADO), Propiedad CursorLocation (ADO), Propiedad CursorType (ADO), Propiedad EditMode (ADO), Propiedad F'ilter (ADO), Propiedad LockType (ADO), Propiedad MarshalOption (ADO), Propiedad MaxRecords (ADO), Propiedad PageCount (ADO), Propiedad PageSize (ADO), Propiedad RecordCount (ADO), Propiedad Source (Conjunto de Registros ADO), Propiedad State (ADO), Propiedad Status (ADO).
Métodos
Método AddNew (ADO), Método Cancel (ADO), Método CancelBatch (ADO), Método CancelUpdate (ADO), Método Clone (ADO), Método Delete (Colección de parámetros ADO). Método Delete (Colección de campos ADO), Método Delete (Conjunto dc registros ADO), Método Move (ADO), Métodos MoveFirst, MoveLast, MoveNext y MovePrevious (ADO), Método NextRecordset (ADO), Método Open (Conexión ADO) Método Open (Conjunto de regi~tros ADO), Método Requery (ADO), Método Resync (ADO), Método Save (Conjunto de registros ADO), Método Supports (ADO). Método Update (ADO), Método UpdateBatch (ADO).
Suscribirse a:
Entradas (Atom)