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);

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 :
declare miVar int;
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 :
SET miVar = 56 ;
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
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;
//
 
SWITCH
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;
//
Creo que no hacen falta explicaciones.

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;
//
La función strcmp devuelve 0 si las cadenas son iguales, si no devuelve 0 es que son diferentes.

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;
//
Un while de toda la vida.

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;
//
El repeat es similar a un “do while” de toda la vida.

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

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

TEMA 2: Modelo de objetos de ADO

Objetos de datos ActiveX
Los Objetos de datos ActiveX® (ActiveX® Data Object, ADO) constituyen una interfaz de Microsoft, estratégica y de alto nivel, para toda clase de datos. ADO constituye un método de acceso a datos coherente y de alto rendimiento, tanto cuando se crea una base de datos cliente de usuario, como si se crea un objeto de trabajo de capas intermedias con una aplicación, herramienta, lenguaje o, incluso, con un explorador de Internet. ADO es la única interfaz de datos necesaria para programar soluciones cliente/servidor de 1 a n capas y soluciones basadas en datos Web.
ADO está diseñada como una interfaz de nivel de aplicación, fácil de usar, para el modelo más reciente y potente de acceso a datos de Microsoft, OLE DB. OLE DB proporciona acceso de alto rendimiento a cualquier origen de datos, como las bases de datos relacionales y no relacionales, los sistemas de correo electrónico y archivo, texto y gráficos, los objetos de trabajo personalizados, etc. ADO se implementa con un mínino de tráfico de red en escenarios Internet clave y con un mínino de capas entre los datos de origen y los resultados proporcionando una interfaz ligera y de altas prestaciones.
ADO es fácil de usar porque se activa mediante un método conocido: la interfaz OLE, disponible prácticamente en todas las herramientas y lenguajes existentes actualmente en el mercado. Y, puesto que los ADO han sido diseñados para combinar las mejores funciones de RDO y DAO, y eventualmente para sustituirlos, utiliza convenciones similares con semántica simplificada que facilitan el aprendizaje a los programadores.

TEMA 1: Comenzando con ADO - ActiveX Data Objects

Definición
ADO en ActiveX Data Objets es un modelo de objetos de acceso a datos que se apoya sobre OLEDB. Permite dirigir los datos que vienen de bases de datos relacionales (SQL Server, Oracle…), o de otras fuentes de datos no relacionales como ficheros de texto, fuentes de datos que no son de Microsoft, etc. Es un medio para acceder uniformemente a todos los tipos de datos. En cierta manera podemos decir que ODBC permite acceder a bases de datos relacionales, mientras que OLEDB permite el acceso a todos los tipos de datos, sean relacionales o no.
Este modelo de objetos se ha introducido como modelo de acceso de datos para IIS. Sus principales características son las siguientes:
Mínimo tráfico en la red Thread Safe (soportando accesos concurrentes o multithread) Número mínimo de capas entre las aplicaciones y los datos. Facilidad de utilización: modelo de objetos automatizado Tiene en cuenta los conocimientos adquiridos por los desarrolladores sobre la otras tecnologías como DAO o RDO

Arquitectura tecnológica
OLEDB es una tecnología que tiene como objetivo resolver ciertas restricciones de ODBC. Esta tecnología autoriza el acceso a todo tipo de datos, permitiendo administrar el aspecto de tener distribuidas las fuentes de datos, y tiene en cuenta las restricciones de la web. Esta tecnología tiene como objetivo reemplazar a la tecnología ODBC. ADO es el modelo de objetos que permite simplificar el acceso a esta tecnología.
Un proveedor OLEDB implementa las interfaces OLEDB. Permite a un usuario OLEDB alcanzar todo tipo de fuentes de datos de una manera uniforme a través de este juego de interfaces documentado. En cierto sentido, un proveedor OLEDB es similar a un driver ODBC que proporciona un mecanismo uniforme de acceso a los datos relacionales. Los proveedores OLEDB no sólo proporcionan un mecanismo uniforme de acceso a los datos relacionales, si no que también a datos no relacionales. Además, los proveedores OLEDB se construyen sobre la base del modelo COM (Component Objet Model) mientras que los drivers ODBC están basados en una especificación de APIs de C.

El modelo de objetos ADO
El esquema siguiente muestra los objetos y las relaciones existentes entre los objetos y el modelo.

Objetos y Colecciones del modelo de objetos ADO Los objetos Connection, Recordset y Command son los objetos más significativos de este modelo. Clásicamente, una aplicación las utiliza como:
Objeto o Colección Utilización
Objeto Connection Permite establecer las conexiones entre el cliente y el origen de datos
Objeto Command Permite realizar los comandos, como las consultas SQL o las actualizaciones de una base de datos.
Objeto Recordset Permite ver y manipular los resultados de una consutla
Colección Parameters Es utilizada cuando la consulta del objeto Command necesita los parámetros.
Colección Errors La colección Errors y el objeto Error se acceden a través del objeto Connection, a no ser que se produzca un error de proveedor . El objeto Error es diferente del objeto Err de VB, en la medida en que no contiene los errores generados y definidos por el proveedor, por lo tanto, permite obtener información precisa sobre la causa del error.
Colección Fields La colección Fields y el objeto Field se utilizan a través del objeto Recordset, una vez que éste contiene los datos.
Descripción de los objetos y colecciones La colección Properties proporciona la información sobre las características de los diferentes objetos Connection, Command, Recordset y Field. Cada objeto de Property es accesible a través de la colección Properties de cada uno de estos objetos.

Colección Properties
Aunque ADO es un modelo del tipo jerárquico, los objetos de ADO, excepto Error, Field y Property pueden crearse de forma autónoma, es decir, sin hacer referencia al objeto relacionado. Esto es diferente de los objetos DAO y RDO, que requieren en la mayoría de los casos la creación del objeto Parent (por ejemplo, un objeto DAO.Connection necesita un objeto DAO.Workspace para poder crearse).
ADO es un modelo de objetos que permite una gran flexibilidad al programador. Por consiguiente, hay distintas posibilidades para lograr la misma tarea. Por ejemplo, para ejecutar una consulta, es posible usar el método Execute del objeto Command o bien el del objeto Connection.
En resumen, este es un diagrama que muestra las relaciones entre los diferentes objetos que constituyen ADO:

Ejemplos de ADO
Abrir y cerrar una conexión con una base de datos SQL Server usando el proveedor por defecto que es el proveedor de OLEDB para ODBC

Sub ConnectionExample1()
 Dim cn As ADODB.Connection
 Set cn = New ADODB.Connection
 
 ' Abrir la conexión, especificando el nombre del origen de datos,
 ' id de usuario, y contraseña.
 cn.Open "DSNPubs", "sa", ""
 
 ' Si la conexión está abierta, lo muestra.
 If cn.State = adStateOpen Then
 Debug.Print "Conexión abierta."
 End If
 
 ' Cerrar la conexión.
 cn.Close
 
End Sub
Abrir y cerrar una conexión con una base de datos SQL Server usando el proveedor OLEDB para SQL Server que es el proveedor recomendado

Private Sub ConnectionExemple2()
 Dim cn As New ADODB.Connection

 cn.Provider = "SQLOLEDB"
 cn.Open "Data Source=MySQLServerName;Initial Catalog=pubs;", "sa", ""

 ' Si la conexión está abierta, lo muestra.
 If cn.State = adStateOpen Then
 Debug.Print "Conexión abierta."
 End If

 ' Cerrar la conexión.
 cn.Close
 Set cn = Nothing

End Sub
 Abrir y cerrar un Recordset

 
 Sub RecordsetExample() Dim rs As
 
 New ADODB.Recordset ' Abrir el recordset, especificando la 
 sentencia SQL ' y la cadena
 de conexión. rs.Open "Select * fromtitles","DSN=pubs;UID=sa"
 
 ' Bucle a través del recordset e impresión del primer campo.
 Do While Not rs.EOF
 Debug.Print rs(0)
 rs.MoveNext
 Loop
 
 ' Cerrar el recordset.
 rs.Close
End Sub
 Usar el método Execute del objeto Command para ejecutar una consulta de tipo texto

Sub CommandExample()
 Dim cmd As New ADODB.Command
 Dim rs As New ADODB.Recordset

 ' Establecer el comando conexión usando una cadena de conexión.
 cmd.ActiveConnection = "DSN=pubs;UID=sa"
 ' Establecer el comando texto, y especificar que es
 ' una sentencia SQL.
 cmd.CommandText = "Select * from titles"
 cmd.CommandType = adCmdText

 ' Crear un recordset.
 Set rs = cmd.Execute()
 
 ' Bucle a través del recordset e impresión del primer campo.
 Do While Not rs.EOF
 Debug.Print rs(0)
 rs.MoveNext
 Loop
 
 ' Cerrar el recordset.
 rs.Close

End Sub
 Usar el método Execute del objeto Command para ejecutar un procedimiento de almacenado

Sub ParameterExample() 
    Dim cmd As New ADODB.Command 
    Dim rs As New ADODB.Recordset 
    Dim prm As ADODB.Parameter 

 ' Establecer el comando conexión usando una cadena de conexión.
cmd.ActiveConnection = "DSN=pubs;uid=sa" 

 ' Establecer el comando texto, y especificar que es
 ' una sentencia SQL.
cmd.CommandText = "byroyalty" 
cmd.CommandType = adCmdStoredProc 

' Establecer un nuevo parámetro para el procedimiento guardado.
Set prm = cmd.CreateParameter("Royalty", adInteger, adParamInput, , 50) 
cmd.Parameters.Append prm 

 ' Crear un recordset.
Set rs = cmd.Execute 

 ' Bucle a través del recordset e impresión del primer campo.
Do While Not rs.EOF Debug.Print rs(0) 
        rs.MoveNext 
Loop 

' Cerrar el recordset. 
rs.Close

End Sub
      
Almacenar los resultados de una consulta Access en un fichero Excel

Private Sub Command1_Click()
Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
     c:\bd1.mdb" cn.Execute "Select * into 
            [Excel8.0];Database=c:\Test1.xls;Hdr=Yes].[Sheet3] From Clients"
    cn.Close
    Set cn = Nothing
End Sub
 
' Explorar la colección Errors.
Sub ErrorExample()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
On Error GoTo AdoError
 
' Abrir la conexión usando un DSN que no existe.
cn.Open "MissingDSN", "sa", ""
 
    Exit Sub

AdoError:
    Dim Errs As ADODB.Errors
    Dim errLoop As Error
Dim strError As String

' Bucle hasta el objeto Error en la
' colección Errors y muestra las propiedades.
Set Errs = cn.Errors
For Each errLoop In Errs
        Debug.Print errLoop.SQLState
        Debug.Print errLoop.NativeError
        Debug.Print errLoop.Description
Next

End Sub
Enumerar los campos (nombre, tipo y valor) de un recordset

 Sub FieldExample()
 Dim rs As ADODB.Recordset
 Dim fld As ADODB.Field

 Set rs =  
 New ADODB.Recordset ' Abrir el recordset, especificando la 
 sentencia SQL ' y la cadena
 de conexión. rs.Open "Select * fromauthors","DSN=pubs;UID=sa"
 
 Debug.Print "Fields in Authors Table:" & vbCr

 ' Bucle hasta el objeto Field en la
 ' Colección Fields de la tabla y muestra las propiedades.
 For Each fld In rs.Fields
 Debug.Print "Name: " & fld.Name & vbCr & _
 "Type: " & fld.Type & vbCr & _
 "Value: " & fld.Value
 Next fld

 ' Cierre del recordset.
 rs.Close

End Sub
Mostrar los valores de ciertas propiedades de una conexión (el curso de la colección de Properties)

Sub PropertyExample() 
    Dim cn As New ADODB.Connection 
Dim cmd As New ADODB.Command 
Dim rs As New ADODB.Recordset 

' Abrir la conexión, especificando el nombre del origen de datos,
' id del usuario, u contraseña.
cn.Open "pubs", "sa" 

' Establecer el comando conexión usando una cadena de conexión.
Set cmd.ActiveConnection = cn 
' Establecer el comando texto, especificando que es una sentencia SQL. 
cmd.CommandText = "Select * from titles" 
cmd.CommandType = adCmdText 

' Crear el recordset. 
Set rs = cmd.Execute() 

' Muestra la propiedad ConnectionTimeout de la conexión. 
Debug.Print cn.Properties("Connect Timeout")

' Muestra la propiedad  CommandTimeout del comando. 
Debug.Print cmd.Properties("Command Time out") 

' Muestra la propiedad  Updatability del recordset. 
Debug.Print rs.Properties("Updatability") 

' Cierra el recordset. 
rs.Close
End Sub

Las cadenas de conexión
Si necesita escribir una cadena de conexión, existe una manera de generarla con el asistente de creación de una conexión de datos.
Se puede usar esta herramienta de creación de conexiones de datos en VB:
  • Utilize el menú Ver y seleccione Ventana de la vista Datos
  • Cree un Entorno de datos haciendo clic en el botón derecho en la ventana de datos.
  • En la ventana Entorno de datos, hacer clic en el botón derecho sobre Connection1 para ver las características de la conexión (el proveedor, DSN, las propiedades específicas).
  • Probar la conexión antes de hacer clic en el botón de Aceptar
  • Entrar en la ventana de propiedades y seleccionar el objeto Connection1: La propiedad DataSource contiene la cadena de conexión necesaria.