RemoteData (Control)

Proporciona acceso a datos almacenados en un origen de datos ODBC remoto mediante controles enlazados. El control RemoteData le permite desplazarse de una fila a otra dentro del conjunto de resultados, así como presentar y manipular datos de las filas de los controles enlazados.

Sintaxis

RemoteData

Comentarios

El control RemoteData proporciona una interfaz entre Objetos de datos remotos (RDO) y controles enlazados a datos. Con el control RemoteData puede:

  • Establecer una conexión con un origen de datos basándose en sus propiedades.

  • Crear un objeto rdoResultset.

  • Pasar los datos de la fila actual a los controles enlazados correspondientes.

  • Permitir que el usuario sitúe el puntero de la fila actual.

  • Devolver al origen de datos las modificaciones realizadas en los controles enlazados.

Introducción

Sin un control RemoteData, un control Data o su equivalente, los controles enlazados a datos de un formulario no pueden tener acceso a los datos de forma automática. Los controles RemoteData y Data son ejemplos de controles DataSource. Mediante los controles DataSource puede realizar la mayoría de las operaciones de acceso a datos remotos sin escribir nada de código. Los controles enlazados a datos mediante un control DataSource presentan automáticamente datos de una o varias columnas de la fila actual o, en algunos casos, de un conjunto de filas a ambos lados de la fila actual. Los controles DataSource realizan todas las operaciones en la fila actual.

El control de origen de datos RemoteData

Si al control RemoteData se le hace pasar a una fila diferente, todos los controles enlazados pasarán automáticamente todos los cambios al control RemoteData para que se guarden en el origen de datos ODBC. El control RemoteData se desplaza después a la fila solicitada y pasa los datos de la fila actual a los controles enlazados, donde se presentan.

El control RemoteData trata automáticamente una serie de contingencias entre las que se incluyen conjuntos de resultados vacíos, inserción de nuevas filas, modificación y actualización de filas existentes, conversión y la presentación de tipos de datos complejos y tratamiento de algunos tipos de errores. Sin embargo, en las aplicaciones más sofisticadas, debe interceptar algunas condiciones de error que el control RemoteData no puede tratar. Por ejemplo, si el servidor remoto tiene algún problema al tener acceso al origen de datos, el usuario no tiene permiso o no se puede ejecutar la consulta tal y como está programada, se produce un error interceptable. Si el error se produce antes de que se inicien los procedimientos de la aplicación o como resultado de errores internos, se produce el evento Error.

Funcionamiento

Utilice las propiedades del control RemoteData para describir el origen de datos, establecer una conexión y especificar el tipo de cursor que va a crear. Si modifica estas propiedades después de crear el conjunto de resultados, utilice el método Refresh para volver a crear el rdoResultset subyacente de acuerdo con los nuevos valores de las propiedades.

El control RemoteData se comporta en muchos aspectos como el control Data del motor Jet. Las siguientes recomendaciones ilustran algunas diferencias que se aplican al establecer la propiedad SQL.

La propiedad SQL del control RemoteData puede tratarse como la propiedad RecordSource del control Data, excepto en que no puede aceptar el nombre de una tabla por sí mismo, a menos que pueble antes la colección rdoTables. Normalmente, la propiedad SQL especifica una consulta SQL. Por ejemplo, en lugar de "Authors" tendría que escribir "SELECT * FROM AUTHORS", que ofrece la misma funcionalidad. Sin embargo, la especificación de una tabla de esta manera no es una buena forma de programar, ya que tiende a devolver demasiadas filas y puede agotar fácilmente los recursos de la estación de trabajo o bloquear grandes segmentos de la base de datos.

Puede que el conjunto de resultados creado por el control RemoteData no se encuentre en el mismo orden que el Recordset creado por el control Data. Por ejemplo, si el valor de la propiedad RecordSource del control Data es "Authors" y el valor de la propiedad SQL del control RemoteData es "SELECT * FROM AUTHORS", el primer registro devuelto por Jet al control Data viene determinado por el primer índice disponible de la tabla Authors. Sin embargo, el control RemoteData devuelve la primera fila que le devuelva el motor de base de datos remoto según el orden físico de las filas dentro de la base de datos, sin usar índices. En algunos casos, el orden de los registros podría coincidir, pero no siempre.

Esta diferencia de comportamiento puede afectar al modo en que los controles enlazados administran las filas resultantes, especialmente los controles enlazados de varias filas como el control DataGrid. Puede manipular el control RemoteData con el mouse (ratón) para mover el puntero de la fila actual de una fila a otra o al principio o al final del objeto rdoResultset, haciendo clic en el control. Al manipular los botones del control RemoteData, el puntero de la fila actual cambia su posición dentro del objeto rdoResultset. No puede sobrepasar los límites del rdoResultset mediante el mouse. Tampoco puede establecer el enfoque en el control RemoteData.

Otras características

Puede usar los objetos creados por el control RemoteData para crear objetos rdoConnection, rdoResultset o rdoQuery adicionales.

Puede establecer la propiedad Resultset del control RemoteData a un objeto rdoResultset creado independientemente del control. Si lo hace, se restablecen las propiedades del control RemoteData de acuerdo con los nuevos rdoResultset y rdoConnection.

Puede establecer la propiedad Options para permitir la creación asíncrona de un objeto rdoResultset (rdAsyncEnable) o para ejecutar la consulta sin crear un procedimiento almacenado temporal (rdExecDirect).

El evento Validate se produce antes de cada cambio de posición del puntero de la fila actual. Puede decidir aceptar las modificaciones realizadas en los controles enlazados o cancelar esta operación, utilizando el argumento acción del evento Validate.

El control RemoteData también puede administrar lo que sucede cuando se encuentra un objeto rdoResultset sin filas. Modificando la propiedad EOFAction puede programar el control RemoteData para pasar automáticamente al modo AddNew.

Nota Si tiene un control Image enlazado a una imagen contenida en un campo del control RemoteData y el control RemoteData usa cursores de tipo batch (es decir, CursorDriver = rdUseClientBatch), el control Image no muestra la imagen.

Funcionamiento desde programas

Para crear un objeto rdoResultset mediante programa con el control RemoteData:

  • Establezca las propiedades del control RemoteData para que describan las características deseadas del objeto rdoResultset.

  • Utilice el método Refresh para iniciar el proceso automático o para crear el nuevo objeto rdoResultset. Se descarta cualquier objeto rdoResultset existente.

Todas las propiedades del control RemoteData y el nuevo objeto rdoResultset pueden manipularse de forma independiente del control RemoteData, con o sin controles enlazados. Cada uno de los objetos rdoConnection y rdoResultset tienen sus propias propiedades y métodos, que pueden usarse en los procedimientos que escriba.

Por ejemplo, el método MoveNext de un objeto rdoResultset mueve la fila actual a la fila siguiente dentro del objeto rdoResultset. Para invocar este método con un objeto rdoResultset creado por un control RemoteData, podría usar este código:

RemoteData1.Resultset.MoveNext

Los conjuntos de resultados no actualizan automáticamente los controles enlazados

Asignar un control RemoteData (RDC) no actualiza los controles enlazados. Cuando enlaza un control al conjunto de resultados de un RDC, el conjunto de resultados no se muestra de forma automática en el control. Para comprobar esto:

  1. Inicie Visual Basic y abra un proyecto EXE estándar.

  2. Establezca una referencia a un control RDC.

  3. Sitúe un control RDC en el formulario.

  4. Sitúe un control TextBox en el formulario.

  5. Establezca las siguientes propiedades de TextBox:

    DataSource: MSRDC1

    DataField: au_lname

  6. Sitúe un control CommandButton en el formulario y agregue el código siguiente al evento Click:
    Dim cn As New rdoConnection
cn.Connect = _
"dsn=pinkpearl;database=rdobugs;uid=rdo;pwd="
cn.EstablishConnection
Set MSRDC1.Resultset = cn.OpenResultset("select * _
from authors]")
  7. Ejecute el proyecto (F5).

  8. Haga clic en CommandButton.

Puede comprobar que el control enlazado no se rellena con los datos que esperaba. Debe usar el comando MSRDC1.Refresh para que se rellene el control enlazado, que provoca que el servidor envíe el conjunto de resultados completo otra vez. (Tenga en cuenta que esto puede llevar bastante tiempo en algunas ocasiones.)

Para solucionar este problema, establezca cualquier campo de datos de un control enlazado después de establecer el conjunto de resultados en el código. Por ejemplo, después de la línea:

Set MSRDC1.Resultset = cn.OpenResultset("select * _
from authors]")

debería agregar:

Text1.DataField = "au_lname"

que obliga a que el administrador de enlaces establezca y actualice los enlaces, lo que rellena el control enlazado con datos.

Un control Image enlazado o un control PictureBox no muestran la propiedad Picture cuando RDC usa cursores Batch

Cuando está usando un control Image o PictureBox enlazado a una imagen contenida en un campo de un RDC y el RDC usa cursores batch (CursorDriver = rdUseClientBatch), tenga en cuenta que el control Image o PictureBox no mostrará la imagen. Para visualizar correctamente la imagen, puede establecer la propiedad Options del RDC a 128 (rdFetchLongColumns) o usar un cursor diferente.

No usar conjuntos de resultados de tipo forward-only

Cuando intenta asignar un conjunto de resultados de tipo forward-only a un control RDC, se produce un error "objeto no válido". Para ver esta situación:

  1. Inicie Visual Basic.

  2. Sitúe un control RemoteData en Form1.

  3. Agregue una referencia a RDO mediante el comando Referencias del menú Proyecto.

  4. Agregue el código siguiente al evento Form_Load:
    Dim x as new rdoConnection
Dim y as rdoQuery
x.Connect = "DSN=Union;UID=rdo;PWD="
x.EstablishConnection
Set y = x.CreateQuery("Query1", "SELECT * FROM _
authors")
x.Query1
' error de objeto no válido en la línea siguiente
Set MSRDC1.Resultset = x.LastQueryResults
  5. Presione F5.

Este error sucede porque se usa un conjunto de resultados de tipo forward-only que no se puede asignar a un RDC. Para asignar un conjunto de resultados a un RDC, debe ser de tipo keyset o static. Por ejemplo:

Dim x As New rdoConnection
Dim y As rdoQuery
x.Connect = "DSN=Union;database=rdobugs;UID=rdo;PWD="
  x.EstablishConnection
Set y = x.CreateQuery("Query1", "SELECT * FROM _
  authors")
y.CursorType = rdOpenKeyset
y.LockType = rdConcurRowVer
x.Query1
Set MSRDC1.Resultset = x.LastQueryResults


No se encuentra el tema

No se halló el tema correspondiente. A continuación enumeramos algunas posibles razones y sus soluciones:

  • El archivo (.chm) que contiene el tema de destino no se encuentra en la ubicación esperada.

    Solución: vuelva a ejecutar la instalación de la Biblioteca MSDN.

  • El archivo (.chm) que contiene el tema actual o el de destino no está actualizado y el vínculo ya no es válido.

    Solución: instale la última versión de la Biblioteca MSDN.

  • El CD de la Biblioteca MSDN no está en la unidad de CD-ROM.

    Solución: inserte el CD en la unidad.


conjunto de resultados disociados

Objeto rdoResultset que no está asociado con una conexión específica. Básicamente, los conjuntos de resultados disociados se convierten en instantáneas estáticas de datos. Es actualizable, pero los cambios no se envían a la base de datos remota hasta que el objeto rdoResultset vuelva a asociarse con una conexión específica.


consulta de múltiples conjuntos de resultados

Consulta que contiene varias consultas de selección y devuelve varios conjuntos de resultados. Las consultas de múltiples conjuntos de resultados también pueden contener una combinación de consultas de selección y de acciones.


lote optimista

Conjunto de filas remitido al servidor remoto para procesarlas como una unidad. En este caso se supone que hay pocas posibilidades de colisiones en la actualización o la inserción.


consultas con parámetros

Consulta que requiere uno o varios parámetros o argumentos antes de su ejecución. Por ejemplo, una instrucción SQL que haga referencia a un número de pieza específico suministrado por el usuario usaría una consulta con parámetros para insertar el número proporcionado por el usuario en una instrucción SQL antes de su ejecución, de forma que la consulta haga referencia a esa pieza concreta.


conjunto de resultados

Es el resultado de una consulta. Los conjuntos de resultados pueden contener filas cuando una consulta contiene una instrucción SELECT. Las consultas de acciones no devuelven filas pero devuelven conjuntos de resultados que contienen información acerca de la operación, como por ejemplo las filas afectadas.


objeto independiente

En RDO, puede crear objetos rdoConnection y rdoQuery utilizando:

Dim X as New rdoxxxx

Cuando se hace esto, se crea un objeto independiente. Es posible manipular las propiedades de dicho objeto que no dependan del acceso a una conexión o a otros objetos.


Ejemplo de la propiedad hEnv

El ejemplo siguiente ilustra el uso de la propiedad hEnv al tener acceso a una función de la API de ODBC. El código muestra todos los nombres de orígenes de datos (DSN) registrados en un control ListBox.

Private Sub ShowDSNs_Click()
Dim fDirection As Integer
Dim szDSN As String * 1024
Dim cbDSNMax As Integer
Dim pcbDSN As Integer
Dim szDescription As String * 1024
Dim cbDescriptionMax As Integer
Dim pcbDescription As Integer
Dim Item As String
Set En = rdoEnvironments(0)
fDirection = SQL_FETCH_NEXT
cbDSNMax = 1023
cbDescriptionMax = 1023
List1.Clear
I = SQL_SUCCESS
 While I = SQL_SUCCESS
     szDSN = String(1024, " ")
     szDescription = String(1024, " ")
     I = SQLDataSources(En.hEnv, fDirection, szDSN, _
     cbDSNMax, pcbDSN, szDescription, _
     cbDescriptionMax, pcbDescription)
     Item = Left(szDSN, pcbDSN) & " - "  _
      & Left(szDescription, pcbDescription)
     Debug.Print Item
     List1.AddItem Item
 Wend

End Sub


Constantes de la propiedad Attributes

Estas constantes se usan con la propiedad Attributes para determinar las características de objetos rdoColumn específicos.

Constante | Valor | Descripción
rdFixedColumn | 1 | El tamaño de la columna es fijo (valor predeterminado para columnas numéricas). Para columnas de caracteres indica que la columna está definida como rdTypeCHAR.
rdVariableColumn | 2 | El tamaño de la columna es variable (sólo columnas de caracteres). Indica que la columna está definida como rdTypeVARCHAR.
rdAutoIncrColumn | 16 | El valor de la columna para nuevas filas se incrementa automáticamente a un entero Long único que no puede modificarse.
rdUpdatableColumn | 32 | El valor de la columna puede modificarse.
rdTimestampColumn | 64 | La columna se define como TimeStamp administrada por el sistema.


Constantes de la propiedad BOFAction

Estas constantes se usan con la propiedad BOFAction del control RemoteData para determinar cómo se comporta RDO cuando se cambia el estado de la propiedad BOF del objeto rdoResultset.

Constante | Valor | Descripción
rdMoveFirst | 0 | MoveFirst (predeterminado): mantiene la primera fila como la fila actual.
rdBOF | 1 | BOF: al desplazarse más allá del principio de un rdoResultset se desencadena el evento Validate del control RemoteData en la primera fila, seguido de un evento Reposition en la fila no válida (BOF). En este momento, el botón Mover anterior del control RemoteData está desactivado.


Constantes de la propiedad CursorDriver, rdoDefaultCursorDriver

Estas constantes se usan para determinar qué tipo de biblioteca de cursores RDO elige el Administrador de controladores ODBC.

Constante | Valor | Descripción
rdUseIfNeeded | 0 | El controlador ODBC elige el estilo de cursores adecuado. Si están disponibles, se usan los cursores del servidor.
rdUseOdbc | 1 | El nivel RDO usará la biblioteca de cursores de ODBC. Ofrece mejor rendimiento para conjuntos de resultados pequeños pero lo empeora considerablemente para conjuntos de resultados mayores.
rdUseServer | 2 | Utiliza cursores en el lado del servidor. Para la mayoría de las operaciones grandes ofrece un mejor rendimiento, pero puede originar más tráfico de red.
rdUseClientBatch | 3 | Usa la biblioteca de cursores por lotes del cliente utilizada para operaciones de actualización por lotes.
rdUseNone | 4 | No abre ningún cursor. Crea un conjunto de resultados de una única fila de sólo lectura y sólo hacia adelante. Usa técnicas de extracción de acceso a datos similares a las utilizadas por los métodos de acceso de API VBSQL y ODBC.


Constantes de la propiedad Direction

Estas constantes se usan para determinar cómo se administrarán los parámetros individuales cuando se usen en consultas con parámetros.

Constante | Valor | Descripción
rdParamInput | 0 | (Predeterminado) El parámetro se usa para pasar información al procedimiento.
rdParamInputOutput | 1 | El parámetro se usa para pasar información hacia y desde el procedimiento.
rdParamOutput | 2 | El parámetro se usa para devolver información desde el procedimiento como en un parámetro de salida de SQL.
rdParamReturnValue | 3 | El parámetro se usa para pasar el valor devuelto de un procedimiento.


Constantes de la propiedad EditMode

Estas constantes se usan para determinar el estado de la propiedad EditMode de RDO.

Constante | Valor | Descripción
rdEditNone | 0 | No se está realizando ninguna operación de modificación.
rdEditInProgress | 1 | Se ha llamado al método Edit y la fila actual está en el búfer de copia.
rdEditAdd | 2 | Se ha llamado al método AddNew y la fila actual del búfer de copia es una fila nueva que no se ha guardado en la base de datos.


Constantes de la propiedad EOFAction

Estas constantes se usan con la propiedad EOFAction del control RemoteData para determinar cómo se comporta RDO cuando cambia el estado de la propiedad EOF del objeto rdoResultset.

Constante | Valor | Descripción
rdMoveLast | 0 | MoveLast (predeterminado): mantiene la última fila como fila actual.
rdEOF | 1 | EOF: al desplazarse más allá del final de un rdoResultset se desencadena el evento Validation del control RemoteData en la última fila, seguido de un evento Reposition en la fila no válida (EOF). En este momento, el botón Mover siguiente del control RemoteData está desactivado.
rdAddNew | 2 | AddNew: al desplazarse más allá de la última fila se desencadena el evento Validation del control RemoteData en la fila actual, seguido de un AddNew automático y de un evento Reposition en la nueva fila.


Constantes del evento Error

Estas constantes se usan para determinar cómo debe tratar RDO el mensaje generado por el evento Error. Se aplican al argumento CancelDisplay.

Constante | Valor | Descripción
rdDataErrContinue | 0 | Continúa y no muestra automáticamente el mensaje de error.
rdDataErrDisplay | 1 | (Predeterminado) Muestra el mensaje de error.


Constantes de la propiedad Prompt, argumento Prompt del método OpenConnection y EstablishConnection

Estas constantes se usan para determinar cómo el Administrador de controladores ODBC indica al usuario cuándo se establece una conexión mediante los métodos OpenConnection o EstablishConnection, o mediante el control RemoteData.

Constante | Valor | Descripción
rdDriverPrompt | 0 | El administrador de controladores muestra el cuadro de diálogo Orígenes de datos ODBC (Open Database Connectivity, Conectividad abierta de bases de datos). La cadena de conexión usada para establecer la conexión se construye a partir del nombre del origen de datos (DSN) seleccionado y lo completa el usuario mediante cuadros de diálogos. O bien, si no se elige ningún DSN y la propiedad DataSourceName está en blanco, se usa el DSN predeterminado.
rdDriverNoPrompt | 1 | El administrador de controladores ODBC usa la cadena de conexión proporcionada en conexión. Si no se proporciona información suficiente, el método OpenConnection devuelve un error interceptable.
rdDriverComplete | 2 | Si la cadena de conexión proporcionada incluye la palabra clave DSN, el administrador de controladores usa la cadena como se proporcionó en conexión; de lo contrario, se comporta como si se especificara rdDriverPrompt.
rdDriverCompleteRequired | 3 | (Predeterminado) Se comporta como rdDriverComplete, excepto en que el controlador desactiva los controles de la información no necesaria para completar la conexión.


Constantes del argumento LockType del método OpenResultset, propiedad LockType

Estas constantes se usan para determinar cómo administra la concurrencia RDO en objetos rdoResultset creados con el método OpenResultset o el control RemoteData.

Constante | Valor | Descripción
rdConcurReadOnly | 1 | (Predeterminado) El cursor es de sólo lectura. No se permiten actualizaciones.
rdConcurLock | 2 | Concurrencia pesimista. El cursor usa el nivel de bloqueo más bajo suficiente para garantizar la actualización de la fila.
rdConcurRowVer | 3 | Concurrencia optimista basada en el identificador de fila. El cursor compara el identificador de fila en las filas antigua y nueva para determinar si se han efectuado cambios desde la última vez que se tuvo acceso a la fila.
rdConcurValues | 4 | Concurrencia optimista basada en valores de fila. El cursor compara los datos de las filas antigua y nueva para determinar si se han efectuado cambios desde la última vez que se tuvo acceso a la fila.
rdConcurBatch | 5 | Operación en modo por lotes optimista. Sólo puede usarse cuando CursorDriver se establece a rdUseClientBatch.


Constantes del argumento Type del método OpenResultset y de las propiedades Type y ResultsetType

Estas constantes se usan para determinar el tipo de cursor creado por la biblioteca de cursores seleccionada.

Constante | Valor | Descripción
rdOpenForwardOnly | 0 | Abre un objeto rdoResultset de tipo forward only. (Predeterminado)
rdOpenKeyset | 1 | Abre un objeto rdoResultset de tipo keyset.
rdOpenDynamic | 2 | Abre un objeto rdoResultset de tipo dinámico.
rdOpenStatic | 3 | Abre un objeto rdoResultset de tipo estático.


Constantes de la propiedad Options y del argumento Options de los métodos Execute y OpenResultset

Estas constantes se usan para determinar cómo debe procesar RDO los métodos Execute y OpenResultset, y crear objetos rdoResultset mediante el control RemoteData.

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecuta la operación de forma asíncrona.
rdExecDirect | 64 | Ejecuta la consulta mediante SQLExecDirect en lugar de SQLPrepare o SQLExecute. La propiedad Prepared del objeto rdoQuery también controla esta característica.
rdFetchLongColumns | 128 | Descarga todos los datos para columnas de caracteres largos y binarios largos.


Constantes de la propiedad Type, objeto rdoQuery

Estas constantes se usan para determinar la función de un objeto rdoQuery específico.

Constante | Valor | Descripción
rdQSelect | 0 | La consulta contiene una o más instrucciones de selección
rdQAction | 1 | La consulta contiene una o más instrucciones Update, Insert o Delete
rdQProcedures | 2 | La consulta contiene una o más llamadas a procedimientos almacenados
rdQCompound | 3 | La consulta contiene instrucciones de acción y selección


Constantes de la propiedad rdoLocaleID

Estas constantes se usan para determinar qué idioma debe usar RDO cuando se generen mensajes de error.

Constante | Valor | Descripción
rdLocaleSystem | 0 | Sistema
rdLocaleEnglish | 1 | Inglés
rdLocaleFrench | 2 | Francés
rdLocaleGerman | 3 | Alemán
rdLocaleItalian | 4 | Italiano
rdLocaleJapanese | 5 | Japonés
rdLocaleSpanish | 6 | Español
rdLocaleChinese | 7 | Chino
rdLocaleSimplifiedChinese | 8 | Chino simplificado
rdLocaleKorean | 9 | Coreano


Constantes de datos remotos

RDO proporciona constantes incorporadas que puede usar con métodos, propiedades y eventos. Todas estas constantes comienzan con las letras "rd" y se documentan con el evento, método o propiedad a que se aplican. Estas constantes se usan también con las propiedades del control RemoteData.

Puede usarse el Examinador de objetos para examinar la lista de constantes incorporadas. En el menú Ver, elija Examinador de objetos y seleccione la biblioteca apropiada. Desplace la lista de la parte Clases del cuadro de diálogo para ver los grupos de constantes. Para encontrar una constante determinada, use la ventana de búsqueda para encontrar un grupo o constante específico.

Constantes de datos remotos | Descripción – Determina:
Attributes (propiedad) | Características del objeto rdoColumn.
BOFAction (propiedad) | Opciones de principio de archivo.
CursorDriver (propiedad) | Tipo de biblioteca de cursores.
Estado de columna | Estado de actualización de columna en modo por lotes.
Tipo de datos | Tipo de datos.
Direction | Tipo de parámetro.
EditMode | Estado de Edit o AddNew.
EOFAction | Opciones de fin de archivo.
Error (evento) | Tratamiento de mensajes de error.
LockType | Tipo de administración de concurrencia.
Option | Opciones de procesamiento.
Prompt | Indicación del administrador de controladores ODBC.
QueryType | Tipo de consulta.
rdoDefaultCursorDriver (propiedad) | Tipo de biblioteca de cursores.
rdoLocaleID | Idioma de los mensajes de error.
ResultsetType | Tipo de cursor.
Estado de fila | Estado de actualización de fila en modo por lotes.
SQLRetCode | Códigos de retorno ODBC.
Status (rdoColumn) | Estado de actualización de columna en modo por lotes.
Status (rdoResultset) | Estado de actualización de fila en modo por lotes.
Type (rdoColumn, rdoParameter) | Tipo de datos.
Type (rdoQuery) | Función de consulta.
UpdateCriteria | Cláusula WHERE de actualización por lotes.
UpdateOperation | Operación de actualización por lotes.
UpdateReturnCode | Estado de actualización por lotes completada.
Validate | Constantes de validación de datos.


Constantes del argumento ReturnCode

Estas constantes se usan para determinar cómo administra RDO las operaciones de actualización cuando se produce el evento WillUpdateRows. El parámetro ReturnCode se usa para informar a RDO de qué hizo el código del procedimiento de evento.

Constante | Valor | Descripción
rdUpdateSuccessful | 0 | El programador controló la actualización y se llevó a cabo correctamente.
rdUpdateWithCollisions | 1 | El programador controló la actualización, se llevó a cabo correctamente, pero algunas filas produjeron colisiones (sólo en modo por lotes).
rdUpdateFailed | 2 | El programador intentó controlar la actualización, pero encontró un error al hacerlo.
rdUpdateNotHandled | 3 | El programador no controló la actualización, RDO debe continuar informando y si nadie controla la actualización, RDO debería actualizar los datos por sí mismo.


Constantes de la propiedad SqlRetCode

Estas constantes se usan para determinar cómo se comportó la operación RDO más reciente según se indica en el objeto rdoError.

Constante | Valor | Descripción
rdSQLSuccess | 0 | La operación se ha llevado a cabo correctamente.
rdSQLSuccessWithInfo | 1 | La operación se ha llevado a cabo correctamente y hay disponible información adicional.
rdSQLNoDataFound | 100 | No hay disponibles datos adicionales.
rdSQLError | -1 | Ha ocurrido un error al ejecutar la operación.
rdSQLInvalidHandle | -2 | El controlador que se ha proporcionado no es válido.


Constantes de la propiedad Status, objeto rdoColumn

Estas constantes se usan para determinar cómo se vieron afectados determinados objetos rdoColumn por el último método BatchUpdate.

Constante | Valor | Descripción
rdColUnmodified | 0 | La columna no se ha modificado o se ha actualizado correctamente.
rdColModified | 1 | La columna se ha modificado.


Constantes de la propiedad Status, objeto rdoResultset

Estas constantes se usan para determinar cómo se vieron afectadas determinadas filas del rdoResultset por el último método BatchUpdate.

Constante | Valor | Descripción
rdRowUnmodified | 0 | La fila no se ha modificado o se ha actualizado correctamente.
rdRowModified | 1 | La fila se ha modificado pero no se ha actualizado en la base de datos.
rdRowNew | 2 | La fila se ha insertado con el método AddNew pero aún no se ha insertado en la base de datos.
rdRowDeleted | 3 | La fila se ha eliminado pero aún no se ha eliminado de la base de datos.
rdRowDBDeleted | 4 | La fila se ha eliminado localmente y en la base de datos.


Constantes de la propiedad Type, objetos rdoColumn y rdoParameter

Estas constantes se usan para determinar el tipo de datos de determinadas columnas de un objeto rdoResultset.

Constante | Valor | Descripción
rdTypeCHAR | 1 | Cadena de caracteres de longitud fija n (1≤ n ≤254). La longitud se establece mediante la propiedad Size.
rdTypeNUMERIC | 2 | Valor numérico exacto con signo, de precisión p y escala e (1 ≤ p ≤15; 0 ≤ e ≤ p).
rdTypeDECIMAL | 3 | Valor numérico exacto con signo, de precisión p y escala s (1 ≤ p ≤15; 0 ≤ e ≤ p).
rdTypeINTEGER | 4 | Valor numérico exacto con signo, de precisión 10 y escala 0 (con signo: -231 ≤ n ≤ 231-1; sin signo: 0 ≤ n ≤ 232-1).
rdTypeSMALLINT | 5 | Valor numérico exacto con signo, de precisión 5 y escala 0 (con signo: -32,768 ≤ n ≤ 32,767, sin signo: 0 ≤ n ≤ 65,535).
rdTypeFLOAT | 6 | Valor numérico aproximado con signo, con precisión de mantisa 15 (valor cero o absoluto 10-308 a 10308).
rdTypeREAL | 7 | Valor numérico aproximado con signo, con precisión de mantisa 7 (valor cero o absoluto 10-38 a 1038).
rdTypeDOUBLE | 8 | Valor numérico aproximado con signo, con precisión de mantisa 15 (valor cero o absoluto 10-308 a 10308).
rdTypeDATE | 9 | Fecha, dependiente del origen de datos.
rdTypeTIME | 10 | Hora, dependiente del origen de datos.
rdTypeTIMESTAMP | 11 | Marca de hora, dependiente del origen de datos.
rdTypeVARCHAR | 12 | Cadena de caracteres de longitud variable. La longitud máxima depende del DBMS.
rdTypeLONGVARCHAR | -1 | Cadena de caracteres de longitud variable. Longitud máxima está determinada por el origen de datos.
rdTypeBINARY | -2 | Datos binarios de longitud fija. La longitud máxima depende del DBMS.
rdTypeVARBINARY | -3 | Datos binarios de longitud variable. La longitud máxima depende del DBMS.
rdTypeLONGVARBINARY | -4 | Datos binarios de longitud variable. La longitud máxima depende del origen de datos.
rdTypeBIGINT | -5 | Valor numérico exacto con signo, de precisión 19 (con signo) ó 20 (sin signo), escala 0; (con signo: -263 ≤ n ≤ 263-1; sin signo: 0 ≤ n ≤ 264-1).
rdTypeTINYINT | -6 | Valor numérico exacto con signo, de precisión 3, escala 0; (con signo: -128 ≤ n ≤ 127, sin signo: 0 ≤ n ≤ 255).
rdTypeBIT | -7 | Dígito binario simple.


Constantes de la propiedad UpdateCriteria

Estas constantes se usan para determinar cómo administra RDO las operaciones de actualización cuando se usa el método BatchUpdate.

Constante | Valor | Descripción
rdCriteriaKey | 0 | Usa sólo las columnas clave de la cláusula WHERE de SQL.
rdCriteriaAllCols | 1 | Usa las columnas clave y todas las columnas actualizadas de la cláusula WHERE de SQL.
rdCriteriaAllCols | 2 | Usa las columnas clave y todas las columnas de la cláusula WHERE de SQL.
rdCriteriaTimeStamp | 3 | Sólo usa la columna de marca de hora de la cláusula WHERE de SQL. (Genera un error interceptable si no hay disponible ninguna columna de marca de hora.)


Constantes de la propiedad UpdateOperation

Estas constantes se usan para determinar cómo administra RDO las operaciones de actualización cuando se usa el método BatchUpdate.

Constante | Valor | Descripción
rdOperationUpdate | 0 | Usa una instrucción Update para cada fila modificada.
rdOperationDelIns | 1 | Usa un par de instrucciones Delete e Insert para cada fila modificada.


Constantes del argumento Action del evento Validate

Estas constantes se usan para determinar cómo administra la validación el control RemoteData.

Constante | Valor | Descripción
rdDataActionCancel | 0 | Cancela la operación cuando finaliza el procedimiento Sub.
rdDataActionMoveFirst | 1 | Método MoveFirst.
rdDataActionMovePrevious | 2 | Método MovePrevious.
rdDataActionMoveNext | 3 | Método MoveNext.
rdDataActionMoveLast | 4 | Método MoveLast.
rdDataActionAddNew | 5 | Método AddNew.
rdDataActionUpdate | 6 | Operación Update (no UpdateRow).
rdDataActionDelete | 7 | Método Delete.
rdDataActionFind | 8 | Método Find (evento Validate).
rdDataActionBookmark | 9 | Se ha establecido la propiedad Bookmark.
rdDataActionClose | 10 | Método Close.
rdDataActionUnload | 11 | El formulario se está descargando.
rdDataActionUpdateAddNew | 12 | Actualiza la operación para AddNew (evento Validate).
rdDataActionUpdateModifed | 13 | Actualiza la operación para Edit (evento Validate).
rdDataActionRefresh | 14 | Método Refresh (evento Validate).
rdDataActionCancelUpdate | 15 | Método CancelUpdate (evento Validate).
rdDataActionBeginTransact | 16 | Método BeginTransaction.
rdDataActionCommitTransact | 17 | Método CommitTransaction.
rdDataActionRollbackTransact | 18 | Método RollbackTransaction (evento Validate).
rdDataActionNewParameters | 19 | Método NewParameters.
rdDataActionNewSQL | 20 | Nueva instrucción SQL.


consulta de acciones

Consulta SQL que modifica los datos subyacentes o realiza alguna operación administrativa, como agregar tablas o usuarios nuevos. Las consultas de acciones devuelven el número de filas afectadas en lugar de un conjunto de resultados.


función agregada

Función, como Count, Avg o Sum, que se utiliza en una consulta y que calcula valores. Al escribir expresiones SQL, puede usar las funciones agregadas de SQL para determinar diversas estadísticas.


alias

En Visual Basic, nombre alternativo que se da a un procedimiento externo para evitar conflictos con alguna palabra clave, variable global, constante o nombre de Visual Basic no permitido por las convenciones de nomenclatura estándar.

En SQL, nombre alternativo que se da a una columna o expresión en una instrucción SELECT para hacerla más corta o más comprensible, o para evitar conflictos de nombre cuando se ejecutan consultas SQL que utilicen expresiones que no devuelven nombres, o en una consulta que haga referencia a la misma tabla varias veces.


juego de caracteres ASCII

Juego de caracteres de 7 bits del American Standard Code for Information Interchange (ASCII, Código nacional americano para el intercambio de información), ampliamente utilizado para representar letras y símbolos que se encuentran en los teclados estándar de Estados Unidos. El juego de caracteres ASCII es el mismo que los primeros 128 caracteres (0 – 127) del juego de caracteres ANSI.


asíncrona

Tipo de modo de consulta en el que las consultas SQL devuelven el control inmediatamente, aunque los resultados no estén listos. Esto permite que una aplicación efectúe otros procesos mientras la consulta se termina.


tabla base

Tabla de una base de datos remota. Puede manipular la estructura de una tabla base mediante instrucciones SQL de definición de datos y puede modificar los datos de una tabla base utilizando objetos rdoResultset o consultas de acciones.


marcador

Valor generado por el sistema que identifica la fila actual y que está contenido en la propiedad Bookmark de un objeto rdoResultset. Si asigna el valor de la propiedad Bookmark a una variable y después se desplaza a otra fila, puede volver a hacer que la fila anterior sea la actual si asigna el valor de la variable a la propiedad Bookmark.


booleano

Valor True/False o sí/no. Los valores booleanos se almacenan normalmente en columnas Bit en las bases de datos remotas; sin embargo, algunos orígenes de datos no aceptan este tipo de datos de forma directa.


control enlazado

Control enlazado a datos que proporciona acceso a una o varias columnas específicas de un origen de datos mediante un control Data o RemoteData. Los controles enlazados a datos se pueden asociar con controles RemoteData o Data mediante sus propiedades DataSource y DataField. Cuando un control Data o RemoteData pasa de una fila a la siguiente, todos los controles enlazados conectados con el control Data o RemoteData cambian para presentar datos de las columnas de la fila actual. Cuando los usuarios cambian datos en un control enlazado y después se desplazan a otra fila, los cambios se guardan automáticamente en el origen de datos.


tipo de datos Byte

Tipo de datos fundamental utilizado para almacenar números enteros positivos pequeños dentro del intervalo de 0 a 255.


producto cartesiano

Resultado de la combinación de dos tablas relacionales que produce todas las combinaciones posibles ordenadas de filas de la primera tabla con todas las filas de la segunda.

Generalmente, un producto cartesiano es el resultado de una instrucción SELECT de SQL que hace referencia a dos o más tablas en la cláusula FROM y que no incluye una cláusula WHERE o JOIN que indique cómo se van a combinar las tablas.


distinguir entre mayúsculas y minúsculas

Capacidad de distinguir entre letras mayúsculas y minúsculas. Las búsquedas que distinguen entre mayúsculas y minúsculas buscan texto que coincida exactamente. Tales búsquedas, por ejemplo, considerarán que "ZeroLengthStr" y "zerolengthstr" son diferentes. La distinción entre mayúsculas y minúsculas es una característica de algunos sistemas de administración de bases de datos.


columna

Definir el tipo de datos, tamaño y otros atributos de una columna de un objeto rdoTable o rdoResultset. Todas las columnas tomadas como un conjunto definen una fila de la base de datos. Cada columna individual contiene datos relacionados en cuanto a tipo y propósito a lo largo de la tabla; es decir, la definición de una columna no cambia de una fila a otra.


propiedades de columnas

Atributos de una columna que describen los datos que contiene. Size y Type son ejemplos de dichas propiedades.


confirmar

Aceptar una transacción pendiente. Si utiliza el proceso de transacciones e inicia una transacción, ninguno de los cambios efectuados durante la transacción se escribirán en el origen de datos hasta que confirme (acepte) la transacción.


tiempo de compilación

Momento en que el código fuente se traduce a código ejecutable.


conexión

Vínculo con un origen de datos ODBC.


controlador de conexión

Identifica el almacenamiento de memoria de la información acerca de una conexión en particular. RDO requiere un controlador de conexión antes de conectar con un origen de datos; RDO administra automáticamente los controladores de conexión mediante el objeto rdoConnection. Cada controlador de conexión está asociado a un controlador de entorno. Un controlador de entorno puede tener varios controladores de conexión asociados y puede haber varios entornos.


cadena de conexión

Cadena que se utiliza para especificar un origen de datos y otra información, como el nombre y la contraseña del usuario. La cadena de conexión se asigna normalmente a la propiedad Connect de los objetos rdoConnection o controles RemoteData, o como argumento para el método OpenConnection.


búfer de copia

Ubicación creada por el objeto rdoResultset para el contenido de una fila que se abre para su modificación. El método Edit copia la fila actual al búfer de copia, el método AddNew borra el búfer para una fila nueva y el método Update guarda los datos del búfer de copia en el origen de datos, reemplazando la fila actual o insertando una fila nueva. Cualquier instrucción que restablezca o mueva el puntero de la fila actual, o que cancele la edición, descartará el búfer de copia.


criterios

Conjunto de condiciones que limitan, como = "Dinamarca" (que quiere decir igual a Dinamarca) o > 30000, y que se utilizan para crear una consulta o un filtro que presente un determinado conjunto de filas.


fila actual

Fila de un objeto rdoResultset que puede usar para modificar o examinar datos. Utilice los métodos Move para volver a posicionar la fila actual de un conjunto de filas.

Sólo una fila de un rdoResultset puede ser la fila actual; sin embargo, un rdoResultset puede no tener fila actual. Por ejemplo, después de eliminar la fila actual de un rdoResultset, o cuando un rdoResultset no tiene filas, la fila actual no está definida. En este caso, las operaciones que hacen referencia a la fila actual generan un error interceptable.


transacción actual

Todos los cambios efectuados en un objeto rdoResultset o en un conjunto de filas de una base de datos después de usar el último método BeginTrans y antes de usar el método CommitTrans o RollbackTrans.


cursor

Conjunto lógico de filas administrado por el origen de datos o por el administrador de controladores ODBC. Los cursores reciben dicho nombre porque indican la posición actual dentro del conjunto de resultados, igual que el cursor de la pantalla indica la posición actual.


objetos de acceso a datos (DAO)

Objetos definidos por el motor de base de datos Microsoft Jet. Los objetos de acceso a datos, como Database, TableDef, Recordset y QueryDef, se utilizan para representar objetos que se emplean para organizar y manipular datos dentro del código.


control RemoteData

Proporciona acceso a los datos almacenados en un origen de datos ODBC remoto. El control RemoteData le permite pasar de una fila a otra dentro de un conjunto de resultados, así como presentar y manipular los datos de las filas mediante controles enlazados.


base de datos

Conjunto de datos relacionados con un tema o propósito concreto. Las bases de datos contienen tablas y también pueden contener consultas y relaciones entre tablas, así como criterios de validación de tablas y columnas.


administración de bases de datos

Actividades necesarias para crear, administrar y conservar la integridad y la seguridad de una base de datos, como el mantenimiento de los permisos de usuario, y la copia de seguridad y la reparación de la base de datos.


motor de base de datos

Parte del sistema de administración de bases de datos que obtiene y almacena datos en bases de datos de usuario y de sistema.


sistema de administración de bases de datos (DBMS)

Software utilizado para organizar, analizar y modificar la información almacenada en una base de datos. Por ejemplo, Microsoft SQL Server es un ejemplo de sistema de administración de bases de datos.


objeto rdoConnection (definición)

Representa una conexión abierta con un origen de datos remoto.


DDL (Lenguaje de definición de datos)

Lenguaje utilizado para describir, modificar o definir los atributos de una base de datos, especialmente el esquema asociado con las tablas, columnas y la estrategia de almacenamiento.


consulta de definición de datos

Consulta específica de SQL que puede crear, modificar o eliminar una tabla, o crear o eliminar un índice, en una base de datos.


lenguaje de manipulación de datos (DML)

Las propiedades y métodos de las instrucciones SQL que se utilizan para escribir aplicaciones o consultas que tengan acceso y manipulen los datos de bases de datos existentes. Esto incluye funciones para consultar la base de datos, desplazarse por sus tablas, realizar actualizaciones y agregar o eliminar filas.


página de datos

Parte de la base de datos en la que se almacenan datos de las filas. Dependiendo del tamaño de las filas, las páginas de datos pueden contener más de una fila. En la mayoría de las bases de datos remotas, las páginas de datos son de 2 KB.


origen de datos

Recurso con nombre de Open Database Connectivity (ODBC, Conectividad abierta de bases de datos) que especifica la ubicación, el tipo de controlador y otros parámetros necesarios para que un controlador ODBC tenga acceso a una base de datos.


tipo de datos (datos remotos)

Atributo de una variable o una columna que determina la clase de datos que puede almacenar. Por ejemplo, un objeto rdoColumn definido con el tipo de datos rdTypeCHAR está diseñado para contener texto.


Date/Time

Las fechas y las horas se almacenan internamente como partes distintas de un número real.

El valor situado a la izquierda del signo decimal representa una fecha entre el 1 de enero del 100 y el 31 de diciembre del 9999, ambas inclusive. Los valores negativos representan fechas anteriores al 30 de diciembre de 1899.

El valor situado a la derecha del signo decimal representa una hora entre 0:00:00 y 23:59:59, ambas inclusive. El mediodía se representa mediante 0,5.


entorno predeterminado

Objeto rdoEnvironment que Visual Basic establece automáticamente cuando su aplicación hace la primera referencia a un objeto de datos remotos. Se hace referencia a dicho objeto rdoEnvironment mediante rdoEngine.rdoEnvironments(0) o simplemente mediante rdoEnvironments(0).


tiempo de diseño

Tiempo durante el cual se crea una aplicación en el entorno de desarrollo agregando controles, estableciendo las propiedades de los controles o formularios, etc. Por el contrario, durante el tiempo de ejecución se interactúa con la aplicación de la misma manera que lo haría un usuario.


biblioteca de vínculos dinámicos (DLL)

Biblioteca de rutinas cargadas y vinculadas con las aplicaciones en tiempo de ejecución.


rdoResultset de tipo dynamic

Resultado de una consulta que puede tener filas actualizables. Los rdoResultset de tipo dynamic son conjuntos dinámicos de filas que puede usar para agregar, modificar o eliminar filas de una tabla o tablas de una base de datos subyacente. Un rdoResultset de tipo dynamic puede contener columnas de una o varias tablas de una base de datos. Los miembros de un rdoResultset dinámico no son fijos.


entorno

Los objetos rdoEnvironment definen una sesión de un usuario específico. Cuando se hace referencia a RDO por primera vez, se crea un objeto rdoEnvironment predeterminado con una contraseña de "" y un nombre de usuario de "".


controlador de entorno

Identifica el almacenamiento de memoria de la información global, incluyendo los controladores de conexión válidos y el controlador de conexión activo actualmente. RDO requerirá este controlador antes de conectar con un origen de datos. Los objetos de datos remotos administran automáticamente los controladores de entorno mediante el objeto rdoEnvironment.


códigos de escape

Permitir especificar valores como una fecha o una hora, de forma independiente de los datos. Por ejemplo, {d 'valor'} permite especificar la fecha (SELECT * FROM tabla WHERE CampoFecha = {d "2/17/94"}). Cuando esta consulta se remite al controlador ODBC, analizará la cadena y reemplazará la cláusula de escape con la fecha del formulario apropiado para el controlador ODBC específico que esté usando.


expresión (datos remotos)

Cualquier combinación de operadores, constantes, valores literales, funciones y nombres de columnas, controles y propiedades cuyo resultado es un valor único. Puede usar expresiones como valores de muchas propiedades y argumentos de acción para establecer criterios o para definir columnas calculadas dentro de consultas.


filtro

Conjunto de criterios que se aplican a filas para crear un subconjunto de dichas filas.


desplazamiento hacia adelante

Movimiento hacia el final (EOF) de un objeto rdoResultset.


rdoResultset de tipo forward-only

Objeto rdoResultset en el que las filas sólo se pueden buscar desde el principio al final; la posición de la fila actual no se puede hacer retroceder hacia la primera fila y sólo hay una fila accesible al mismo tiempo. Los objetos rdoResultset de tipo forward-only son útiles para recuperar y procesar datos rápidamente.


identificador

Elemento de una expresión que hace referencia al valor de una columna o una propiedad.


índice (datos remotos)

Referencia cruzada dinámica de una o varias columnas de datos de una tabla que permite la rápida recuperación de filas específicas de una tabla. A medida que se agregan, cambian o eliminan filas, el sistema de administración de bases de datos actualiza automáticamente el índice para reflejar los cambios.


archivo de inicialización

Archivo de texto ASCII utilizado para contener parámetros de configuración de aplicaciones Windows o del propio Microsoft Windows. Generalmente, los archivos de inicialización utilizan la extensión .ini y reciben el nombre del programa ejecutable que lo usa. Por ejemplo, un programa llamado Prueba.exe esperaría que su archivo de inicialización se llamara Prueba.ini.


tipo de datos Integer

Tipo de datos fundamental que almacena números enteros. Las variables de tipo Integer se almacenan como números de 16 bits (2 bytes) dentro del intervalo -32.768 a 32.767. El carácter de declaración de tipo es % (carácter ANSI 37).


conjunto de claves

Conjunto de valores de claves utilizado para identificar filas específicas dentro de un cursor. Los conjuntos de claves se almacenan en el servidor, en los cursores de conjunto de claves del servidor y en la estación de trabajo en los cursores de conjunto de claves del cliente.


rdoResultset de tipo keyset

Resultado de una consulta que puede tener filas actualizables. El movimiento dentro del conjunto de claves no está restringido. Un rdoResultset de tipo keyset es un conjunto de filas que se puede usar para agregar, modificar o eliminar filas de una tabla o tablas de la base de datos subyacente. Los rdoResultset de tipo keyset pueden contener columnas de una o varias tablas de una base de datos. Los miembros de un rdoResultset de tipo keyset son fijos.


bloqueado

Condición de una página de datos o una fila que hace que sea de sólo lectura para todos los usuarios excepto para el que esté introduciendo actualmente datos en ella.


tipo de datos Long

Entero de cuatro bytes (número entero entre -2.147.483.648 y 2.147483647, ambos inclusive).


mensaje

Paquete de información que se pasa de una aplicación a otra.


base de datos multiusuario

Base de datos que permite que varios usuarios tengan acceso y modifiquen el mismo conjunto de datos al mismo tiempo. En algunos casos, el "usuario" adicional puede ser otra instancia de la aplicación u otra aplicación que se ejecute en el sistema que tenga acceso a los mismos datos que cualquier otra aplicación.


error nativo

Error generado y devuelto por el sistema de administración de bases de datos del origen de datos dentro de una conexión dada.


normalizar

Reducir la duplicación de información en una base de datos relacional mediante el diseño correcto de las tablas.


nulo

Valor que indica datos inexistentes o no conocidos. Los valores Null se pueden introducir en las columnas para las que no se conoce la información, y en expresiones y consultas. En Visual Basic, la palabra clave Null indica un valor Null.


columna nula

Columna que no contiene caracteres o valores. Las columnas nulas no son igual que las cadenas de longitud cero ("") o las columnas con valor 0. Una columna se establece a Null cuando el contenido de la columna es desconocido. Por ejemplo, una columna Fecha_final de una tabla de tareas podría dejarse como Null hasta que finalizara una tarea.


expresión numérica

Cualquier expresión cuyo resultado sea un número. Los elementos de la expresión pueden incluir cualquier combinación de palabras clave, variables, constantes y operadores que den como resultado un número.


Examinador de objetos

Cuadro de diálogo que le permite examinar el contenido de una biblioteca de objetos para obtener información acerca de los objetos proporcionados, sus métodos y propiedades, y posiblemente sus constantes.


expresión de objeto

Expresión que especifica un objeto determinado. Dicha expresión puede incluir cualquiera de los contenedores del objeto.


biblioteca de objetos

Archivo con extensión .olb que proporciona información a los clientes de Automatización (como Visual Basic) acerca de los objetos ActiveX disponibles. Puede usar el Examinador de objetos para examinar el contenido de una biblioteca de objetos con el fin de obtener información acerca de los objetos proporcionados.


ODBC (Open Database Connectivity, Conectividad abierta de bases de datos)

Protocolo estándar que permite que las aplicaciones se conecten con diferentes servidores o archivos de base de datos externos. Los controladores ODBC utilizados por el administrador de ODBC permiten el acceso a SQL Server y a otros orígenes de datos, incluyendo archivos de texto y hojas de cálculo de Microsoft Excel.


origen de datos ODBC

Base de datos o servidor de base de datos utilizado como origen de datos. Se hace referencia a los orígenes de datos ODBC mediante su nombre de origen de datos o mediante una referencia específica al controlador y al nombre del servidor ODBC. Los orígenes de datos con nombre se pueden registrar mediante el Administrador de ODBC del Panel de control de Windows o mediante el método rdoRegisterDataSource.


tipos de datos de columna

La siguiente tabla describe los tipos de datos de columna.

Tipo de datos de columna | Descripción
rdTypeCHAR | Cadena de caracteres de longitud fija. La longitud se establece mediante la propiedad Size.
rdTypeNUMERIC | Valor numérico con signo y exacto, con precisión p y escala e (1 ≤ p ≤15; 0 ≤ e ≤ p).
rdTypeDECIMAL | Valor numérico con signo y exacto, con precisión p y escala e (1 ≤ p ≤15; 0 ≤ e ≤ p).
rdTypeINTEGER | Valor numérico con signo y exacto, con precisión 10 y escala 0 (con signo: -2^31 ≤ n ≤ 2^31-1; sin signo: 0 ≤ n ≤ 2^32-1).
rdTypeSMALLINT | Valor numérico con signo y exacto, con precisión 5 y escala 0 (con signo: -32.768 ≤ n ≤ 32.767; sin signo: 0 ≤ n ≤ 65.535).
rdTypeFLOAT | Valor numérico con signo y aproximado, con precisión de mantisa 15 (valor cero o absoluto 10^-308 a 10^308).
rdTypeREAL | Valor numérico con signo y aproximado, con precisión de mantisa 7 (valor cero o absoluto 10^-38 a 10^38).
rdTypeDOUBLE | Valor numérico con signo y aproximado, con precisión de mantisa 15 (valor cero o absoluto 10^-308 a 10^308).
rdTypeDATE | Date: dependiente del origen de datos.
rdTypeTIME | Time: dependiente del origen de datos.
rdTypeTIMESTAMP | TimeStamp: dependiente del origen de datos.
rdTypeVARCHAR | Cadena de caracteres de longitud variable. Longitud máxima es el valor devuelto por la propiedad Size.
rdTypeLONGVARCHAR | Cadena de caracteres de longitud variable. La longitud máxima está determinada por el origen de datos.
rdTypeBINARY | Datos binarios de longitud fija. Longitud máxima es el valor devuelto por la propiedad Size.
rdTypeVARBINARY | Datos binarios de longitud variable. Longitud máxima de 255.
rdTypeLONGVARBINARY | Datos binarios de longitud variable. La longitud máxima está determinada por el origen de datos.
rdTypeBIGINT | Valor numérico con signo y exacto, con precisión 19 (con signo) o 20 (sin signo), escala 0 (con signo: -2^63 ≤ n ≤ 2^63-1; sin signo: 0 ≤ n ≤ 2^64-1).
rdTypeTINYINT | Valor numérico con signo y exacto, con precisión 3 y escala 0 (con signo: -128 ≤ n ≤ 127; sin signo: 0 ≤ n ≤ 255).
rdTypeBIT | Dígito binario.


controlador ODBC

Biblioteca de vínculos dinámicos (DLL) utilizada para conectar un determinado origen de datos de Open Database Connectivity (Conectividad abierta de bases de datos) con una aplicación cliente. Por ejemplo, Visual Basic incluye controladores específicos para Microsoft SQL Server. Para trabajar con RDO, los controladores ODBC deben cumplir los requisitos de ODBC Level II (ODBC de nivel II).


Administrador de controladores ODBC

Proporciona la interfaz entre el lenguaje del host y el controlador del origen de datos específico.


optimista

Tipo de bloqueo en el que la página de datos que contiene una o varias filas, incluyendo la fila que se está modificando, no está disponible para los demás usuarios solamente mientras la está actualizando el método Update, pero está disponible entre los métodos Edit y Update. El bloqueo optimista se utiliza cuando se usa el tipo de bloqueo rdConcurRowver o rdConcurValues al abrir un objeto rdoResultset.


parámetro

Elemento que contiene un valor que puede modificar para que tenga efecto sobre los resultados de la consulta. Por ejemplo, una consulta que devuelva datos acerca de un empleado podría tener un parámetro para el nombre del empleado. Puede usar un rdoParameter del objeto rdoQuery para buscar datos acerca de un empleado si establece el parámetro a un nombre específico antes de ejecutar la consulta.


consulta de parámetros

Consulta que requiere que proporcione uno o varios valores de criterios, como Toledo para Ciudad, antes de ejecutarla. Las consultas de parámetros no son, estrictamente hablando, un tipo de consulta distinto; al contrario, amplían la flexibilidad de otras consultas.


analizar

Identificar las partes de una instrucción o expresión y después valida dichas partes en función de las reglas del lenguaje.


permiso

Uno o varios atributos que especifican el tipo de acceso que un usuario tiene a los datos u objetos de una base de datos. Por ejemplo, una tabla o una consulta con el permiso Sólo lectura permite que un usuario recupere datos de la tabla o la consulta, pero no le permite modificarlos.


pesimista

Tipo de bloqueo en el que cada página tocada por el conjunto de filas actual (determinado por la propiedad RowsetSize) queda bloqueada en cuanto se abre el cursor y no se libera hasta que el conjunto de filas vuelva a posicionarse, cuando se bloquee el siguiente conjunto de páginas tocado por el conjunto de filas actual. El bloqueo pesimista se activa cuando se utiliza la opción rdConcurLock LockType al abrir un rdoResultset. Este tipo de bloqueo sólo se utiliza en circunstancias especiales.


objeto rdoPreparedStatement

Objeto de datos remotos que contiene una instrucción SQL preparada y una colección de objetos rdoParameter para cada parámetro del rdoPreparedStatement. Este objeto está obsoleto y debe reemplazarse por el objeto rdoQuery.


consulta de procedimiento

Consulta SQL que ejecuta un procedimiento almacenado.


consulta

Instrucción formalizada sobre una base de datos para obtener un conjunto de filas o para realizar una acción concreta sobre un conjunto de filas, como se especifica en la consulta. Por ejemplo, la siguiente instrucción SQL devuelve filas:

SELECT CompanyName FROM Publishers WHERE State = 'NY'

Entre los tipos de consultas se incluyen las de selección, de acciones, de parámetros, de combinación y procedimientos almacenados.


objeto rdoQuery (definición)

Objeto de datos remotos que contiene una instrucción SQL y una colección de objetos rdoParameter para cada parámetro del rdoQuery. Los objetos rdoQuery se utilizan para administrar consultas con parámetros o consultas que se utilizan repetidamente durante la ejecución de una aplicación.


sólo lectura

Tipo de acceso a los datos por el cual la información se puede recuperar pero no modificar. Esto proporciona mayor velocidad en la mayoría de los casos.


objeto de datos remotos

Objeto, como rdoConnection, rdoTable, rdoResultset o rdoQuery, que representa un objeto utilizado para organizar y manipular datos dentro del código.


Objetos de datos remotos (RDO)

Proporcionan un modelo de información para tener acceso a orígenes de datos remotos mediante ODBC. RDO ofrece un conjunto de objetos que facilitan la conexión con una base de datos, la ejecución de consultas y procedimientos almacenados, la manipulación de resultados y la confirmación de los cambios en el servidor.


nueva consulta

Volver a ejecutar una consulta para reflejar los cambios en las filas, obtener las filas agregadas y eliminar las filas eliminadas.


palabra reservada

Palabra que forma parte del lenguaje SQL del origen de datos. Las palabras reservadas incluyen los nombres de las instrucciones, funciones y tipos de datos predefinidos, métodos, operadores y objetos. Por ejemplo SELECT, UPDATE, BETWEEN, SET e INSERT.


fila

Conjunto de datos relacionados acerca de una persona, un lugar, un evento o cualquier otro elemento. Los datos de las tablas se almacenan en filas dentro de la base de datos. Cada fila se compone de una serie de columnas relacionadas, cada una de las cuales define un atributo de información de la fila. Tomada en conjunto, una fila define una unidad concreta de información que se puede obtener de una base de datos.


llenado del conjunto de filas

Proceso de carga de las filas de un rdoResultset en la memoria.

Los objetos rdoResultset pueblan o llenan el número de filas definido por el atributo RowsetSize. Si está utilizando cursores en el servidor, sólo dicho número de filas está presente en la memoria en un momento dado.


tiempo de ejecución

Tiempo en que la aplicación está ejecutándose. Durante el tiempo de ejecución, se interactúa con el código de la misma manera que lo haría un usuario. Por el contrario, el tiempo de diseño es cuando se está desarrollando la aplicación.


alcance

Definir la visibilidad de una variable, un procedimiento o un objeto. Por ejemplo, una variable declarada como Public es visible en todos los procedimientos de todos los módulos. Las variables declaradas dentro de los procedimientos sólo son visibles dentro del procedimiento y pierden su valor al salir de ellos, a menos que se declaren como Static.


seguridad

Se utiliza para especificar o restringir el acceso que los usuarios o grupos de usuarios especificados tienen a los datos y los objetos de una base de datos.


consulta de selección

Consulta que plantea una pregunta acerca de los datos almacenados en las tablas y devuelve un objeto rdoResultset sin modificar los datos. Una vez devueltos los datos del rdoResultset, se pueden examinar y modificar los datos de las consultas subyacentes.


servidor

Sistema de administración de bases de datos diseñado para compartir datos con aplicaciones cliente; los servidores y los clientes están conectados normalmente a través de una red. Por lo general, los servidores de bases de datos contienen y administran un depósito central de datos que las aplicaciones cliente remotas pueden recuperar y manipular.


cursor del servidor

Conjuntos de claves de cursor creados en el servidor en vez de en la estación de trabajo cliente.


sesión

Una sesión empieza cuando un usuario se conecta con un origen de datos y termina cuando un usuario se desconecta. Todas las operaciones realizadas durante una sesión están sujetas a los permisos determinados por el nombre y la contraseña del usuario. Las sesiones se implementan como objetos rdoConnection y son sinónimos de las conexiones.


tipo de datos Single

Tipo de datos fundamental que almacena números de signo flotante de precisión simple en formato IEEE. Las variables Single se almacenan como números de 32 bits (4 bytes) dentro del intervalo -3,402823E38 a -1,401298E-45 para valores negativos, 1,401298E-45 a 3,402823E38 para valores positivos y 0. El carácter de declaración de tipo es (!).


orden

Secuencia de reglas utilizadas para ordenar datos, como diccionario, binario, ascendente, descendente, etc.


base de datos SQL

Base de datos a la que puede tener acceso mediante orígenes de datos de Open Database Connectivity (ODBC, Conectividad abierta de bases de datos) u otra interfaz nativa de la base de datos. También se conoce como base de datos relacional.


consulta específica de SQL

Consulta que sólo se puede crear escribiendo una instrucción SQL.


instrucción SQL

Expresión que define un comando del Lenguaje de consulta estructurado (SQL), como SELECT, UPDATE o DELETE, y que podría incluir cláusulas como WHERE y ORDER BY. Las cadenas e instrucciones SQL se utilizan normalmente en consultas y objetos rdoResultset, pero también se pueden usar para crear o modificar la estructura de una base de datos.

La sintaxis de las instrucciones SQL depende del origen de datos.


vista SQL

Las vistas SQL son similares a las consultas: las dos permiten limitar las filas y columnas que se presentan de una o varias tablas, y ambas aportan funcionalidad similar. Las vistas SQL son conjuntos lógicos de filas en los que una tabla representa las filas reales.


controlador de instrucción

Utilizado por el controlador ODBC para hacer referencia al almacenamiento de nombres, información de parámetros y enlace, mensajes de error y otra información relacionada con el proceso de la instrucción. La propiedad hStmt de rdoResultset es un controlador de instrucción ODBC.


rdoResultset de tipo static

La pertenencia, el orden y los valores de un conjunto de resultados utilizados por un cursor estático se determinan generalmente al abrir el cursor. El cursor no detecta las filas actualizadas, eliminadas o insertadas por otros usuarios hasta que se cierre y se vuelva a abrir o requerir.


procedimiento almacenado

Procedimiento precompilado almacenado en un origen de datos, al que se puede llamar desde una aplicación cuando sea necesario. Las consultas predefinidas reducen la carga del sistema cuando se especifican los mismos criterios de selección y son mucho más rápidas que las consultas puntuales.


tipo de datos String

Tipo de datos fundamental que almacena información de carácter. Las variables String pueden contener aproximadamente 65.535 bytes (64 KB), son de longitud fija o variable, y contienen un carácter por cada byte. Las cadenas de longitud fija se declaran con la longitud específica. Las cadenas de longitud variable pueden tener cualquier longitud hasta 64 KB, menos una pequeña cantidad de espacio de almacenamiento.

El carácter de declaración del tipo de datos String es $.


expresión de cadena

Cualquier expresión cuyo resultado sea una secuencia de caracteres contiguos. Los elementos de la expresión pueden incluir una función que devuelva una cadena, un literal de cadena, una constante de cadena, una variable de cadena, una cadena Variant o una función que devuelva una cadena Variant (VarType 8).


Lenguaje de consulta estructurado (SQL)

Lenguaje utilizado en la consulta, actualización y administración de bases de datos relacionales. Se puede usar SQL para obtener, ordenar y filtrar los datos que se vayan a extraer de la base de datos.


tabla

Unidad básica de almacenamiento de datos en una base de datos relacional. Las tablas almacenan los datos en filas y columnas, y normalmente contienen una categoría de cosas determinada, como empleados o piezas. También se llaman tablas base.


objeto rdoTable

Representa la definición almacenada de una tabla base o de una vista SQL.


TEMP

La variable de entorno TEMP se inicializa cuando se inicia el sistema. Generalmente, TEMP señala a un área del disco duro utilizada por Microsoft Windows y otros programas para almacenar información que no es necesario guardar al cerrar el sistema. Por ejemplo, la siguiente línea del archivo autoexec.bat hace que la variable de entorno TEMP señale al directorio D:\Áreatemp:

SET TEMP=D:\ÁREATEMP


disco temporal

Directorio identificado por la variable de entorno TEMP del sistema operativo. También se conoce como unidad temporal. Aunque la variable de entorno TEMP puede señalar a un disco RAM, no es recomendable.


marca de hora

Contiene un valor único que se actualiza automáticamente cuando se actualiza una fila.


transacción

Serie de cambios efectuados en los datos de una base de datos. El comienzo de una transacción se marca con la instrucción BeginTrans, la transacción se confirma mediante la instrucción CommitTrans y con RollbackTrans se deshacen todos los cambios realizados desde que se utilizó BeginTrans.

Las transacciones son opcionales, pero pueden aumentar la velocidad de las operaciones y permiten deshacer los cambios.

Las transacciones se pueden administrar en el ámbito de rdoConnection o de rdoEnvironment.

Las transacciones también se pueden administrar mediante un Distributed Transaction Coordinator (DTC, Coordinador de transacciones distribuidas).


confirmación en dos fases

Permitir que una aplicación coordine las actualizaciones entre varios servidores SQL. Esta implementación de transacciones distribuidas trata las transacciones en distintos servidores SQL como una única transacción. Dicho servicio usa un servidor SQL, el servidor de confirmación, como registro que contribuye a que la aplicación determine si acepta o cancela las transacciones. De esta manera, la confirmación en dos fases garantiza la actualización de todas las bases de datos de los servidores participantes o de ninguna.


update <definition>

actualización

Proceso que guarda los cambios efectuados en una fila. Hasta que la fila se guarde, los cambios se almacenan en una fila temporal llamada búfer de copia.

La cláusula UPDATE de las instrucciones SQL cambia los valores de los datos de una o varias filas de una tabla de una base de datos.


consulta de actualización

Consulta de acciones que cambia los datos de una tabla base de acuerdo con los criterios especificados. Las consultas de actualización no devuelven filas, sino el número de filas afectadas.


cuenta de usuario

Cuenta identificada por un nombre de usuario y una contraseña que se crea para administrar el acceso a los objetos de una base de datos remota.


validación

Proceso de comprobar si los datos introducidos cumplen ciertas condiciones o limitaciones.


tipo de datos Variant

Tipo de datos especial que puede contener datos numéricos, de cadena o de fecha, así como los valores especiales Empty y Null. La función VarType define cómo se tratan los datos de una variable Variant. Todas las variables son del tipo Variant si no se declaran explícitamente como de otro tipo.


cláusula WHERE

Parte de una instrucción SQL que especifica las filas que se van a obtener. La cláusula WHERE limita el alcance de la consulta y especifica las columnas que se van a usar en las combinaciones de múltiples tablas.


tipo de datos Sí/No

Tipo de datos de columna que contiene un valor Boolean (True/False o Sí/No).


cadena de longitud cero

Cadena que no contiene caracteres. En una cadena de este tipo, la función Len devuelve 0.


Associate (Evento)

Se produce tras asociar una nueva conexión con el objeto.

Sintaxis

Private Sub objeto.Associate( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de que el conjunto de resultados se asocie con un nuevo objeto rdoConnection. Puede usar este evento para inicializar la nueva conexión. La propiedad ActiveConnection del objeto rdoResultset asociado hace referencia a la nueva conexión.

Por ejemplo, puede usarse el procedimiento de evento Associate para enviar una consulta especial cada vez que se establezca una conexión, pero antes de que se ejecuten otras operaciones.


BeforeConnect (Evento)

Se produce justo antes de que RDO llame a la función SQLDriverConnect de la API de ODBC para establecer una conexión con el servidor.

Sintaxis

Private Sub objeto.BeforeConnect(connectString As String, prompt As Variant)

La sintaxis del evento BeforeConnect consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
connectString | Una expresión Variant que da como resultado una cadena de conexión usada para proporcionar los parámetros de conexión a la función SQLDriverConnect de ODBC.
prompt | Determina el mensaje que se presentará al usuario.

Comentarios

El evento BeforeConnect se produce justo antes de que RDO llame a la función SQLDriverConnect de la API de ODBC para establecer una conexión con el servidor. Este evento ofrece la oportunidad de solicitar datos de forma personalizada, o de proporcionar o capturar información de conexión.

El parámetro connectString es la cadena de conexión ODBC que RDO pasará a la función SQLDriverConnect de la API de ODBC. La cadena puede cambiarse durante este evento y RDO usará el valor modificado. Por ejemplo, el código puede proporcionar parámetros adicionales o cambiar los parámetros existentes de la cadena de conexión.

El parámetro prompt es la constante de solicitud de datos ODBC (vea la propiedad Prompt). De forma predeterminada, este parámetro contendrá el valor del parámetro prompt pasado en los métodos OpenConnection o EstablishConnection. El programador puede cambiar este valor y RDO usará el nuevo valor cuando llame a SQLDriverConnect.


BeginTrans (Evento)

Se produce después de que finalice el método BeginTrans.

Sintaxis

Private Sub objeto.BeginTrans( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

El evento BeginTrans se produce cuando ha finalizado un método BeginTrans. Este procedimiento de evento puede sincronizar otros procesos con la transacción.


CommitTrans (Evento)

Se produce cuando se ha completado el método CommitTrans.

Sintaxis

Private Sub objeto.CommitTrans( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce tras haberse ejecutado un método CommitTrans. El programador puede responder a este evento para sincronizar otros procesos con la transacción.


Connect (Evento)

Se desencadena después de haber establecido una conexión con el servidor.

Sintaxis

Private Sub objeto.Connect(errorOccurred As Boolean)

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
errorOccurred | Una expresión Boolean que determina si la conexión tuvo éxito, como se describe en Valores.

Valores

El argumento errorOccurred se establecerá a uno de los valores siguientes:

Valor | Descripción
True | Falló la conexión.
False | La conexión se estableció correctamente.

Comentarios

En el evento Connect puede hacer cualquier tipo de consultas iniciales necesarias sobre una nueva conexión, como comprobar la versión de la base de datos con la versión del cliente o establecer una base de datos predeterminada no establecida en la cadena de conexión. También puede comprobar los errores o mensajes devueltos durante el proceso de apertura de la conexión, o quizás simplemente borrar los mensajes de información de la colección rdoErrors.


DataChanged (Evento)

Se produce cuando ha cambiado el valor de la columna.

Sintaxis

Private Sub objeto.DataChanged( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce tras haber cambiado los datos de una columna. Se puede tener acceso a los datos nuevos mediante la propiedad Value del objeto rdoColumn. También puede emplear el evento WillChange para impedir o modificar el cambio que está a punto de hacerse para que se efectúe columna a columna. Sin embargo, una vez que se ha producido el evento DataChanged, los cambios ya se han efectuado en la base de datos.


Disconnect (Evento)

Se produce tras haber cerrado una conexión.

Sintaxis

Private Sub objeto.Disconnect( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Se produce después de cerrar una conexión física. El programador puede usar este evento para realizar los trabajos de limpieza necesarios.

Se aplica al objeto rdoConnection.


Dissociate (Evento)

Se produce tras disociar un objeto rdoResultset de una conexión.

Sintaxis

Private Sub objeto.Dissociate( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de establecer la propiedad ActiveConnection a Nothing y haber disociado el conjunto de resultados de su conexión.


Error (Evento, datos remotos)

Se produce sólo como resultado de un error de acceso a datos que tiene lugar cuando no se está ejecutando ningún código de Visual Basic.

Sintaxis

Private Sub objeto _Error([index As Integer,]number As Long, description As String, scode As Long, source As String, helpFile As String, helpContext As Long, cancelDisplay As Boolean)

La sintaxis del evento Error consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
index | Identifica al control si está en una matriz de controles.
number | El número de error nativo.
description | Describe el error.
scode | Código de retorno de error ODBC.
source | Origen del error.
helpFile | La ruta de acceso a un archivo de Ayuda que contiene más información sobre el error.
helpContext | El número de contexto del archivo de Ayuda.
cancelDisplay | Un número que corresponde a la acción que se va a tomar, según se describe en Valores.

Valores

Los valores admitidos para cancelDisplay son:

Constante | Valor | Descripción
rdDataErrContinue | 0 | Continuar.
rdDataErrDisplay | 1 | (Predeterminado) Mostrar el mensaje de error.

Comentarios

Por lo general, los argumentos del evento Error se corresponden con las propiedades del objeto rdoError.

Normalmente se proporciona en el código una funcionalidad de tratamiento de errores para los errores en tiempo de ejecución. Sin embargo, los errores en tiempo de ejecución pueden producirse cuando no se está ejecutando ningún código, sino cuando:

  • Un usuario hace clic en un botón de un control RemoteData.

  • El control RemoteData intenta abrir un rdoConnection y crea objetos rdoResultset tras el evento Form_Load.

  • Un control personalizado realiza una operación, como el método MoveNext, el método AddNew o el método Delete.

Si se genera un error como resultado de una de estas acciones, se producirá el evento Error.

Si no codifica un procedimiento de evento para el evento Error, Visual Basic mostrará el mensaje de error asociado al error.


InfoMessage (Evento)

Se produce cuando se agregan mensajes informativos a la colección rdoErrors.

Sintaxis

Private Sub objeto.InfoMessage( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de que RDO reciba un código de retorno SQL_SUCCESS_WITH_INFO del Administrador de controladores ODBC y llene la colección rdoErrors con los mensajes informativos.

El evento InfoMessage se produce una vez por cada conjunto de mensajes informativos. Por tanto, si un método RDO genera varios mensajes informativos, este evento se desencadena una única vez, después de agregar el último mensaje a la colección. Puede interceptar este evento y examinar el contenido de la colección rdoErrors para decidir qué acción es la apropiada.


QueryComplete (Evento)

Se produce después de que la consulta de un rdoResultset devuelva el primer conjunto de resultados.

Sintaxis

Private Sub objeto.QueryComplete(query As rdoQuery, errorOccurred As Boolean)

La sintaxis del evento QueryComplete consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
query | Una expresión de objeto que da como resultado un objeto rdoQuery cuya consulta se acaba de completar.
errorOccurred | Una expresión de tipo Boolean que indica si se produjo un error al procesar la consulta.

Valores

Los valores admitidos para errorOccurred son:

Valor | Descripción
True | Se produjo un error durante la consulta.
False | No se produjo ningún error durante la consulta.

Comentarios

Se produce cuando ha finalizado una consulta. Este evento puede usarse como indicación de que el conjunto de resultados está ahora listo para su proceso.

El parámetro errorOccurred indica si hubo un error durante la ejecución de la consulta. Si este indicador es True, debe comprobar la colección rdoErrors para obtener más información.

El evento QueryComplete se produce para todas las consultas ejecutadas en este rdoConnection. Esto incluye las consultas ejecutadas mediante los métodos OpenResultset o Execute, así como las ejecutadas desde un objeto rdoQuery asociado. El argumento query es una referencia a un objeto que indica qué consulta se terminó de ejecutar. Con este argumento puede escribir un único controlador de evento para todas las consultas de la conexión, aunque puede personalizar el controlador para consultas específicas. Al ejecutar consultas sobre el propio objeto rdoConnection, RDO crea internamente un objeto rdoQuery y se pasa una referencia a este rdoQuery interno como argumento query.

Debe usar este evento en lugar de examinar la propiedad StillExecuting para comprobar la finalización de consultas del método OpenResultset o Execute.


QueryCompleted (Evento, datos remotos)

Se produce después de que la consulta de un rdoResultset generado por un control RemoteData devuelva el primer conjunto de resultados.

Sintaxis

Private Sub objeto.QueryCompleted ([index As Integer])

La sintaxis del evento QueryCompleted consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
index | Identifica al control si está en una matriz de controles.

Comentarios

Cuando un control RemoteData completa la creación de un rdoResultset, se produce el evento QueryCompleted. Este evento no se produce si se ejecuta el método Cancel, el cual termina el procesamiento de la consulta antes de que ésta haya finalizado.

Este evento se produce tanto en operaciones de consultas asíncronas como síncronas.


QueryTimeout (Evento)

Se produce cuando el tiempo de ejecución de la consulta ha sobrepasado el valor establecido en la propiedad QueryTimeout.

Sintaxis

Private Sub objeto.QueryTimeout(query As rdoQuery, cancel As Boolean)

La sintaxis del evento QueryTimeout consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
query | Una expresión de objeto que da como resultado un objeto rdoQuery cuya consulta se acaba de completar.
cancel | Una expresión de tipo Boolean que indica si se produjo un error durante el procesamiento de la consulta.

Valores

Los valores admitidos para cancel son:

Valor | Descripción
True | RDO debe cancelar el procesamiento de la consulta.
False | RDO debe continuar procesando la consulta durante otro periodo de tiempo de espera de consulta.

Comentarios

Se produce cuando una consulta en ejecución ha sobrepasado el tiempo especificado en la propiedad QueryTimeout. Este evento se produce para consultas asíncronas y síncronas, cada vez que se alcanza el tiempo de QueryTimeout.

El parámetro cancel indica si RDO debe cancelar la consulta o continuar procesándola y esperar durante el número de segundos especificado en la propiedad QueryTimeout. El valor predeterminado de este parámetro es True, lo que significa que si el código no responde a este evento, la consulta se cancela tras alcanzar el tiempo de QueryTimeout. Si el valor del parámetro se establece a False, RDO continúa esperando a que finalice la consulta durante otro periodo QueryTimeout.

Este método puede usarse para mostrar un cuadro de mensajes al usuario y preguntarle si desea cancelar la consulta o continuar esperando otros N segundos.

El evento QueryTimeout se produce para todas las consultas ejecutadas en este rdoConnection. Esto incluye las consultas ejecutadas mediante los métodos OpenResultset o Execute, así como las ejecutadas desde un objeto rdoQuery asociado. El argumento query es una referencia a un objeto que indica qué consulta ha sobrepasado el tiempo de espera. Con este argumento puede escribir un único controlador de evento para todas las consultas de la conexión, aunque puede personalizar el controlador para consultas específicas. Al ejecutar consultas sobre el propio objeto rdoConnection, RDO crea internamente un objeto rdoQuery y se pasa una referencia a este rdoQuery interno como argumento query.


Reposition (Evento, datos remotos)

Se produce después de que una fila pase a ser la fila actual.

Sintaxis

Private Sub objeto.Reposition ([index As Integer])

La sintaxis del evento Reposition consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
index | Identifica al control si está en una matriz de controles.

Comentarios

Cuando se carga un control RemoteData, la primera fila del objeto rdoResultset pasa a ser la fila actual, activando el evento Reposition. El evento Reposition se produce después de que cada fila pase a ser la actual.

Siempre que un usuario haga clic en cualquier botón del control RemoteData para desplazarse de una fila a otra:

  • Use uno de los métodos Move, como MoveNext.

  • Use cualquier otra propiedad o método que modifique la fila actual.

Por el contrario, el evento Validate se produce antes de desplazarse a otra fila. El evento RowCurrencyChange asociado con el rdoResultset también se produce cuando cambia la fila del conjunto de resultados actual.

Es posible usar el evento Reposition para realizar cálculos basados en los datos de la fila actual o para modificar el formulario como respuesta a los datos de la fila actual.


ResultsChanged (Evento)

Se produce cuando hay disponible un nuevo conjunto de resultados tras la ejecución del método MoreResults.

Sintaxis

Private Sub objeto.ResultsChanged( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de que finalice el método MoreResults y se cargue un nuevo conjunto de filas en el conjunto de resultados. Se desencadena incluso si no hay más conjuntos y el método MoreResults devuelve False. En este caso, las propiedades EOF y BOF serán True, lo que indica que el conjunto de resultados está vacío.


RollbackTrans (Evento)

Se produce tras haber finalizado el método RollbackTrans.

Sintaxis

Private Sub objeto.RollbackTrans( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Puede responder a este evento para sincronizar otros procesos con la transacción.


RowCurrencyChange (Evento)

Se produce después de que el conjunto de resultados se haya colocado en una nueva fila, en BOF o en EOF.

Sintaxis

Private Sub objeto.RowCurrencyChange( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de que el conjunto de resultados se haya colocado en una nueva fila, o se haya desplazado a BOF o a EOF. Cualquiera de los métodos Move, las propiedades AbsolutePosition, PercentPosition o Bookmark, o los métodos Requery, MoreResults o Update (tras un AddNew) pueden hacer que el puntero de fila actual se reposicione y produzca el evento RowCurrencyChange. Es posible determinar la posición actual si tiene acceso a las propiedades AbsolutePosition, PercentPosition o Bookmark del objeto.

El evento RowCurrencyChange puede usarse para ejecutar una consulta de detalle cuando cambie una fila maestra asociada. Por ejemplo, si crea un formulario que contiene un registro de cliente principal y un conjunto de filas correspondientes a pedidos de cliente, puede usar el evento RowCurrencyChange para iniciar una consulta que devuelva toda la información de pedido asociada cada vez que el usuario elija otro registro de cliente principal.

Nota El orden en que se producen los eventos RowCurrencyChange y Reposition es impredecible.


RowStatusChanged (Evento)

Se produce tras cambiar el estado de los datos de la fila actual debido a una modificación, una eliminación o una inserción.

Sintaxis

Private Sub objeto.RowStatusChange( )

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Este evento se produce después de que cambie el estado de los datos de la fila actual. El estado de una fila puede cambiar debido a una operación Delete o Update. El estado actual de la fila puede determinarse mediante la propiedad Status del objeto.


Validate (Evento, datos remotos)

Se produce antes de que una fila pase a ser la fila actual, antes del método Update (excepto cuando los datos se guardan con el método UpdateRow) y antes de una operación Delete, Unload o Close.

Sintaxis

Private Sub objeto_Validate ([index As Integer,] action As Integer, reserved As Integer)

La sintaxis del evento Validate consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
index | Identifica el control si está en una matriz de controles.
action | Un tipo Integer o una constante que indica la operación que ha producido este evento, como se describe en Valores.
reserved | Un argumento de tipo Integer que se mantiene por compatibilidad con la versión 1.0 de RDO y se ignora en el control RemoteData.

Valores

Los valores admitidos para action son:

Constante | Valor | Descripción
RdActionCancel | 0 | Cancela la operación al salir del procedimiento Sub.
RdActionMoveFirst | 1 | Método MoveFirst.
RdActionMovePrevious | 2 | Método MovePrevious.
RdActionMoveNext | 3 | Método MoveNext.
RdActionMoveLast | 4 | Método MoveLast.
RdActionAddNew | 5 | Método AddNew.
RdActionUpdate | 6 | Operación Update (no UpdateRow).
RdActionDelete | 7 | Método Delete.
RdActionFind | 8 | Método Find (no implementado).
RdActionBookmark | 9 | Se ha establecido la propiedad Bookmark.
RdActionClose | 10 | Método Close.
RdActionUnload | 11 | El formulario se está descargando.
RdActionUpdateAddNew | 12 | Se insertó una fila nueva en el conjunto de resultados.
RdActionUpdateModified | 13 | Se modificó la fila actual.
RdActionRefresh | 14 | Se ejecutó el método Refresh.
RdActionCancelUpdate | 15 | Actualización cancelada.
RdActionBeginTransact | 16 | Método BeginTrans.
RdActionCommitTransact | 17 | Método CommitTrans.
RdActionRollbackTransact | 18 | Método RollbackTrans.
RdActionNewParameters | 19 | Cambio en los parámetros o en el orden de las columnas o las filas.
RdActionNewSQL | 20 | Ha cambiado la instrucción SQL.

Comentarios

Este evento puede producirse sin tener en cuenta si se cambian los datos de los controles enlazados o si hay controles enlazados. Puede usar este evento para cambiar valores y actualizar datos. Además, puede elegir entre guardar los datos o detener la acción que ha producido el evento y sustituirla por otra acción.

Si intenta cambiar AddNew o uno de los métodos Move a una de las otras acciones (cualquier Move en AddNew, cualquier Move en otro Move o AddNew en cualquier Move) la acción se detiene, igual que si la establece a rdActionCancel.

En el código para este evento puede comprobar los datos de cada control enlazado en los que DataChanged es True. Entonces puede establecer DataChanged a False para evitar que se guarden los datos en la base de datos.

Nota Puesto que un control enlazado a datos puede tener más de una propiedad enlazada, debe examinarse la propiedad DataChanged para cada una de las propiedades enumeradas en la colección Bindings.

No puede usar cualquier método (como MoveNext) en el objeto rdoResultset subyacente durante este evento.


WillAssociate (Evento)

Se produce antes de asociar una nueva conexión con el objeto.

Sintaxis

Private Sub objeto.WillAssociate(connection As rdoConnection, cancel As Boolean)

La sintaxis del evento WillAssociate consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
connection | Una expresión de objeto que da como resultado el objeto rdoConnection con el que asociará.
cancel | Una expresión de tipo Boolean que indica si RDO debe impedir la asociación.

Valores

Los valores admitidos para cancel son:

Valor | Descripción
True | RDO impedirá la asociación.
False | (Predeterminado) RDO no impedirá la asociación.

Comentarios

Este evento se produce tras establecer la propiedad ActiveConnection a un objeto rdoConnection válido, pero antes de realizar la asociación real.

El argumento connection es una referencia al objeto rdoConnection que está tratando de asociar con el objeto rdoResultset. Cuando se produce el evento WillAssociate, la propiedad ActiveConnection permanece establecida al valor anterior al intento de asociación. Esta propiedad puede usarse para determinar la asociación de conexión rdoResultset actual.

Puede impedir la asociación si establece el argumento cancel a True, con lo que RDO no asociará el conjunto de resultados con la nueva conexión y generará un error en tiempo de ejecución. Si no impide la asociación mediante el argumento cancel, la propiedad ActiveConnection se establece a la referencia contenida en el parámetro connection tras finalizar este procedimiento de evento.


WillChangeData (Evento)

Se produce antes de que cambien los datos de la columna.

Sintaxis

Private Sub objeto.WillChangeData(newValue As Variant, cancel As Boolean)

La sintaxis del evento WillChangeData consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
newValue | Una expresión Variant que contiene los datos que se aplicarán a la columna.
cancel | Una expresión de tipo Boolean que indica si RDO debe impedir el cambio.

Valores

Los valores admitidos para cancel son:

Valor | Descripción
True | RDO impedirá el cambio.
False | (Predeterminado) RDO no impedirá el cambio.

Comentarios

Este evento se produce justo antes de que RDO efectúe ningún cambio en los datos de una columna. Si intercepta este evento, puede modificar el nuevo valor o puede impedir el cambio si modifica el argumento cancel.

Si modifica el parámetro newValue, el valor modificado se asignará a la propiedad Value de la columna. Esto permite traducir o sustituir los datos.

De forma predeterminada, el argumento cancel es False, pero si se establece a True, se cancela el cambio de los datos de la columna y RDO genera un error interceptable.


WillDissociate (Evento)

Se produce antes de que la conexión se establezca a Nothing.

Sintaxis

Private Sub objeto.WillDissociate(cancel As Boolean)

La sintaxis del evento WillDissociate consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
cancel | Una expresión de tipo Boolean que indica si RDO debe impedir que se deshaga la asociación.

Valores

Los valores admitidos para cancel son:

Valor | Descripción
True | RDO impedirá el cambio.
False | (Predeterminado) RDO no impedirá el cambio.

Comentarios

Este evento se produce cuando el programador intenta establecer la propiedad ActiveConnection a Nothing pero antes de que el conjunto de resultados se disocie de la conexión.

Si desea impedir la disociación, establezca el parámetro cancel a True; de esta forma, RDO cancelará la operación y generará un error interceptable.

El valor predeterminado para el parámetro cancel es False, por lo que si no se intercepta el evento, se lleva a cabo la disociación.


WillExecute (Evento)

Se produce antes de la ejecución de una consulta.

Sintaxis

Private Sub objeto.WillExecute(query As rdoQuery, cancel As Boolean)

La sintaxis del evento WillExecute consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
query | Una expresión de objeto que da como resultado un objeto rdoQuery cuya consulta se acaba de completar.
cancel | Una expresión de tipo Boolean que indica si RDO debe impedir el cambio.

Valores

Los valores admitidos para cancel son:

Valor | Descripción
True | RDO impedirá el cambio.
False | (Predeterminado) RDO no impedirá el cambio.

Comentarios

Este evento se produce antes de la ejecución de una consulta, sin tener en cuenta si es una consulta de acciones o si devuelve filas. Puede interceptar este evento para impedir la ejecución de ciertas consultas o para realizar los últimos ajustes a la cadena SQL del objeto rdoQuery.

El argumento cancel permite impedir la consulta. El valor predeterminado del parámetro cancel es False, pero si se establece a True, la consulta no se ejecutará y RDO generará un error interceptable indicando que la consulta se ha cancelado.

Por ejemplo, puede ver antes la consulta para asegurarse de que la cláusula WHERE no efectuará una operación de búsqueda por toda una tabla. Así, si establece el argumento cancel a True, puede impedir que los usuarios busquen clientes con el apellido "García" sin proporcionar, además, un nombre y una dirección.

El evento WillExecute se produce para todas las consultas ejecutadas en este rdoConnection. Esto incluye las consultas ejecutadas mediante los métodos OpenResultset o Execute, así como las ejecutadas desde un objeto rdoQuery asociado. El argumento query es una referencia a un objeto que indica qué consulta se va a ejecutar. Con este argumento puede escribir un único controlador de evento para todas las consultas de la conexión, aunque puede personalizar el controlador para consultas específicas. Al ejecutar consultas sobre el propio objeto rdoConnection, RDO crea un objeto rdoQuery internamente y se pasa una referencia a este rdoQuery interno como argumento query.


WillUpdateRows (Evento)

Se produce antes de que se efectúe una actualización en la base de datos.

Sintaxis

Private Sub objeto.WillUpdateRows(returnCode As Integer)

La sintaxis del evento WillUpdateRows consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
returnCode | Una expresión de tipo Integer o una constante que indica si el programador controló la actualización o no, como se describe en Valores.

Valores

El argumento returnCode se usa para informar a RDO de qué hizo el código durante el control del evento. Los valores admitidos para este argumento son los siguientes:

Valor | Descripción
rdUpdateSuccessful | El código controló la actualización y se llevó a cabo correctamente.
rdUpdateWithCollisions | El código controló la actualización, se llevó a cabo correctamente, pero algunas filas produjeron conflictos (sólo en modo por lotes).
rdUpdateFailed | El código intentó controlar la actualización, pero encontró un error al hacerlo.
rdUpdateNotHandled | El código no controló la actualización. RDO debe continuar informando y, si nadie controla la actualización, RDO debe actualizar los datos por sí mismo.

Comentarios

El evento WillUpdateRows se produce antes de que se confirmen en el servidor las filas actualizadas, agregadas y eliminadas. Puede evitar el comportamiento de actualización del cursor si responde a este evento y realiza sus propias actualizaciones mediante procedimientos almacenados u otros mecanismos.

Si el conjunto de resultados usa concurrencia optimista por lotes, este evento sólo se produce cuando se llama al método BatchUpdate. En este caso, se va a enviar al servidor todo el conjunto de cambios.

Si el conjunto de resultados no está en un modo por lotes, el evento WillUpdateRows se produce por cada llamada al método Update, ya que los cambios de la fila se envían inmediatamente al servidor.

En resumen, no importa en qué modo esté el conjunto de resultados; este evento sólo se produce antes de que los datos se envíen realmente al servidor.

Si establece el argumento returnCode a rdUpdateSuccessful, RDO supondrá que el código controló de forma correcta la actualización. RDO no enviará este evento a otros clientes (si hay más de un controlador de este evento) y el estado de las filas y sus columnas se establecerá a rdRowUnmodified y rdColUnmodified, respectivamente.

Si establece el parámetro returnCode a rdUpdateWithCollisions, RDO supondrá que la actualización se controló de forma correcta, pero algunas filas causaron conflictos. RDO no enviará este evento a más clientes (si había más de un controlador de este evento) y no se cambiará el estado de las filas y sus columnas. Es responsabilidad del código establecer los indicadores de estado de las columnas durante el control de este evento. Sólo debe usarse rdUpdateWithCollisions si se está usando concurrencia optimista por lotes y se desea comprobar y controlar las colisiones en el código.

Si el programador establece el parámetro returnCode a rdUpdateFailed, RDO supondrá que el código intentó controlar la actualización, pero encontró un error. RDO no enviará este evento a otros clientes (si había más de un controlador de este evento) y el estado para las filas y sus columnas permanecerá sin cambiar. Finalmente, RDO generará un error en tiempo de ejecución interceptable por el método Update con lo que se producirá el evento WillUpdate.

Si establece el parámetro returnCode a rdUpdateNotHandled, RDO supondrá que el programador no controló la actualización y RDO continuará produciendo este evento en los restantes clientes (si había más de un controlador de este evento). Si todos los clientes devuelven rdUpdateNotHandled, RDO efectuará la actualización él mismo, de acuerdo con las reglas normales.

El valor predeterminado para el parámetro returnCode es rdUpdateNotHandled; por tanto, si ningún cliente asume el evento, o ningún cliente cambia el valor de returnCode, RDO efectuará la actualización.


Colección de objetos: asignación a la propiedad Count no permitida (Error 40051).

No es posible establecer en el código la propiedad Count de esta colección. Visual Basic se encarga de mantenerla automáticamente.


Fila no válida para Addnew (Error 40010).

El puntero de fila actual no es válido para esta operación.


Ya se ha alcanzado el principio del archivo (BOF) (Error 40030).

Intentó usar un método de nueva colocación de la fila activa, como MovePrevious o MoveFirst, cuando el valor de la propiedad BOF es True.


Ya se ha alcanzado el final del archivo (EOF) (Error 40031).

Intentó usar un método de nueva colocación de la fila activa, como MoveNext o MoveLast, cuando el valor de la propiedad EOF es True.


El objeto ya se ha cerrado (Error 40046)

Intentó llamar al método Close en un objeto que ya se ha cerrado.

Para evitar este problema, no utilice el método Close en un objeto que ya esté cerrado.


El objeto rdoConnection ya está conectado a un origen de datos (Error 40072).

Intentó usar el método Establish Connection con un objeto rdoConnection que aún está conectado a un origen de datos. Utilice el método Close para desconectarlo de la conexión actual e intente de nuevo la operación.


El objeto ya está en la colección (Error 40077).

No puede agregar otro miembro a esta colección con el nombre indicado. Ya hay en ella otro miembro con este nombre.


Imposible asignar un valor a una columna no enlazada (Error 40037)

Intentó asignar un valor a una columna que representa un objeto binario grande (BLOB) u otro objeto similar.

Para evitar este error, utilice el método AppendChunk para asignar valores a columnas de este tipo. Utilice la propiedad ChunkRequired para determinar si la columna en cuestión requiere el uso de AppendChunk.


Imposible ejecutar una consulta cuando se está realizando una consulta asíncrona (Error 40045)

Intentó llamar a un método o a una propiedad mientras se está ejecutando una consulta asíncrona.

Para evitar este error, compruebe la propiedad StillExecuting y no llame a métodos o propiedades RDO que afecten a la instrucción SQL hasta que la propiedad StillExecuting devuelva False.


La propiedad no está disponible en el estado actual de RDC (Error 40514).

Algunas propiedades del control RemoteData no están disponibles en tiempo de ejecución.


Sólo el controlador de cursores rdUseClientBatch es compatible con el tipo de bloqueo rdConcurBatch (Error 40081).

Es necesario usar la biblioteca de cursores por lotes del cliente cuando se trabaja con actualizaciones optimistas por lotes o cuando se disocian los objetos rdoResultset.


Esta función no es compatible (Error 40082).

Esta operación no se admite en este contexto.


BOF ya está establecido (Error 40025)

Intentó llamar a rdoResultset.MovePrevious cuando la propiedad BOF era True. Esto significa que el puntero de fila actual ya está situado antes de la primera fila del conjunto de resultados y está intentando efectuar una operación de movimiento para desplazar el puntero de fila a una posición no válida.

Para evitar este error, compruebe el estado de la propiedad BOF antes de llamar al método MovePrevious.


Error general en el cursor del cliente (Error 40069).

Se intentó ejecutar un método BatchUpdate o un método Requery sin un objeto Query asociado.


El objeto no es válido o no está definido (Error 40011).

Intentó asignar un valor mediante un objeto no establecido.


Colección de objetos: imposible encontrar el elemento indicado por texto (Error 40041)

Intentó dirigir un objeto de una colección mediante un valor de texto y ningún objeto de la colección coincide con la cadena de texto proporcionada. Por ejemplo, ha intentado hacer referencia a una columna de un conjunto de resultados por nombre pero la columna especificada no existe en el conjunto de resultados.

Para evitar este error, asegúrese de que un objeto de la colección tenga una propiedad Name que coincida con la cadena de texto proporcionada o utilice el valor ordinal del objeto.


Aquí Colección de objetos: modificación ilegal; la colección es de sólo lectura (Error 40049).

Se intentó eliminar un miembro de una colección de sólo lectura.


Colección de objetos: esta colección no permite ubicación por medio de un indicador de texto (Error 40021)

Intentó buscar un objeto en una colección con una cadena de texto y los objetos de la colección no admiten búsquedas mediante cadenas de texto. Por ejemplo, no puede hacer referencia a miembros de la colección rdoErrors por su nombre, sólo por su número ordinal.

Para evitar este error, utilice en su lugar un valor ordinal como rdoErrors(1).


Colección de objetos: modificación ilegal; la colección es de sólo lectura (Error 40049)

Intentó modificar mediante programa el contenido de una colección RDO. Esta colección RDO es de sólo lectura.

Para evitar este error, no intente modificar el contenido de este tipo de colecciones RDO. Para este tipo de colección, los elementos se agregan automáticamente a la colección y se quitan cuando se invoca el método Close o Remove para un objeto.


Error al configurar el DSN. Compruebe los parámetros y vuelva a intentarlo (Error 40000)

Falló la llamada a rdoEngine.rdoRegisterDataSource.

Para evitar este error, compruebe la validez de los argumentos rdoRegisterDataSource transferidos e inténtelo de nuevo.


Imposible crear una instrucción preparada para conexión no válida a base de datos (Error 40015)

El programa intentó crear un objeto rdoPreparedStatement o rdoQuery, o un objeto rdoConnection no válido

Para evitar este problema, asegúrese de que el objeto rdoConnection esté actualmente conectado a un origen de datos.


CursorDriver incorrecto. Sólo es compatible con rdUseClient (Error 40075).

No puede establecer la propiedad ActiveConnection a menos que esté utilizando la biblioteca de cursores por lotes del cliente.


Un control enlazado a un control de datos mediante este conjunto de resultados canceló la operación o no pudo sincronizarse con el conjunto de resultados (Error 40503).

Un control enlazado a un control de datos que utiliza el conjunto de resultados actual canceló la operación actual o no pudo sincronizarse con el conjunto de resultados actual.


Un control canceló la operación o ha ocurrido un error interno inesperado (Error 40503).

Un control canceló la operación actual o se produjo un error interno inesperado que hace que se cancele la operación.


<Nombre> no está registrado como un control ActiveX

Ha intentado registrar un control o un archivo DLL que no es un componente ActiveX válido. Compruebe que tiene el control o el archivo DLL correcto. Si es un control o un archivo DLL ActiveX de terceros, póngase en contacto con el vendedor del componente para obtener más información.


No se puede actualizar los controles (Error 40504).

El control RemoteData no pudo actualizar los controles enlazados asociados.


Se ha pasado un valor no válido al parámetro type (Error 40034)

Intentó llamar al método OpenResultset y el valor del argumento type no era uno de los siguientes:

  • rdOpenKeyset

  • rdOpenDynamic

  • rdOpenStatic

  • rdOpenForwardOnly

Para evitar este error, asegúrese de que el argumento type sea uno de los valores mencionados previamente.

Nota No todos los orígenes de datos admiten todos los cursores.


Error de conversión de tipo de datos (Error 40517).

Este error se debe normalmente a la incapacidad de convertir los tipos de datos Variant cuando se intenta establecer una columna de datos desde un control enlazado.


Se ha hecho clic en Cancelar en un cuadro de diálogo ODBC que solicita parámetros necesarios para completar una conexión (Error 40059).

El usuario hizo clic en Cancelar cuando se solicitaban los parámetros necesarios para la conexión como el Id. de usuario, la contraseña o el nombre del origen de datos.


ODBCDirect: GetRows (Error 40035).

No debe usar el método GetRows con campos con valores grandes. Si usa el método GetRows en un objeto Recordset de ODBCDirect que contenga campos con valores grandes (Memo o Long Binary), obtendrá un tipo Variant erróneo en la matriz donde debería estar el valor de tipo Long. La matriz de datos sería “Error 40035” y el tipo de dato sería Variant.


Este nombre de entorno ya existe en la colección (Error 40048)

Intentó llamar al método rdoEngine.rdoCreateEnvironment, rdoConnection.CreatePreparedStatement, rdoConnection.CreateQuery o Add pasando un nombre que ya existe en la colección rdoEnvironments, rdoConnections o rdoPreparedStatements.

Para evitar este error, asegúrese de que el nombre transferido no entre en conflicto con un nombre ya agregado a la colección.


No hay ninguna fila actual (Error 40009).

Intentó modificar, eliminar o realizar alguna otra operación sin que el puntero de fila activa estuviera señalando a una fila válida. Esta situación puede producirse en estos casos:

  • Se han eliminado todas las filas de un conjunto de resultados.

  • No hay filas en un conjunto de resultados.

  • Los marcadores de posición de una o más filas han dejado de ser válidos.


Imposible ejecutar una instrucción rdoPreparedStatement vacía (Error 40018)

Se encontró una cadena Null o vacía en la propiedad SQL de un objeto rdoPreparedStatement o rdoQuery durante la llamada al método Execute.

Para evitar este error, asegúrese de que la instrucción SQL del objeto rdoPreparedStatement o rdoQuery es válida, ya sea pasándola como parámetro a CreatePreparedStatement o CreateQuery estableciendo la propiedad SQL del objeto rdoPreparedStatement o rdoQuery.


El usuario canceló la operación. (Error 40059)

El usuario hizo clic en el botón Cancelar de un cuadro de diálogo ODBC.


Imposible conectar con los objetos de datos remotos (Error 40516)

El control RemoteData no pudo crear un Objeto de datos remotos. Esto puede ocurrir si la biblioteca de objetos de datos remotos de Microsoft no estaba registrada correctamente o si la biblioteca no está presente en su PC.

Para registrar manualmente la biblioteca de Objetos de datos remotos, escriba lo siguiente tras el indicador de comandos:

regsvr32 msrdo32.dll

Si MSRDO32.DLL no está presente en el sistema, reinstale Visual Basic o su aplicación y asegúrese de que adquirió la Edición Empresarial y el programa de instalación de la aplicación lo ha instalado correctamente.


Error. No se puede obtener información del error (Error 40501).

RDO encontró un error interno. No hay información disponible acerca de su causa.


Se intentó ejecutar una instrucción SELECT mediante el método Execute (Error 40057).

El método Execute se utiliza para ejecutar consultas de acciones que no devuelven filas. La consulta ejecutada contiene una o más instrucciones SELECT. En algunos casos, los procedimientos almacenados llaman a otros procedimientos almacenados que contienen instrucciones SELECT.


Se intentó ejecutar una instrucción de selección mediante el método Execute (Error 40057)

Intentó emitir una instrucción SELECT mediante el método Execute. Este error se puede producir también si ejecuta un procedimiento almacenado que contenga una instrucción SELECT.

Para emitir una consulta de selección, debe usar en su lugar el método OpenResultset. El método Execute está designado para usarlo con consultas de acciones (Insert, Update, Delete).


Error al cargar RDOCURS.DLL (Error 40078).

El archivo DLL de biblioteca de cursores por lotes no se encuentra o está dañado.


Columna no enlazada correctamente (Error 40035)

Se intentó abrir un conjunto de resultados con una columna de tipo de datos desconocida. En la mayoría de los casos, el controlador de ODBC es capaz de reconocer todos los tipos de datos compatibles con la versión del servidor al que se está teniendo acceso. Este error se puede producir cuando el controlador no reconoce uno de los tipos de datos devueltos.

Para obtener más información, vea la documentación del origen de datos del que procede la columna. Por ejemplo, vea el archivo DRVSSRVR.HLP para obtener información detallada acerca del controlador de SQL Server.


Imposible asignar un valor a una columna salvo en modo de edición (Error 40039)

Intentó asignar un valor a una columna antes de llamar a rdoResultset.Edit o a rdoResultset.AddNew.

Para evitar este error, asegúrese de que se ha llamado al método Edit o AddNew antes de asignar valores a las columnas con la propiedad Value o el método AppendChunk.


Imposible asignar un valor a una columna no actualizable (Error 40038)

Intentó asignar un valor a una columna que no es actualizable.

Para evitar este error, asegúrese de que el conjunto de resultados es actualizable antes de asignar un valor a una columna con la propiedad Value o el método AppendChunk. Observe que la propiedad Updatable no siempre refleja la posibilidad de actualización de los conjuntos de resultados debido a varios factores, entre los que se incluyen los permisos y el tipo de cursor.


No se puede asignar un valor a un campo no actualizable (Error 40038).

Intentó modificar la propiedad Value de una columna de base de datos marcada como de sólo lectura.


Tipos de datos incompatibles para comparar (Error 40014)

Se llamó a un rdoResultset con un valor de argumento cuyo tipo de datos no es compatible con el tipo de datos de la columna comparada.

Para evitar este problema, asegúrese de que el valor que está utilizando en la comparación coincide con el tipo de datos de la columna comparada. Además, este método sólo es válido cuando se llama mediante un control del origen de datos.


Tipos de datos incompatibles para comparar (Error 40014).

Intentó comparar dos tipos de datos incompatibles. Por ejemplo, intentó comparar un tipo binario con un tipo numérico.


El objeto rdoConnection está ocupado con la conexión (Error 40073).

No puede usar el objeto rdoConnection hasta que la propiedad StillConnecting devuelva el valor False.


Tipo incorrecto al asignar la propiedad Value de rdoParameter (Error 40044).

El tipo de datos asociado a rdoParameter no coincide con el tipo de datos del valor que se le asigna. Por ejemplo, el tipo de datos es Integer y se le está asignando un valor String.

Siempre que sea posible, RDO elige los tipos de datos de los parámetros según la información que le transmite el origen de datos remoto. Puede anular este tipo de datos si establece el tipo correcto en la propiedad Type del objeto rdoParameter.


El objeto está todavía en otra colección (Error 40083).


Fila no válida para AddNew (Error 40010)

Se llamó a rdoResultset.AddNew cuando el cursor estaba situado en una fila no válida o cuando el programa había llamado previamente a AddNew o Edit sin llamar primero a Update o sin cancelar la operación.

Para evitar este error, desplace el cursor a una fila válida y asegúrese de que tiene un conjunto de resultados válido y de que la secuencia de llamadas a rdoResultset es correcta.


Algún argumento no es válido (Error 40508)

Un valor de al menos uno de los argumentos llamados por este método está fuera del intervalo de valores válidos del argumento. Utilice valores de argumentos válidos para llamar al método.

Para obtener más información al respecto, vea la documentación acerca del método en cuestión.


Algún argumento no es válido (Error 40508).

Los argumentos suministrados no son válidos en este contexto.


El marcador no es válido (Error 40027)

Se transfirió un valor de marcador no válido a rdoResultset.Move.

Para evitar este error, asegúrese de transferir un marcador válido. Recupere el marcador mediante rdoResultset.Bookmark y asegúrese de que la variable utilizada para almacenar el marcador sigue siendo válida.


El argumento bookmark no es válido para mover (Error 40028)

El argumento marcador de rdoResultset.Move no se transfirió con el tipo de datos correcto.

Para evitar este error, asegúrese de transferir el argumento marcador como un tipo de datos Integer o Byte. Recupere el marcador mediante rdoResultset.Bookmark y asegúrese de que la variable utilizada para almacenar el marcador sigue siendo válida.


Se ha pasado un valor no válido a la opción Concurrency (Error 40019)

Se transfirió un tipo de bloqueo no válido a rdoPreparedStatement.LockType, o al argumento tipoBloqueo de rdoPreparedStatement.OpenResultset, rdoQuery.LockType o rdoQuery.OpenResultset.

Para evitar este error, asegúrese de que transfiere uno de los siguientes tipos de bloqueo válidos:

  • rdConcurReadOnly

  • rdConcurLock

  • rdConcurRowVer

  • rdConcurValues

Nota No todos los tipos de bloqueo se pueden usar en todos los orígenes de datos.


La cadena de conexión no es válida (Error 40005)

Se ha pasado una cadena de conexión no válida a rdoEnvironment.OpenConnection o al método EstablishConnection mediante la propiedad Connect de un objeto rdoConnection privado.

Para evitar este error, asegúrese de transferir una cadena de conexión ODBC válida al método OpenConnection de rdoEnvironment.


Se ha pasado un valor no válido a Cursor Driver (Error 40003)

Se transfirió un valor de tipo no válido a rdoEnvironment.CursorDriver o a rdoEngine.rdoDefaultCursorDriver.

Para evitar este error, transfiera uno de los valores siguientes:

  • rdUseIfNeeded

  • rdUseODBC

  • rdUseServer

  • rdUseClient

  • rdUseNone

Nota No todos los controladores de origen de datos admiten todos los cursores.


Operación no válida con el cursor de tipo forward-only (Error 40008)

El programa llamó a rdoResultset.MovePrevious, rdoResultset.MoveLast o rdoResultset.MoveFirst al procesar una consulta de tipo forward-only.

Para evitar este error, cambie el tipo de cursor a rdOpenKeyset, rdOpenDynamic o rdOpenStatic, o bien llame sólo a MoveNext para un rdoResultset de tipo forward-only.


Debe especificar un nombre válido para el entorno (Error 40047)

Intentó transferir un nombre no válido al argumento nombre al llamar al método rdoEngine.rdoCreateEnvironment o Add sin un rdoEnvironment privado.

Para evitar este error, asegúrese de que transfiere un nombre válido como el argumento nombre. El nombre puede ser cualquier expresión de cadena que no sea nulo o vacía y no debe estar duplicado en la colección.


El objeto no es válido o no está definido (Error 40011)

El programa llamó a un método o a una operación sobre un objeto que se ha cerrado, desechado o no asignado.

Para evitar este error, asegúrese de que:

  • El objeto se ha asignado mediante la sintaxis Set.

  • El objeto o sus objetos primarios no se han cerrado.

  • El objeto no se ha establecido a Nothing.


Se ha encontrado un controlador de ODBC no válido (Error 40004)

Ocurrió un error causado por un controlador de instrucción ODBC no válido al ejecutar una operación ODBC.

Examine la colección rdoErrors para obtener una descripción exacta del problema. Si no encuentra esta información, asegúrese de que una operación anterior no ha desasignado o modificado el controlador de instrucción.


Operación no válida (Error 40055).

La operación no es válida en este contexto.


Operación no válida (Error 40055)

La propiedad o el método invocado no es válido en este contexto. Por ejemplo, puede que haya utilizado el método Edit o Update en un rdoResultset que no es actualizable.

Para evitar este error, compruebe la secuencia de las operaciones que está intentando realizar y asegúrese de que son correctas. Una causa posible es que esté intentando establecer un valor de una columna que sea una metacolumna de datos (es decir, una columna generada desde un rdoTable y no un rdoResultset).


Indicadores de opción no válidos (Error 40085).

Las opciones elegidas no son válidas en este contexto.


Se ha pasado un parámetro no válido (Error 40054)

El valor transferido a una propiedad o a un método no es un valor válido.

La mayoría de las propiedades y los métodos aceptan valores de un único tipo dentro de un intervalo determinado y se ha asignado un valor no apropiado a una propiedad o a un método. Vea el tema de Ayuda relativo a la propiedad o el método para determinar los tipos y los intervalos válidos de valores.


Valor de la propiedad no válido (Error 40505).

El valor asignado no es válido para esta propiedad.


El indicador de búsqueda no es válido (Error 40012)

Se transfirió un indicador de búsqueda no válido a rdoResultset. Este mensaje sólo se aplica a programadores que crean controles enlazados de otros proveedores.

Para evitar este error, asegúrese de que el indicador transferido es uno de los siguientes valores:

  • DBSEEK_LT

  • DBSEEK_LE

  • DBSEEK_EQ

  • DBSEEK_GE

  • DBSEEK_GT

  • DBSEEK_PARTIALEQ

Además, este método sólo es válido cuando se le llama desde un control del origen de datos.


Estado no válido para Move (Error 40023).

No puede usar el método Move en este contexto.


Estado no válido para Move (Error 40023)

Intentó llamar a rdoResultset.MoveFirst o a rdoResultset.MoveNext cuando el conjunto de resultados estaba marcado como no válido. Un conjunto de resultados puede estar marcado como no válido si:

  • Llamó al método Cancel en el conjunto de resultados antes de llamar al método Move.

  • Llamó al método MoreResults y no hay más conjuntos de resultados.

  • Ocurrió un error SQL.

Para evitar este error, asegúrese de que el conjunto de resultados actual es válido y de que no se ha llamado a una operación que pudiera marcarlo como no válido.


Tipo incorrecto para el parámetro (Error 40040)

Se detectó un Variant con un tipo no válido. Esto puede deberse a que se transfirió un valor a un método o una propiedad RDO que no se puede convertir al tipo adecuado, como intentar transferir un tipo de datos de cadena como un valor numérico.

Para evitar este problema, asegúrese de que el valor transferido es del tipo correcto para la operación. Para valores de columnas, puede comprobar la propiedad Type de la columna para asegurarse de que se está enviando el tipo adecuado.


El estado del conjunto de resultados no es válido para actualizar (Error 40026)

Intentó llamar a rdoResultset.Update cuando el puntero de fila actual no estaba señalando a una fila válida o el conjunto de resultados estaba marcado como no válido. Esto ocurre si:

  • El puntero de fila actual está señalando a EOF o BOF.

  • El conjunto de resultados se ha marcado como no válido debido a una llamada a un método como Cancel.

  • Ocurrió un error SQL.

Además, al eliminar una fila también se marcará como no válida.

Para evitar este error, compruebe el estado de las propiedades BOF y EOF antes de llamar a Update, y asegúrese de que antes de llamar a Update no se llamó a ningún método que pueda marcar el conjunto de resultados como no válido.


Error al cargar la biblioteca de versión (VERSION.DLL) (Error 40016)

Intentó llamar a rdoEngine.rdoVersion y la aplicación no pudo cargar el archivo de biblioteca de Win32, VERSION.DLL.

Para evitar este error, asegúrese de que el archivo VERSION.DLL esté en la ruta de acceso del sistema.


Error al cargar la biblioteca de instalación de ODBC (odbccp32.dll) (Error 40032)

Intentó llamar a rdoEngine.rdoRegisterDataSource y la aplicación no pudo cargar el archivo de biblioteca de instalación ODBC, ODBCCP32.DLL.

Para evitar este error, asegúrese de que ODBC está correctamente instalado en la máquina que generó el error y que el archivo ODBCCP32.DLL está en la ruta de acceso del sistema.


No se puede cargar la biblioteca de recursos correspondiente a rdoLocaleID (Error 40061).

No se encuentra el archivo DLL de configuración regional local o está dañada.


Error al cargar la biblioteca Win32 (version.dll) (Error 40016).


El control RemoteData informa: sin memoria (Error 40510).

Este error puede deberse a que se ha agotado cualquiera de los recursos internos, como la RAM, el espacio de intercambio en disco o los controladores internos.


No se puede llamar al método en el estado actual del control RemoteData (Error 40507).

No puede usar este método en el estado actual del control RemoteData.


Imposible moverse de forma relativa a la fila actual cuando están activados EOF o BOF (Error 40029)

Intentó llamar a rdoResultset.Move especificando un desplazamiento relativo (transfiriendo Null como el argumento marcador) cuando el conjunto de resultados está situado actualmente en EOF o BOF, o el conjunto de resultados está marcado como no válido.

Nota Si EOF o BOF están establecidas, se debe transferir un marcador válido como parte de la llamada a Move.

Para evitar este error, asegúrese de que las propiedades EOF o BOF no están establecidas, o de que se proporciona un marcador válido.


Ya está al final del conjunto de resultados (Error 40024)

Intentó llamar a rdoResultset.MoveNext cuando la propiedad EOF estaba establecida a True.

Para evitar este error, compruebe el estado de la propiedad EOF antes de llamar a MoveNext.


El tipo de cursor debe ser: rdOpenForwardOnly. LockType debe ser: rdConcurReadOnly. RowsetSize debe ser: 1 (Error 40080).

Para este tipo de operación, debe usar un conjunto de resultados "sin cursor". Si establece las opciones de OpenResultset como se indica, RDO creará un conjunto de resultados sin cursor.


GetNewEnum: imposible obtener la interfaz de IID_IUnknown (Error 40050)

Ocurrió un error interno mientras se intentaba asignar memoria para activar la sintaxis For...Each para iterar sobre una colección.

Este error puede estar producido por alguna condición que consume los recursos del sistema incluyendo los controladores internos, la memoria RAM, el espacio en disco o punteros a referencias de objetos. Busque procedimientos recursivos o procedimientos que provoquen pérdida de memoria.


rdoQuery o rdoResultset no tienen ninguna conexión activa (Error 40074).

La operación que intentó no está permitida a menos que el objeto tenga una conexión activa.


El búfer de columnas está enlazado y es imposible anexar datos. Use la propiedad Value para establecer los datos (Error 40048).


La conexión no está abierta (Error 40512).

La operación que intentó requiere que el objeto rdoConnection esté asociado a un servidor específico. Utilice el método EstablishConnection o el método OpenConnection para abrir la conexión.


No hay ninguna fila actual (Error 40009)

Se realizó una llamada a rdoResultset.Edit cuando el cursor estaba situado en una fila no válida. Este error puede provocarse al intentar modificar una fila eliminada o al invocar Edit cuando el cursor está situado antes de la primera fila o detrás de la última fila.

Para evitar este error, desplace el cursor a una fila válida y asegúrese de que tiene un conjunto de resultados válido. No puede usar el método Edit si alguna de las propiedades BOF o EOF son True.


SQL ha devuelto 'No se han encontrado datos' (Error 40001)

Intentó ejecutar una instrucción SQL que devolvió un mensaje indicando que no se encontraron datos para una consulta o que ninguna fila se vio afectada por la instrucción de acción (Insert, Update, Delete) que intentó ejecutar. Sin embargo, puede ser una respuesta válida cuando se emite una consulta que espera que no existan datos o filas para esa consulta.

Para evitar este error, modifique los criterios de la instrucción SQL e inténtelo de nuevo.


Error sin información disponible (Error 40501).

RDO encontró un error interno. No hay información disponible acerca de su causa.


Colección de objetos: no se puede agregar elementos que no sean objetos (Error 40053).

Se intentó agregar a una colección un objeto de un tipo distinto. Por ejemplo, este error aparece al intentar agregar un objeto rdoResultset a una colección rdoQueries.


No se puede conectar con los objetos de datos remotos (Error 40516).

Este error se debe a un fallo al conectar con el origen de datos especificado. El fallo en la conexión puede deberse a que la red, el servidor remoto, la autorización del usuario u otras opciones no son válidas. También puede provenir de un fallo de hardware en la red, en el servidor remoto o en otros componentes de conectividad asociados.


No se actualizaron o eliminaron filas

Este error sucede al usar métodos de movimiento relativos (como MovePrevious, MoveNext, etc.) con un cursor dinámico de conjunto de resultados.

También puede ocurrir al usar un cursor dinámico después de que otro usuario ha eliminado filas justo antes o después de su ventana de resultados actual (es decir, en las filas que están en la memoria caché de su cliente). Cuando se mueve por las filas eliminadas, se devuelven alguna de las filas en su ventana actual después de que se le pregunte por el tamaño del conjunto de filas anterior o siguiente. Cuando está próximo al principio o al final de un conjunto de resultados, puede obtener datos superpuestos ya que no hay suficientes filas para conseguir un único conjunto de resultados.

Si se establece un tamaño pequeño de conjunto de resultados es posible solucionar este problema. Se degrada el rendimiento, pero si esto es un problema, es mejor que no use un cursor dinámico en primer lugar, ya que no es el más rápido para mover datos comparado con otros cursores.

Debido a esto, y por los problemas con los mensajes de error cuando se han eliminado los datos, es recomendable que evite usar cursores dinámicos a menos que los necesite y sepa qué está haciendo. Es más sencillo trabajar con un cursor de conjunto de claves o estático que con un cursor dinámico, y un cursor estático en el lado del cliente es, probablemente, la mejor elección para la mayoría de las aplicaciones cliente/servidor.


Esta columna no tiene el indicador ChunkRequired activado. Use el valor para recuperar el contenido (Error 40060).

No debe usar el método GetChunk con columnas que no requieren su uso.


El objeto rdoConnection no está conectado a ningún origen de datos (Error 40071).

Pueden hacerse instancias de los objetos rdoConnection, pero no conectarse a un origen de datos específico. Para realizar esta operación, primero debe usar el método EstablishConnection o el método OpenConnection para abrir la conexión.


Error interno de ODBC (Error 40002)

Ha ocurrido un error ODBC en la propiedad o el método invocado más recientemente.

El error concreto depende del controlador ODBC y del tipo de base de datos que esté utilizando. Examine la colección rdoErrors para obtener una descripción exacta del problema.

Nota ODBC puede generar más de un error durante la ejecución de una instrucción. Asegúrese de comprobar cada error de la colección rdoErrors.


Se ha encontrado un controlador de ODBC no válido (Error 40004).

El código hacía referencia a un controlador ODBC no válido, como las propiedades hEnv, hDbc o hStmt. Si utilizó directamente la API de ODBC, puede haber hecho que uno o más controladores dejen de ser válidos.


Operación no válida con el cursor de tipo forward-only (Error 40008).

Los cursores de tipo forward-only (sólo hacia adelante) no admiten el método de colocación de fila que se está empleando. Para volver a colocar un cursor de tipo forward-only, únicamente puede usar el método MoveNext.


Sin memoria (Error 40510)

Se necesitaban más recursos del sistema de los que hay disponibles. Este error podría tener una o varias de las siguientes causas y soluciones:

  • Hay demasiadas aplicaciones, documentos o archivos de origen abiertos.

    Cierre las aplicaciones, documentos o archivos de origen innecesarios.

  • Tiene demasiados formularios o controles cargados.

    Elimine la sobrecarga innecesaria o interrumpa su aplicación para que se carguen menos formularios y controles de una vez.

  • Se ha quedado sin espacio para las variables Public.

    Reduzca el número de variables Public.

  • Se ha agotado el espacio TEMP o de memoria virtual disponible.

    Utilice el medidor de recursos del sistema para ver los recursos del sistema disponibles. Compruebe el espacio disponible en disco.

  • No tiene suficiente memoria RAM para ejecutar la aplicación o el grupo de aplicaciones cargadas en memoria.

    Incremente la cantidad de memoria RAM disponible instalando más memoria o vuelva a asignar memoria para reducir el tamaño de SmartDrive u otras asignaciones de memoria caché.

  • La aplicación ha generado una pérdida de memoria; asigna memoria pero no la libera cuando ya no es necesaria.

  • Ha escrito código re-entrante que no se ejecuta correctamente o procedimientos que asignan demasiada memoria para las matrices.


Imposible asignar un valor a un parámetro de sólo salida (Error 40043)

Se intentó establecer un valor para un parámetro que está definido como un parámetro (sólo) de salida.

Para evitar este error, utilice la propiedad Direction para asegurarse de que el parámetro al que desea asignar un valor está definido como parámetro de entrada (rdParamInput) o de entrada y salida (rdParamInputOutput). Normalmente, la propiedad Direction se establece automáticamente basándose en cómo se define el procedimiento llamado, pero algunos controladores requieren que establezca la dirección antes de tener acceso al parámetro. Este error también se puede producir si no coincide el número ordinal o el nombre del parámetro y confunde un parámetro de entrada por uno de salida.


La igualdad parcial necesita una columna de cadenas (Error 40013).


La igualdad parcial necesita columnas de cadenas (Error 40013)

Se llamó a rdoResultset.FindByValues especificando DBSEEK_PARTIALEQ en una columna que no es de cadena. DBSEEK_PARTIALEQ sólo funciona sobre columnas que contienen datos de cadenas.

Para evitar este error, utilice DBSEEK_PARTIALEQ sólo sobre columnas basadas en cadenas. Además, este método sólo es válido cuando le llama un control del origen de datos.

Este mensaje se aplica a programadores que crean controles enlazados de terceros.


Se ha pasado un valor no válido al argumento prompt (Error 40033)

Intentó llamar a rdoEnvironment.OpenConnection y el valor del argumento prompt no era uno de los siguientes:

  • rdDriverPrompt

  • rdDriverNoPrompt

  • rdDriverComplete

  • rdDriverCompleteRequired

Para evitar este error, asegúrese de que el argumento prompt sea uno de los valores mencionados previamente.


Actualmente esta propiedad es de sólo lectura (Error 40076).

Esta propiedad no puede alterarse en el estado actual del objeto.


Un control ha cancelado la operación o ha ocurrido un error interno inesperado (Error 40503)

El control RemoteData intentó actualizar una fila basada en los datos de un control enlazado, pero falló la operación Update. Esto ocurre normalmente por una de las siguientes razones:

  • Falló la validación de los datos del control enlazado.

  • Los datos no son del tipo de datos adecuado para la columna del conjunto de resultados.

  • El valor del control enlazado no coincide con la descripción de fila, la regla o los criterios del desencadenante.

Examine y modifique los valores de los datos e intente de nuevo la operación.


La conexión no está abierta (Error 40512)

La propiedad Connection no puede hacer referencia a una conexión válida con una base de datos porque no hay ninguna conexión con una base de datos. Para establecer una conexión con una base de datos, compruebe la propiedad SQL, establezca la propiedad DataSourceName o Connection a un valor válido y utilice el método Refresh contra el control RemoteData .


Objeto no válido (Error 40506)

Se asignó un objeto distinto de un rdoResultset a la propiedad Resultset. Asigne un objeto rdoResultset válido a la propiedad Resultset. El único objeto que se puede asignar a la propiedad Resultset del control RemoteData es un objeto rdoResultset creado con otro control RemoteData o con el método OpenResultset.


Valor de la propiedad no válido (Error 40505)

Se ha asignado un valor inadecuado a una propiedad. La mayoría de las propiedades sólo aceptan valores de un cierto tipo y dentro de un intervalo determinado.

Para ver los valores apropiados de una propiedad, vea la documentación acerca de la propiedad en cuestión.


Imposible llamar al método en el estado actual de RDC (Error 40507)

Se ha llamado a un método que no se puede completar mientras se está realizando una operación AddNew o Edit. Por ejemplo, no puede llamar al método Refresh mientras el control RemoteData(RDC) está modificando una fila existente o agregando una fila nueva. Asegúrese de que las operaciones AddNew y Edit se han completado ejecutando el método Update o CancelUpdate, o utilizando uno de los métodos Move antes de llamar al método que provocó el error.

Para obtener más información al respecto, vea la documentación acerca del método en cuestión.


Imposible establecer la propiedad en el estado actual de RDC (Error 40513)

Algunas propiedades del control RemoteData (RDC) no se pueden establecer después de haber establecido mediante programa la propiedad Resultset. Si crea un objeto rdoResultset en el código y lo asigna a la propiedad Resultset del control RemoteData, el control RemoteData no puede restablecer automáticamente ciertas propiedades, como DataSourceName, Options, Password, QueryTimeout y UserName. El control RemoteData no puede restablecer estas propiedades porque el objeto rdoResultset se creó fuera del control RemoteData.

Para restablecer estas propiedades, cierre el objeto rdoResultset actual, establezca a nuevos valores mediante programa las propiedades del control RemoteData y llame al método Refresh contra el control RemoteData para regenerar el conjunto de resultados.

Para obtener más información al respecto, vea la documentación acerca de la propiedad en cuestión.


La propiedad no está disponible en el estado actual de RDC (Error 40514)

Como no es posible tener acceso a algunas propiedades hasta que se establezca una conexión válida con el control RemoteData(RDC) y RDO, el estado del control RemoteData restringe el acceso de lectura a esta propiedad. Establezca las propiedades apropiadas del control RemoteData y utilice el método Refresh para establecer una conexión.

Para obtener más información al respecto, vea la documentación acerca de la propiedad en cuestión.


Imposible actualizar los controles (Error 40504)

El método Refresh del control RemoteData falló debido a una de las siguientes razones:

  • No se pudo establecer una conexión.

  • No se pudo abrir un conjunto de resultados.

  • Falló la actualización de un control enlazado.

Compruebe la conexión, el conjunto de resultados y los enlaces del control (repase la información de la documentación del control enlazado). Este error también puede ocurrir si se interrumpe inesperadamente la conexión con el servidor o con la red. Generalmente, indica que el rdoResultset o la conexión ya no son utilizables.


El conjunto de resultados no está disponible (Error 40511)

La propiedad Resultset no puede encontrar un conjunto de resultados válido porque ocurrió un error al abrir el conjunto de resultados o éste está cerrado. Establezca la propiedad SQL a un valor válido o utilice el método Refresh contra el control RemoteData .


Error. Imposible obtener información del error (Error 40502)

Ha ocurrido un error en el control RemoteData y no hay información detallada disponible del error. Este error ocurre sólo en circunstancias muy excepcionales, nunca durante el funcionamiento normal. Obtendrá este mensaje de error sólo cuando el control RemoteData no pueda tener acceso a información detallada del error. Esta situación sólo se produce cuando OLE no está funcionando correctamente y suele ser una indicación de una condición de error más grave.


Error interno inesperado (Error 40500)

El control RemoteData intentó notificar a los controles enlazados que hay disponibles nuevos datos, pero recibió un código de fallo de RDO en su lugar. Este error sólo se produce en circunstancias muy excepcionales, nunca durante el funcionamiento normal y sólo si hay algún problema muy grave en el administrador de enlaces de Visual Basic o en los propios controles enlazados. Este mensaje de error suele ser una indicación de una condición de error más grave.


El conjunto de resultados está vacío (Error 40022)

Intentó realizar una llamada a rdoResultset.Move, rdoResultset.MoveNext o rdoResultset.MovePrevious en un conjunto de resultados vacío.

Para evitar este error, antes de usar cualquiera de los métodos previamente mencionados, asegúrese de que la instrucción SQL utilizada devuelve un conjunto de resultados válido. Puede comprobar si un conjunto de resultados está vacío si comprueba la propiedad RowCount o comprueba si las dos propiedades EOF y BOF son True.


El conjunto de resultados es de sólo lectura (Error 40058).

Intentó actualizar, agregar o eliminar filas de un conjunto de resultados que no admite estas operaciones.


Intentó situarse en una fila eliminada (Error 40056).

Usted u otro usuario que comparte los datos ha eliminado la fila.


El conjunto de resultados está vacío (Error 40509).

No se devolvió ninguna fila en el conjunto de resultados o se eliminaron todas las filas.


El conjunto de resultados no está disponible (Error 40511).

No es posible hacer referencia al conjunto de resultados en su estado actual.


La fila a la que intentó desplazarse se ha eliminado (Error 40056)

La fila a la que se intentó desplazar mediante un marcador se ha eliminado de la base de datos. La fila de la base de datos en cuestión puede haberse eliminado por algún otro programa que tenga acceso a la fila.

Para evitar este error, intente de nuevo la operación, especificando un marcador válido.


El conjunto de resultados está vacío (Error 40509)

El conjunto de resultados está vacío, por lo que no se puede llamar a una operación que requiera el método UpdateRow para una fila inexistente. Asegúrese de que el conjunto de resultados no esté vacío antes de llamar a UpdateRow.


Imposible establecer la propiedad en el estado actual de RDC (Error 40513).

Algunas propiedades del control RemoteData no pueden establecerse en tiempo de ejecución.


No se puede encontrar la tabla para actualizar (Error 40079).

El analizador de SQL no puede determinar la tabla que hay que actualizar.


El conjunto de resultados es de sólo lectura (Error 40058)

Intentó una operación Edit, Delete o AddNew en un conjunto de resultados de sólo lectura. Asegúrese de que especifica el valor LockType correcto que admite consultas de acciones al abrir el conjunto de resultados.


El tipo no coincide (Error 40515).

No coinciden los tipos de datos de la columna o del parámetro especificado.


El tipo no coincide (Error 40515)

Se pasó un tipo de argumento erróneo en el parámetro de evento del control RemoteData. Compruebe los valores del argumento.

Para obtener más información al respecto, vea la documentación acerca del evento en cuestión.


No se puede abrir el conjunto de resultados de una tabla sin nombre (Error 40020).

Debe dar nombre a todas las tablas a las que hace referencia el objeto rdoTable.


Columna sin enlazar; use GetChunk (Error 40036)

Intentó tener acceso a una columna que contiene un objeto binario grande (BLOB) o un objeto similar.

Para evitar este error, utilice el método GetChunk para tener acceso a las columnas de este tipo. Si este error ocurre al usar parámetros, no puede usar parámetros en columnas que representan objetos binarios grandes (columnas de texto o imagen en SQL Server). Puede usar la propiedad ChunkRequired para determinar si la columna en cuestión requiere el uso de GetChunk.


Imposible asignar un valor a un parámetro no enlazado (Error 40042)

Se intentó establecer un valor para un parámetro que no se ha enlazado.

Para evitar este error, asegúrese de que ningún método RDO anterior devolvió un error. Si se devolvió algún error, arregle la instrucción SQL transferida e intente de nuevo la operación.


Error inesperado (Error 40501)

El control RemoteData intentó llamar a un método RDO que normalmente debería existir. Este método no se encontró o la llamada no se completó correctamente. Este error sólo se produce en circunstancias muy excepcionales, nunca durante el funcionamiento normal. Verá este mensaje de error sólo cuando el control RemoteData no pueda obtener un interfaz para RDO o cuando falle un método RDO por una razón desconocida. Este mensaje de error suele ser una indicación de una condición de error más grave.


Error inesperado (Error 40006)

Ocurrió un error inesperado que hizo que RDO fuera inestable. Este error también se puede producir si utiliza la API de ODBC para manipular objetos generados por RDO mediante uno de los controladores ODBC.

Para evitar este error, asegúrese de que tiene suficientes recursos y memoria libres; después vuelva a iniciar el programa e inténtelo de nuevo.


Error interno inesperado (Error 40503).

Este tipo de error puede deberse a diversas comprobaciones internas de validez que indican que la aplicación puede haberse quedado sin recursos o puede tener otros problemas no determinados.


Imposible ejecutar una instrucción rdoPreparedStatement sin preparar (Error 40017)

Ocurrió un error ODBC al intentar preparar la instrucción SQL transferida en rdoPreparedStatement.Execute o rdoQuery.Execute.

Compruebe la colección rdoErrors para obtener más detalles y asegúrese de que la instrucción SQL del objeto rdoPreparedStatement o rdoQuery es válida para el origen de datos al que está haciendo referencia.


Debe usar AppendChunk para establecer un dato en un campo TEXT o IMAGE (BLOB) (Error 40052).

El número de bytes del campo requiere el uso del método AppendChunk. Compruebe la propiedad ChunkRequired para determinar cuándo es necesario usar los métodos Chunk.


Add (Método, datos remotos)

Agrega un miembro a un objeto Collection de Remote Data.

Sintaxis

objeto.Add elemento, clave, antes, después

La sintaxis del métdo Add consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset que contiene la colección rdoColumns.
elemento | Necesario. Una expresión de cualquier tipo que indica el miembro a agregar en la colección.
clave | Opcional. Una expresión de cadena única que indica una cadena de clave que se puede usar, en lugar de un índice posicional, para tener acceso a los miembros de una colección.
antes | Opcional. Una expresión que especifica una posición relativa en la colección. El miembro a agregar se sitúa en la colección antes del miembro identificado por el argumento antes. Si es una expresión numérica, antes debe ser un número entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de cadena, antes debe corresponder con la clave indicada cuando se haga referencia al miembro a agregar en la colección. Puede especificar una posición antes o una posición después, pero no ambas.
después | Opcional. Una expresión que especifica una posición relativa en la colección. El miembro a agregar se sitúa en la colección antes del miembro identificado por el argumento antes. Si es una expresión numérica, antes debe ser un número entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de cadena, después debe corresponder con la clave indicada cuando se haga referencia al miembro a agregar en la colección. Puede especificar una posición antes o una posición después, pero no ambas.

Comentarios

Si el argumento antes o después es una expresión de cadena o una expresión numérica, debe hacer referencia a un miembro existente de la colección o ocurrirá un error.

También ocurre un error si una clave especificada duplica la clave de un miembro que ya existe en la colección.


AddNew (Método, datos remotos)

Crea una nueva fila para un objeto rdoResultset actualizable.

Sintaxis

objeto.AddNew

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

El método AddNew prepara una nueva fila que puede modificar y posteriormente agregar al objeto rdoResultset indicado por objeto mediante el método Update. Este método inicializa las columnas a SQL_IGNORE para asegurar que las columnas a las que no se haga explícitamente referencia no se incluyan en la operación de actualización.

Cuando se ejecuta el método AddNew, la propiedad EditMode se establece a rdEditAdd hasta que ejecute el método Update.

Después de modificar la nueva fila, utilice el método Update para guardar las modificaciones y agregar la fila al conjunto de resultados. No se realizan cambios en la base de datos hasta que utilice el método Update, a menos que esté usando la biblioteca de cursores Client Batch, que no escribe en la base de datos hasta que se use el método BatchUpdate.

El método AddNew no devuelve un error si el rdoResultset no es actualizable. Cuando se utiliza el método Update contra un objeto no actualizable, se desencadena un error interceptable. Para que un objeto sea actualizable, los objetos rdoColumn, rdoResultset y rdoConnection deben ser todos actualizables; compruebe la propiedad Updatable de cada uno de estos objetos antes de realizar una actualización. Hay varias razones por las que rdoResultset no es actualizable, como se describe en el tema del método Update.

Precaución Si utiliza el método AddNew en una fila y después realiza cualquier operación de desplazamiento a otra fila sin usar Update, las modificaciones se pierden sin avisar. Además, si cierra el objeto o finaliza el procedimiento que declara el objeto o su objeto rdoConnection, la nueva fila y las modificaciones realizadas a ella se desechan sin avisar.

Una fila recién agregada podría ser visible como parte del rdoResultset si el origen de datos y el tipo de cursor lo admiten. Por ejemplo, las filas recientemente agregadas no se incluyen en un rdoResultset de tipo estático.

Cuando filas recién agregadas se incluyen en el rdoResultset, la fila que era actual antes de usar AddNew permanece activa. Cuando la fila se agrega al conjunto de claves de cursor, y se desea que la nueva fila sea la actual, puede establecer la propiedad Bookmark al marcador identificado por el valor de la propiedad LastModified.

Si necesita cancelar una operación AddNew, use el método CancelUpdate.

Si utiliza el método Update después de usar el método AddNew, se activará el evento RowCurrencyChange.


AppendChunk (Método, datos remotos)

Anexa datos desde una expresión Variant a un objeto rdoColumn con un tipo de datos rdTypeLONGVARBINARY o rdTypeLONGVARCHAR.

Sintaxis

objeto ! columna.AppendChunk origen

La sintaxis del método AppendChunk consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset que contiene la colección rdoColumns.
columna | Una expresión de objeto que da como resultado un objeto rdoColumn cuya propiedad ChunkRequired está establecida a True.
origen | Una expresión de cadena o una variable que contiene los datos que desea anexar al objeto rdoColumn especificado por columna.

Comentarios

Las columnas de datos de tipo chunk están diseñadas para almacenar valores binarios (BLOB) o de texto cuyo tamaño puede variar desde unos pocos caracteres hasta más de 1,2 GB y se almacenan en la base de datos en páginas de datos sucesivas. En la mayoría de los casos, los datos de tipo chunk no se pueden administrar en una única operación, por lo que debe usar los métodos chunk para guardar y escribir los datos. Si la propiedad ChunkRequired es True para una columna, debe usar el método AppendChunk para manipular los datos de la columna. Sin embargo, si hay suficiente memoria interna disponible, RDO puede realizar la operación sin usar el método AppendChunk. Es decir, puede asignar simplemente un valor a una columna BLOB.

Utilice el método AppendChunk para escribir bloques de datos sucesivos en la columna de la base de datos y GetChunk para extraer datos de la columna de la base de datos. Ciertas operaciones (como por ejemplo copiar) implican cadenas temporales. Si el espacio para las cadenas está limitado, puede que sea necesario trabajar con segmentos más pequeños de una columna de tipo chunk en vez de con toda la columna.

Utilice la propiedad BindThreshold para especificar el tamaño máximo de columna que se enlazará automáticamente.

Utilice la propiedad ColumnSize para determinar el número de bytes de una columna de tipo chunk. Observe que para las columnas de tamaño variable no es necesario volver a escribir el mismo número de bytes que los devueltos por la propiedad ColumnSize, ya que ColumnSize refleja el tamaño de la columna antes de las modificaciones.

Si no hay ninguna fila actual cuando usa el método AppendChunk, se producirá un error interceptable.

Nota El método AppendChunk inicial (después del primer método Edit), aunque la fila ya contenga datos, reemplaza los datos existentes en la columna. Las llamadas subsecuentes a AppendChunk dentro de una única sesión Edit anexa los datos a los existentes en la columna.


BatchUpdate (Método, datos remotos)

Realiza una actualización optimista por lotes.

Sintaxis

objeto.BatchUpdate (filaÚnica, forzar)

La sintaxis del método BatchUpdate consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
filaÚnica | Un valor de tipo Boolean que es True si se realiza la actualización sólo en la fila actual o False si la actualización se aplica a todas las filas del lote. El valor predeterminado es False.
forzar | Un valor de tipo Boolean que es True si la fila o el lote de filas sobrescribirá las filas existentes en la base de datos, independientemente de si causarán o no colisiones. El valor predeterminado es False.

Comentarios

Este método realiza una operación de actualización optimista por lotes. Cuando se usa la concurrencia optimista por lotes, es necesario llamar a este método para devolver realmente los cambios al servidor.

La actualización por lotes se usa siempre que se quiera abrir una conexión mediante la biblioteca de cursores Client Batch (rdUseClientBatch). En este caso, cada vez que use los métodos Update o UpdateRow se actualizará el rdoResultset local, pero no se cambiarán las tablas base de la base de datos. El método BatchUpdate se usa para actualizar las tablas base de la base de datos con cualquier información modificada desde que se creó el rdoResultset o se sincronizó con el comando BatchUpdate.

El método BatchUpdate actualiza la propiedad BatchCollisionRows para incluir un marcador para cada fila en la que ha fallado la actualización; entra en conflicto con filas existentes que tengan datos más actuales que el objeto rdoResultset tal como existía cuando se leyó por primera vez. La propiedad BatchCollisionCount indica cuántas colisiones se producen durante el proceso de actualización por lotes.

Si usa el método CancelBatch, se descartan los cambios guardados en el objeto rdoResultset local. Cuando use el método CancelUpdate, sólo se desharán al estado anterior a la ejecución del último método Update los cambios de las filas actuales.

El parámetro filaÚnica puede usarse junto con el parámetro forzar para forzar la versión del cliente de los datos de la base de datos, incluso si se han producido colisiones. El parámetro filaÚnica indica a RDO que sólo devuelva la fila actual al servidor, no todo el lote; el parámetro forzar indica a RDO que fuerce los datos y no use la detección de concurrencia optimista normal.

Si establece los parámetros filaÚnica y forzar a True se sobrescribirá una única fila de la base de datos con la fila actual rdoResultset actualizada. Esto es útil cuando se procesen filas con colisiones y quiera forzar el guardar su versión local de la base de datos cualquiera que sea el valor de la fila actual de la base de datos.

Establecer filaÚnica a False y forzar a True hará que todas las filas modificadas se fuercen a introducirse en la base de datos; esto es útil como una forma abreviada de forzarlo todo (el escenario el último gana).

Establecer filaÚnica a True y forzar a False hará que la fila actual se actualice con concurrencia optimista, lo cual es útil cuando sólo quiere actualizar la fila actual y no todo el lote.


BeginTrans, CommitTrans, RollbackTrans (Métodos, datos remotos)

Los métodos de transacciones administran el procesamiento de transacciones durante una sesión representada por el marcador de posición de objeto de la siguiente forma:

  • BeginTrans comienza una nueva transacción.

  • CommitTrans finaliza la transacción actual y guarda los cambios.

  • RollbackTrans finaliza la transacción actual y restaura las bases de datos del objeto rdoEnvironment al estado en que estaban cuando comenzó la transacción actual.

Puede usar los métodos de transacciones con un objeto rdoConnection pero en este caso, el alcance de la transacción sólo incluye los objetos rdoResultset y rdoQuery creados bajo rdoConnection.

Sintaxis

objeto.BeginTrans | CommitTrans | RollbackTrans

El marcado de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Utilice los métodos de transacciones con un objeto rdoEnvironment o rdoConnection cuando desea tratar una serie de modificaciones realizadas a las bases de datos en una sesión como una unidad lógica. Es decir, si el conjunto de operaciones se completa como un conjunto o si se deshace como un conjunto. De esta forma si una operación del conjunto falla, la transacción entera falla. Las transacciones también le permiten realizar cambios temporales en la base de datos, cambios que se pueden descartar con el método RollbackTrans.

Normalmente, los controladores ODBC funcionan en uno de estos dos modos:

  • Modo de confirmación automática: cuando no ha iniciado una transacción de forma explícita mediante el método BeginTrans, cada operación ejecutada se transmite inmediatamente a la base de datos cuando se completa.

  • Modo de confirmación manual: cuando inicia una transacción de forma explícita con el método BeginTrans o mediante la función de ODBC SQLSetStmtOption para deshabilitar el modo SQL_AUTO_COMMIT, o al enviar una instrucción SQL para comenzar una transacción (BEGIN TRANS), las operaciones forman parte de una transacción y los cambios no se realizan en la base de datos hasta que use el método CommitTrans. Si la conexión falla antes de ejecutar CommitTrans, o si usa el método RollbackTrans, las operaciones se deshacen, volviendo atrás.

Nota Al trabajar con servidores remotos compatibles con un Distributed Transaction Coordinator (DTC, Coordinador de transacciones distribuidas) como Microsoft SQL Server, puede iniciar y controlar transacciones que impliquen más de un servidor. Es decir, si invoca un procedimiento en el servidor remoto que usa una llamada a un procedimiento remoto, el servicio DTC puede asegurar que esta operación se incluya en la transacción inicial.

Normalmente, las transacciones se utilizan para mantener la integridad de los datos cuando debe actualizar filas en dos o más tablas y asegurarse de que las modificaciones realizadas se completan (realizan) en todas las tablas o en ninguna de ellas (se deshacen). Por ejemplo, si transfiere dinero de una cuenta a otra, restaría una cantidad de una cuenta y la sumaría a la otra. Si falla cualquiera de las actualizaciones, las cuentas quedarían sin equilibrar. Utilice el método BeginTrans antes de actualizar la primera fila y, después, si falla cualquier actualización posterior, puede usar el método RollbackTrans para deshacer todas las actualizaciones. Utilice el método CommitTrans tras haber actualizado satisfactoriamente la última fila.

Precaución Dentro de un objeto rdoEnvironment, las transacciones son siempre globales al rdoEnvironment y no están limitadas a una única base de datos o conjunto de resultados. Si realiza operaciones en más de una base de datos o un conjunto de resultados dentro de una transacción rdoEnvironment, el método RollbackTrans restaura todas las operaciones en dichas bases de datos o conjuntos de resultados.

Una vez que utiliza CommitTrans, no puede deshacer las modificaciones efectuadas durante esa transacción a menos que la transacción esté anidada dentro de otra que se deshaga. No puede anidar transacciones a menos que use una consulta de acciones para ejecutar directamente instrucciones de administración de transacciones de SQL. Si desea tener transacciones simultáneas con alcances solapados no anidados, puede crear objetos rdoEnvironment adicionales para que contengan las transacciones concurrentes.

Nota Puede usar consultas de acciones SQL que contengan instrucciones de transacciones. Por ejemplo, con Microsoft SQL Server puede usar instrucciones de SQL como BEGIN TRANSACTION, COMMIT TRANSACTION o ROLLBACK TRANSACTION. Esta técnica admite transacciones anidadas que pueden no estar admitidas por el controlador ODBC.

Si cierra un objeto rdoEnvironment sin guardar o deshacer las transacciones pendientes, éstas se deshacen automáticamente.

Si utiliza el método CommitTrans o RollbackTrans sin usar primero el método BeginTrans, no se produce ningún error.

Puede que algunas bases de datos no admitan transacciones, en cuyo caso la propiedad Transactions del objeto rdoConnection o del objeto rdoResultset es False. Para asegurarse de que la base de datos admite transacciones, compruebe el valor de la propiedad Transactions del objeto rdoConnection antes de usar el método BeginTrans. Si está utilizando un objeto rdoResultset basado en más de una base de datos, compruebe la propiedad Transactions del objeto rdoResultset. Si el objeto rdoConnection o rdoResultset no admite transacciones, se pasan por alto los métodos y no se produce ningún error.


Cancel (Método, datos remotos)

Cancela el procesamiento de una consulta que se ejecuta en modo asíncrono o cancela los resultados pendientes del objeto RDO especificado.

Sintaxis

objeto.Cancel

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

El método Cancel pide que el origen de datos remoto deje de funcionar en una consulta asíncrona pendiente o cancela los resultados pendientes. En algunos casos, quizá no sea posible cancelar una operación una vez que se haya iniciado y en otros casos puede ser posible cancelar la operación, pero puede que se hayan completado ya parte de sus pasos.

En aquellas situaciones en las que necesita crear un conjunto de resultados, pero no desea esperar hasta que el motor de la consulta complete la operación, puede usar la opción rdAsyncEnable con el método OpenResultset o Execute. Esta opción devuelve el control a la aplicación en cuanto se inicia la operación, pero antes de que la primera fila esté lista para su proceso. Esto permite ejecutar otro código mientras se ejecuta la consulta. Si necesita detener esta operación antes de que se complete, utilice el método Cancel contra el objeto que se está creando.

El método Cancel también se puede usar con un objeto rdoConnection cuando utiliza la opción rdAsyncEnable para solicitar una conexión asíncrona. En este caso el intento de conexión con el servidor remoto se abandona.

También puede usar el método Cancel frente a un objeto rdoResultset o rdoQuery síncrono para vaciar las filas restantes del conjunto de resultados y liberar recursos comprometidos con la consulta y el objeto rdoResultset.

Si emplea el método Cancel frente a objetos rdoResultset que tienen múltiples conjuntos de resultados pendientes, todos los conjuntos de resultados se vacían. Para cancelar simplemente el conjunto de resultados actual y empezar a procesar el siguiente, utilice el método MoreResults.

Nota La utilización del método Cancel frente a una consulta de acciones en ejecución tendría resultados imprevisibles. Si la consulta está realizando una operación que afecta a una serie de filas, algunas de ellas podrían quedar modificadas, mientras que otras no. Por ejemplo, si ejecuta una consulta de acciones que contiene una instrucción UPDATE de SQL y usa el método Cancel antes de que la operación se haya completado, se actualizará un número de filas indeterminado, dejando otras sin modificar. Si piensa usar el método Cancel para este tipo de consulta de acciones, es conveniente que emplee métodos de transacciones para deshacer o realizar operaciones parcialmente completadas.


CancelBatch (Método, datos remotos)

Cancela todos los cambios no realizados en el cursor local (usado en el modo por lotes)

Sintaxis

objeto.CancelBatch (SingleRow)

La sintaxis del método CancelBatch consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
SingleRow | Un valor de tipo Boolean que es True si se realiza la actualización sólo en la fila actual o False si la actualización se aplica a todas las filas del lote. El valor predeterminado es False.

Comentarios

El método CancelBatch cancela todos los cambios no realizados en el cursor local y recupera los datos anteriores al estado en que se recuperaron originalmente de la base de datos. Observe que este método no actualiza los datos volviendo a realizar la consulta como hace el método Refresh, sino que sólo descarga los cambios realizados en el cursor local que no se han enviado en la operación de actualización por lotes.

Cuando use el método CancelUpdate, sólo se desharán los cambios de la fila actual al estado anterior a la ejecución del último método Update.

Las actualizaciones por lotes se usan cada vez que abre una conexión mediante la biblioteca de cursores Client Batch (rdUseClientBatch). En este caso, cada vez que use los métodos Update o UpdateRow se actualizará el rdoResultset local, pero las tablas de la base de datos base no cambiarán. El método BatchUpdate se usa para actualizar las tablas base de la base de datos con cualquier información que haya cambiado desde que se creó el rdoResultset o se sincronizó con el comando BatchUpdate.

El método BatchUpdate actualiza la propiedad BatchCollisionRows para incluir un marcador para cada fila en la que ha fallado la actualización; entra en conflicto con filas existentes que tengan datos más concurrentes que el objeto rdoResultset como si existieran desde la primera lectura. La propiedad BatchCollisionCount indica cuántas colisiones se producen durante el proceso de actualización por lotes.


CancelUpdate (Método, datos remotos)

Cancela las actualizaciones pendientes de un objeto rdoResultset.

Sintaxis

objeto.CancelUpdate

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

El método CancelUpdate vacía el búfer de copia y cancela las actualizaciones pendientes de una operación Edit o AddNew. Por ejemplo, si un usuario invoca el método Edit o AddNew y todavía no ha invocado el método Update, CancelUpdate cancela las modificaciones realizadas tras invocar el método Edit o AddNew. La información del búfer de copia se pierde; es decir, los cambios realizados a la fila tras haber invocado el método Edit o AddNew se vacían.

Utilice la propiedad EditMode para determinar si queda alguna operación pendiente que se pueda cancelar.

Si el método CancelUpdate se utiliza antes que los métodos Edit o AddNew, o cuando la propiedad EditMode esté establecida a rdEditNone, el método se pasa por alto.

Nota Usar el método CancelUpdate tiene el mismo efecto que ir a otra fila sin usar el método Update, excepto que la fila actual no cambia y diversas propiedades, como BOF y EOF, no se actualizan.


Clear (Método, datos remotos)

Borra todos los miembros de la colección rdoErrors.

Sintaxis

objeto.Clear

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Utilice este método para quitar todos los objetos rdoError de la colección rdoErrors.

Normalmente no es necesario borrar los miembros de la colección rdoErrors ya que se vacía automáticamente cuando se desencadena el primer error tras iniciar una nueva operación. Emplee el método Clear cuando necesite vaciar manualmente la colección rdoErrors, por ejemplo si quiere borrar errores que ya se han procesado.


Close (Método, datos remotos)

Cierra un objeto de datos remotos abierto.

Sintaxis

objeto.Close

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Al cerrar un objeto abierto se quita de la colección de objetos semejantes, excepto para el objeto rdoConnection. Por ejemplo, si utiliza el método Close en un objeto rdoResultset, se quita de la colección rdoResultsets. Si embargo, si usa el método Close en el objeto rdoConnection, simplemente se cierra y descarta cualquier objeto subordinado (como objetos rdoResultset o rdoQuery) pero no lo quita de la colección rdoConnections.

Al cerrar el objeto rdoConnection también se libera su objeto primario rdoEnvironment. Cualquier intento de cerrar el entorno predeterminado rdoEnvironments(0) se pasa por alto. Al contrario que DAO, los miembros de una colección de RDO no se pueden quitar con el método Delete.

Si intenta cerrar un objeto rdoConnection mientras hay objetos rdoResultset abiertos, o si intenta cerrar un objeto rdoEnvironment mientras hay abiertos objetos rdoConnection pertenecientes a ese rdoEnvironment específico, dichos objetos rdoResultset se cierran y las actualizaciones o modificaciones pendientes se deshacen.

Si el objeto rdoConnection se define fuera del alcance del procedimiento y sale del procedimiento sin cerrarlo, el objeto rdoConnection permanece abierto hasta que se cierre explícitamente o hasta que el módulo en que se define quede fuera del alcance. Los objetos rdoResultset o rdoQuery que se abren contra el rdoConnection permanecen abiertos hasta que se cierran explícitamente. Una vez que se han cerrado todos los conjuntos de resultados en un objeto rdoConnection que ya no está en el alcance, se cierra el rdoConnection.

Si objeto ya está cerrado cuando utiliza Close, se desencadena un error interceptable.

Nota Si utiliza el método Close contra una consulta de acciones en ejecución podría tener resultados imprevisibles. Si la consulta está realizando una operación que afecta a varias filas, algunas de ellas podrían quedar modificadas mientras que otras no. Por ejemplo, si ejecuta una consulta de acciones que contiene una instrucción UPDATE de SQL y usa el método Close antes de que se complete la operación, se actualiza un número indeterminado de filas, dejando otras sin modificar. Si piensa usar el método Close contra este tipo de consulta de acciones, es conveniente que emplee métodos de transacciones para deshacer o realizar las operaciones parcialmente completadas.


ColumnSize (Método, datos remotos)

Devuelve el número de bytes en un objeto rdoColumn con un tipo de datos rdTypeLONGVARBINARY o rdTypeLONGVARCHAR.

Sintaxis

nombreVariable = objeto ! columna.ColumnSize( )

La sintaxis del método ColumnSize consta de las siguientes partes:

Parte | Descripción
nombreVariable | El nombre de una variable de tipo Long o Variant.
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset que contiene la colección rdoColumns.
columna | El nombre de un objeto rdoColumn cuya propiedad ChunkRequired está establecida a True.

Comentarios

Dependiendo del controlador usado, el método ColumnSize devuelve el tamaño de la columna de un objeto binario grande (BLOB) o -1 si el tamaño no está disponible. Si el tamaño de la columna BLOB no está disponible, todavía puede usar el método GetChunk para leer fragmentos de datos de su columna BLOB. El último bloque extraído cuando el valor devuelto por GetChunk es menor que el tamaño solicitado (para datos binarios) es al menos dos bytes menos que su búfer (para datos de caracteres) o se devuelve un valor NULL.

Cuando se trabaja con tipos de datos que abarcan múltiples páginas de la base de datos, debe usar los métodos chunk para administrarlos, pero no es una necesidad absoluta. Además, debe usar los métodos GetChunk y AppendChunk para administrar los datos de tipo chunk cuando la propiedad ChunkRequired es True. Tenga en cuenta que si el tamaño de las columnas de datos BLOB es menor que BindThreshold, no es necesario usar métodos de tipo chunk.

Utilice el método ColumnSize para determinar el tamaño de las columnas de datos de tipo chunk.

Puesto que el tamaño de una columna de datos de tipo chunk puede sobrepasar los 64 KB, debe asignar el valor devuelto por el método GetChunk a una variable lo suficientemente grande como para almacenar los datos devueltos según el tamaño devuelto por el método ColumnSize.

Nota Para determinar el tamaño de un objeto rdoColumn que no es de tipo chunk se utiliza la propiedad Size.


CreatePreparedStatement (Método, datos remotos)

Crea un nuevo objeto rdoPreparedStatement.

Sintaxis

Set instrucciónPrep = conexión.CreatePreparedStatement(nombre, cadenaSql)

La sintaxis del método CreatePreparedStatement consta de las siguientes partes:

Parte | Descripción
instrucciónPrep | Una expresión de objeto que da como resultado el objeto rdoPreparedStatement que desea crear.
conexión | Una expresión de objeto que representa el objeto rdoConnection abierto.
nombre | Una cadena de tipo String que es el nombre del nuevo rdoPreparedStatement. Esta parte es obligatoria, pero puede ser una cadena vacía ("").
cadenaSql | Una expresión de tipo Variant (una instrucción SQL válida) que define el rdoPreparedStatement. Esta parte es obligatoria, pero puede proporcionar una cadena vacía; si lo hace, debe definir rdoPreparedStatement estableciendo su propiedad SQL antes de ejecutar el nuevo rdoPreparedStatement.

Comentarios

Nota La compatibilidad con el objeto rdoPreparedStatement se suministra en esta versión de Visual Basic por compatibilidad con versiones anteriores. El objeto rdoQuery se debe usar como sustituto directo para este objeto. Por este motivo, también se recomienda dejar de usar el método CreatePreparedStatement en favor del método CreateQuery.


CreateQuery (Método, datos remotos)

Crea un nuevo objeto de consulta y lo agrega a la colección rdoQueries.

Sintaxis

objeto.CreateQuery nombre, cadenaSQL

La sintaxis del método CreateQuery consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto rdoConnection
nombre | Requerido. Una expresión de cadena que da como resultado el nombre del nuevo objeto
cadenaSQL | Opcional. Una consulta SQL para la nueva instrucción preparada.

Comentarios

El método CreateQuery crea un nuevo objeto rdoQuery para esta conexión y lo agrega a la colección rdoQueries. También puede declarar objetos rdoQuery autónomos mediante la instrucción Dim de esta forma:

Dim miConsulta as New rdoQuery

Los objetos rdoQuery autónomos no se asocian con una conexión hasta que se establece la propiedad ActiveConnection.

El rdoQuery corresponde a la instrucción preparada ODBC que se usa para definir una consulta SQL reutilizable que puede contener parámetros. Puede ejecutar el rdoQuery el número de veces deseado y pasar parámetros que se sustituirán en la instrucción SQL antes de ejecutarse. Los parámetros se mantienen en la colección rdoParameters. Normalmente, si piensa ejecutar una consulta más de una vez en el código, es más eficiente usar objetos rdoQuery que usar los métodos Execute u OpenResultset en objetos que no sean rdoQuery.

El valor pasado al parámetro nombre puede usarse con el método Item para encontrar el nuevo objeto en su colección. Si no se proporciona nombre, se anexará rdoQuery a la colección rdoQueries y el rdoQuery podrá usarse haciendo referencia a la variable de consulta o al valor ordinal del objeto rdoQuery. Si el objeto especificado por el nombre es ya un miembro de la colección rdoQueries (incluyendo una cadena vacía), se produce un error interceptable. Todos los objetos rdoQuery son temporales; se eliminan cuando se cierra el objeto rdoConnection.

Para quitar un objeto rdoQuery de una colección rdoQueries, use el método Close en el rdoQuery.

El parámetro cadenaSQL es opcional, pero si no se proporciona, debe establecer la propiedad SQL del objeto rdoQuery resultante antes de ejecutarlo.

Use el método Execute para ejecutar una instrucción SQL en un objeto rdoQuery que no devuelva filas (una consulta de acciones). Use el método OpenResultset para ejecutar un rdoQuery que devuelva filas.

Si hay un rdoResultset sin llenar pendiente de un origen de datos que sólo permite una única operación con un objeto rdoConnection, no podrá crear objetos rdoQuery o rdoResultset adicionales ni podrá usar el método Refresh en el objeto rdoTable hasta que rdoResultset se vacíe, se cierre o se llene completamente. Por ejemplo, cuando se usa SQL Server 4.2 como origen de datos, no puede crear un objeto rdoResultset adicional hasta que se mueva a la última fila del objeto rdoResultset actual. Para llenar el conjunto de resultados, use el método MoreResults para moverse a través de todos los conjuntos de resultados pendientes, o use el método Cancel o Close en el rdoResultset para vaciar todos los conjuntos de resultados pendientes.


Delete (Método, datos remotos)

Elimina la fila actual de un objeto rdoResultset actualizable.

Sintaxis

objeto.Delete

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Delete elimina la fila actual y la hace inaccesible. La fila eliminada se quita del cursor rdoResultset y de la base de datos. Cuando elimina filas de un rdoResultset, debe existir una fila actual en el rdoResultset antes de usar Delete; de lo contrario, se desencadena un error interceptable.

Una vez que elimina una fila de un rdoResultset, debe volver a situar el puntero de fila actual en otra fila del rdoResultset antes de llevar a cabo una operación que tenga acceso a la fila actual. Aunque no es posible modificar o usar la fila eliminada, sigue siendo la actual hasta que cambie la posición a otra fila. Sin embargo, una vez que se desplaza a otra fila no es posible volver a convertir en actual la fila eliminada.

Cuando se sitúa en una fila de su rdoResultset que otro usuario ha eliminado o si elimina una fila común en otro rdoResultset, se produce un error interceptable que indica que la fila se ha eliminado. En este punto, la fila actual no es válida y debe cambiar la posición a otra fila válida. Por ejemplo, si usa un marcador para situarse en una fila eliminada, se produce un error interceptable.

Es posible deshacer la eliminación de una fila si emplea transacciones y el método RollbackTrans, suponiendo que usa BeginTrans antes que el método Delete.

La utilización de Delete produce un error en cualquiera de las condiciones siguientes:

  • No hay ninguna fila actual.

  • La conexión o el rdoResultset es de sólo lectura.

  • Ninguna columna de la fila es actualizable.

  • La fila ya se ha eliminado.

  • Otro usuario ha bloqueado la página de datos que contiene la fila.

  • El usuario no tiene permiso para realizar la operación.


Edit (Método, datos remotos)

Permite cambios en los valores de los datos de la fila actual o en un objeto rdoResultset actualizable.

Sintaxis

objeto.Edit

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Antes de usar el método Edit, las columnas de datos de un rdoResultset son de sólo lectura. Si ejecuta el método Edit, las filas actuales se copian desde un objeto rdoResultset actualizable al búfer de copia para realizar las modificaciones posteriores. Los cambios realizados en las columnas de la fila actual se copian al búfer de copia. Después de realizar las modificaciones deseadas a la fila, use el método Update para guardar los cambios o el método CancelUpdate para descartarlos. La fila actual sigue siendo actual después de usar Edit.

Precaución Si modifica una fila y después realiza cualquier operación que cambie la posición del puntero de fila actual a otra fila sin haber utilizado primero el método Update, los cambios realizados a la fila modificada se pierden sin avisar. Además, si cierra el objeto o finaliza el procedimiento que declara el conjunto de resultados o el objeto rdoConnection primario, la fila modificada se perdería sin avisar.

No puede usar el método Edit si la propiedad EditMode del objeto rdoResultset indica que se está realizando una operación Edit o AddNew.

Cuando la propiedad LockEdits del objeto rdoResultset es True (bloqueo pesimista), todas las filas del conjunto de filas del objeto rdoResultset se bloquean en cuanto se abre el cursor y permanece bloqueado hasta que el cursor se cierra. El número de filas del conjunto está determinado por la propiedad RowsetSize. Como muchos orígenes de datos remotos usan sistemas de bloqueo de páginas, el bloqueo pesimista también bloquea todas las páginas de datos de las tablas que contengan una fila extraída por rdoResultset.

Si la propiedad LockEdits es False (bloqueo optimista), la fila o la página de datos individual que contiene la fila se bloquea y se compara la nueva fila con la fila pre-modificada justo antes de actualizarla en la base de datos. Si la fila ha cambiado desde que utilizó el método Edit, la operación Update fallará con un error interceptable.

Nota No todos los orígenes de datos usan esquemas de bloqueo de páginas para administrar la concurrencia de datos. En algunos casos, los datos se bloquean fila a fila, por lo que los bloqueos sólo afectan al conjunto de filas específico que se está modificando.

La utilización de Edit produce un error en cualquiera de las condiciones siguientes:

  • No hay ninguna fila actual.

  • La conexión o el rdoResultset es de sólo lectura.

  • Ninguna columna de la fila es actualizable.

  • La propiedad EditMode indica que ya se está efectuando un AddNew o Edit.

  • Otro usuario ha bloqueado la fila o la página de datos que contiene la fila y la propiedad LockEdits es True.


EstablishConnection (Método, datos remotos)

Establece una conexión física con un servidor ODBC.

Sintaxis

objeto.EstablishConnection líneaComandos, sóloLectura, opciones

La sintaxis del método EstablishConnection consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto rdoConnection.
líneaComandos | Opcional. Un valor de tipo Integer que indica si ODBC pregunta por sus características (vea el método OpenConnection del objeto rdoEnvironment).
sóloLectura | Opcional. Un valor de tipo Boolean que es True si quiere conectarse como sólo lectura.
opciones | Opcional. Un valor de tipo Integer que indica las opciones de conexión. Este parámetro tiene las mismas reglas, restricciones y valores posibles que el método OpenConnection del objeto rdoEnvironment.

Comentarios

Este método hace que el objeto rdoConnection se conecte físicamente al servidor, si no lo está ya. Este método se usa cuando se crean objetos rdoConnection autónomos o cuando se vuelven a conectar objetos rdoConnection que se han desconectado mediante el método Close.

A diferencia del método OpenConnection, el método EstablishConnection no anexa automáticamente el objeto rdoConnection a la colección rdoConnections. Si desea agregar la nueva conexión establecida a la colección rdoConnections, debe usar el método Add. Puede usar el método Remove para quitar un miembro de la colección rdoConnections.

Cuando utilice la biblioteca de cursores Client Batch, el método EstablishConnection puede usarse para establecer una conexión una vez que el ActiveConnection de un objeto rdoResultset o rdoQuery se haya establecido a Nothing.

Al igual que el método OpenConnection, el argumento líneaComandos indica cómo el Administrador de controladores ODBC pide al usuario los argumentos necesarios que faltan para establecer la conexión. También puede solicitar que la conexión se realice de forma asíncrona mediante la opción rdAsyncEnable.

En general debe establecer la propiedad Connect y otras propiedades adecuadas del objeto rdoConnection antes de realizar un intento de conexión al servidor remoto.

Vea el método OpenConnection para obtener más detalles de cómo deben establecerse las propiedades de rdoConnection antes de intentar usar el método EstablishConnection.


Execute (Método, datos remotos)

Ejecuta una consulta de acciones o una instrucción SQL que no devuelve filas.

Sintaxis

conexión.Execute origen[, opciones]

consulta.Execute [opciones]

La sintaxis del método Execute constas de las siguientes partes:

Parte | Descripción
conexión | Una expresión de objeto que da como resultado un objeto rdoConnection sobre el que se ejecutará la consulta.
consulta | Una expresión de objeto que da como resultado un objeto rdoQuery cuyo valor de propiedad SQL especifica la instrucción SQL que se va a ejecutar.
origen | Una expresión de cadena que contiene la consulta de acciones que se va a ejecutar o el nombre de un rdoQuery.
opciones | Una Variant o una constante que determina cómo se ejecuta la consulta, como se especifica en Valores.

Valores

Los valores admitidos para el argumento opciones son:

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecuta la operación de forma asíncrona.
rdExecDirect | 64 | (Predeterminado) Evita la creación de un procedimiento almacenado para ejecutar la consulta. Usa SQLExecDirect en lugar de SQLPrepare y SQLExecute.

Comentarios

Es recomendable usar el método Execute sólo para consultas de acciones. Como una consulta de acciones no devuelve ninguna fila, Execute no devuelve un rdoResultset. Puede usar el método Execute en consultas que ejecutan múltiples instrucciones, pero ninguna de ellas podría devolver filas. Para ejecutar consultas con múltiples conjuntos de resultados que sean una combinación de consultas de acciones y consultas SELECT, utilice el método OpenResultset.

Utilice la propiedad RowsAffected del objeto rdoConnection o rdoQuery para determinar el número de filas afectadas por el método Execute más reciente. RowsAffected contiene el número de filas eliminadas, actualizadas o insertadas cuando se ejecuta una consulta de acciones. Si usa el método Execute para ejecutar un rdoQuery, la propiedad RowsAffected del objeto rdoQuery se establece al número de filas afectadas.

Opciones

Para ejecutar la consulta de forma asíncrona, use la opción rdAsyncEnable (establecida de forma predeterminada). En tal caso, el procesador de consultas del origen de datos comienza inmediatamente a procesar la consulta y vuelve a la aplicación antes de que se haya completado la consulta. Utilice la propiedad StillExecuting para determinar cuándo está listo el procesador de consultas para devolver el resultado de la consulta. Use el método Cancel para finalizar el procesamiento de una consulta asíncrona.

Para evitar la creación de un procedimiento almacenado temporal para ejecutar la consulta, use la opción rdExecDirect. Esta opción es necesaria cuando la consulta contiene referencias a transacciones o tablas temporales que sólo existen en el contexto de una única operación. Por ejemplo, si incluye una instrucción Begin Transaction de TSQL en su consulta o una referencia a una tabla temporal, debe usar rdExecDirect para asegurar que el motor remoto no se confunde cuando estos objetos estén pendientes al final de la consulta.

Aunque es posible ejecutar procedimientos almacenados mediante el método Execute, no es recomendable ya que el valor devuelto y los parámetros de salida del procedimiento se desechan y éste no puede devolver filas. Use el método OpenResultset con un rdoQuery para ejecutar procedimientos almacenados.

Nota Cuando ejecute procedimientos almacenados que no necesiten parámetros, no incluya los paréntesis en la instrucción SQL. Por ejemplo, para ejecutar el procedimiento "MiP" use la sintaxis: {Call MiP }.

También una llamada como:

   rCn.Execute SqlStatement, rdAsyncEnable +
   rdExecDirect

sólo permite una petición pendiente y permite que el código de Visual Basic se superponga con proceso de SQL Server, pero no permite múltiples peticiones de SQL Server.


GetChunk (Método, datos remotos)

Devuelve todo o parte del contenido de un objeto rdoColumn con un tipo de datos rdTypeLONGVARBINARY o rdTypeLONGVARCHAR.

Sintaxis

nombreVariable = objeto ! columna.GetChunk(númeroBytes)

La sintaxis del método GetChunk consta de las siguientes partes:

Parte | Descripción
nombreVariable | El nombre de una Variant que recibe los datos del objeto rdoColumn indicado por columna.
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset que contiene la colección rdoColumns.
columna | Una expresión de objeto que da como resultado un objeto rdoColumn cuya propiedad ChunkRequired es True.
númeroBytes | Una expresión numérica que es el número de bytes que se desea devolver.

Comentarios

Las columnas de datos de tipo chunk están diseñadas para almacenar valores binarios o de texto cuyo tamaño puede variar desde unos pocos caracteres hasta más de 1,2 GB y se almacenan en la base de datos en páginas de datos sucesivas. En la mayoría de los casos, los datos de tipo chunk no se pueden administrar en una única operación, por lo que debe usar los métodos de tipo chunk para guardar y escribir los datos. Si la propiedad ChunkRequired es True para una columna, debe emplear los métodos GetChunk y AppendChunk para manipular los datos de la columna. La propiedad BindThreshold determina el mayor bloque de tamaño que se enlaza automáticamente y evita la necesidad de usar métodos chunk.

Si la propiedad ChunkRequired para una columna es True, debe usar el método GetChunk para recuperar los datos. El método GetChunk mueve una parte de los datos de una columna de datos de tipo chunk a una variable. El número total de bytes de la columna se determina mediante la ejecución del método ColumnSize.

El método GetChunk se usa repetidamente, copiando los datos de una columna a una variable, un segmento o tipo de dato chunk cada vez. El tamaño del dato de tipo chunk se establece mediante númeroBytes. El punto de inicio de la operación de copia es inicialmente 0, lo que hace que los datos se copien desde el primer byte de la columna que se está leyendo. Las llamadas posteriores a GetChunk obtienen los datos desde la primera posición después del bloque previamente leído.

El número de bytes devueltos por GetChunk se asigna a nombrevar. Debido a los requisitos de memoria de los datos devueltos y el almacenamiento temporal, númeroBytes podría estar limitado. En sistemas de 32 bits, esta limitación está por encima de 1,2 GB, o por la memoria y la capacidad del disco del sistema de memoria virtual.

Si númeroBytes es mayor que el número de bytes de la columna, se devuelve el número real de bytes de la columna. Tras asignar el resultado de GetChunk a una variable de tipo Variant, puede usar la función Len para determinar el número de bytes devueltos.

Use el método AppendChunk para escribir bloques sucesivos de datos en la columna y GetChunk para extraer los datos de la columna. Algunas operaciones (como la de copia) conllevan cadenas temporales. Si el espacio para las cadenas es limitado, puede que sea necesario trabajar con segmentos menores de una columna de datos de tipo chunk en vez de trabajar con toda la columna.

Utilice la propiedad BindThreshold para especificar el tamaño máximo de columna que se enlazará automáticamente.

Nota Como el tamaño de la columna de datos de tipo chunk puede ser mayor que 1,2 GB, debe asignar el valor devuelto por el método GetChunk a una variable lo suficientemente grande como para almacenar los datos devueltos, basándose en el tamaño devuelto por el método ColumnSize.


GetClipString (Método)

El método GetClipString devuelve una cadena delimitada por 'n' filas en un conjunto de resultados.

Sintaxis

CadenaResultado = objeto.GetClipString (númFilas, [delimitadorColumna],[delimitadorFila], exprNula])

La sintaxis del método GetClipString consta de las siguientes partes:

Parte | Descripción
CadenaResultado | Una variable usada para hacer referencia al conjunto de resultados completo como una cadena delimitada.
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset.
númFilas | Requerido: un valor de tipo Long. Es el número de filas que se van a copiar a la cadena.
delimitadorColumna | Opcional: una expresión de tipo Variant(String) usada para separar columnas de datos como se describe en Valores. El valor predeterminado es Tab (VbTab).
delimitadorFila | Opcional: una expresión de tipo Variant(String) usada para separar filas de datos como se describe en Valores. El valor predeterminado es el retorno de carro (VbCr).
exprNula | Opcional: una expresión de tipo Variant(String) usada cuando se encuentran valores NULL como se describe en Valores. El valor predeterminado es una cadena vacía.

Valores

Los delimitadores de fila y columna pueden ser de cualquier longitud, pero generalmente son de uno o dos bytes de longitud. Normalmente los delimitadores CadenaResultado están determinados por la propiedad Clip del objeto de destino. Por ejemplo, si la cadena se aplica a un control Grid, las columnas se separan por tabuladores y las filas por retornos de carro (los valores predeterminados).

exprNula se usa para sustituir un valor apropiado en lugar de los valores NULL devueltos por la consulta. Normalmente, se usa una cadena vacía o "<null>".

Comentarios

El método GetClipString devuelve una cadena delimitada por 'n' filas en un conjunto de resultados basado en el argumento númFilas. Si se piden más filas de las disponibles, sólo se devolverán las filas disponibles. Use la propiedad RowCount para determinar cuántas filas se extraen realmente. El número de filas que se pueden extraer está restringido por la memoria disponible y debe elegir lo más conveniente para su aplicación. No utilice GetClipString para obtener en la memoria la tabla o el conjunto de resultados entero si es una tabla larga.

Normalmente, GetClipString funciona de forma parecida a GetRows excepto en que el dato devuelto es una cadena en lugar de una matriz Variant de dos dimensiones. GetClipString puede usarse para llenar un control de cuadrícula o cualquier otro control que tenga la propiedad Clip. También se puede usar para dar formato a datos exportados desde un conjunto de resultados a un archivo secuencial.

Después de llamar a GetClipString, la fila actual se sitúa en la siguiente línea no leída. Es decir, GetClipString equivale a usar el método Move (filas).

Si está intentando extraer todas las filas mediante múltiples llamadas a GetClipString, use la propiedad EOF para determinar si hay filas disponibles. GetClipString devuelve menos que el número solicitado al final del rdoResultset o si no puede buscar una fila en el intervalo solicitado. Por ejemplo, si no se puede recuperar la quinta fila de un grupo de 10 filas que está intentado extraer, GetClipString devuelve cuatro filas y deja un símbolo de moneda en la fila que ha causado el problema. No generará un error en tiempo de ejecución.

El parámetro opcional delimitadorColumna puede usarse para sustituir un delimitador de columna diferente del carácter de tabulación (Chr$(9)) predeterminado y el parámetro opcional delimitadorFila puede usarse para sustituir un delimitador de fila diferente. Esto es útil cuando trabaja con controles que acepten un formato de recorte, pero que requieren diferentes caracteres para los delimitadores de fila y columna (algunas cuadrículas necesitan los caracteres de retorno de carro y avance de línea para un delimitador de fila).


Ejemplo de GetClipString (Datos remotos)

El siguiente ejemplo crea una cadena de recorte de un conjunto de resultados que contiene un conjunto de filas seleccionado de la tabla Publishers y llena un control Grid con la cadena aplicándolo a la propiedad Clip.

Dim rs As rdoResultset
Set rs = MyConnection.OpenResultset( _
"Select * from Publishers Where State = 'WA'", _
   rdOpenNone)
MyGrid.Rows = rs.RowCount
MyGrid.Cols = rs.rdoColumns.Count
MyGrid.SelStartRow = 1
MyGrid.SelEndRow = MyGrid.Rows
MyGrid.SelStartCol = 0
MyGrid.SelEndCol = MyGrid.Cols - 1
MyGrid.Clip = rs.GetClipString(rs.RowCount)


GetRows (Método, datos remotos)

Recupera múltiples filas de un rdoResultset y las introduce en una matriz.

Sintaxis

matriz = objeto.GetRows (filas)

La sintaxis del método GetRows consta de las siguientes partes:

Parte | Descripción
matriz | El nombre de una variable de tipo Variant para almacenar los datos devueltos.
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
filas | Un valor de tipo Long que indica el número de filas que se van a recuperar.

Comentarios

Utilice el método GetRows para copiar una o más filas completas desde un rdoResultset a una matriz de dos dimensiones. El primer subíndice de la matriz identifica la columna y el segundo identifica el número de fila, de esta forma:

avarRows(intColumn)(intRow)

Para obtener el valor de la primera columna de la segunda fila devuelta, use lo siguiente:

col1 = avarRows(0,1)

Para obtener el valor de la segunda columna de la primera fila devuelta, use lo siguiente:

col2 = avarRows(1,0)

Si se piden más filas de las disponibles, sólo se devuelven las filas disponibles. Utilice Ubound para determinar cuántas filas se han encontrado realmente, puesto que el tamaño de la matriz se ajusta al número de filas devuelto. Por ejemplo, si devuelve el resultado a una variable de tipo Variant llamada varA, podría determinar cuántas filas se devolvieron realmente mediante:

numReturned = Ubound(varA,2) + 1

"+ 1" se usa porque el primer dato devuelto es el elemento número 0 de la matriz. El número de filas que se pueden encontrar está restringido por la memoria disponible y se debe elegir para adaptarse a la aplicación; no utilice GetRows para traer toda la tabla o el conjunto de resultados a una matriz si son grandes.

GetRows no devuelve datos de columnas cuya propiedad ChunkRequired es True; en su lugar se devuelve en esas columnas un valor de tipo Variant que contiene código del servidor ODBC.

Después de una llamada a GetRows, la fila actual se sitúa en la siguiente fila no leída. Es decir, GetRows es equivalente a usar el método Move (filas).

Si está intentando recuperar todas las filas mediante múltiples llamadas a GetRows, use la propiedad EOF para determinar si hay más filas disponibles. GetRows devuelve menos filas de las solicitadas si se ha alcanzado el final del rdoResultset o si no puede obtener una fila del intervalo solicitado. Por ejemplo, si no se puede recuperar la quinta fila en un grupo de diez, GetRows devuelve cuatro filas y deja activa la fila que causó el problema. No produce ningún error en tiempo de ejecución.

El método GetRows obtiene datos de los búferes ODBC basados en la propiedad RowsetSize. RDO realiza la captura desde la fila actual hacia el final del conjunto de resultados, devolviendo tantas filas como se soliciten. Cuando el conjunto de filas actual se ha agotado, RDO emite otra llamada a la función SQLExtendedFetch para obtener de la base de datos otros conjunto de filas. Esta técnica se aplica a todos los tipos de cursores.


MoreResults (Método, datos remotos)

Borra las filas pendiente existentes en el conjunto de resultados actual y devuelve un valor Boolean que indica si hay más conjuntos de resultados pendientes.

Sintaxis

variable = objeto.MoreResults

La sintaxis del método MoreResults consta de las siguientes partes:

Parte | Descripción
variable | Una variable de tipo Boolean que indica si se han encontrado conjuntos de resultados adicionales, como se describe en Valores devueltos.
objeto | Una expresión de objeto que da como resultado una variable objeto rdoResultset abierta.

Valores devueltos

Los valores devueltos admitidos para variable son:

Valor | Descripción
True | Hay conjuntos de resultados adicionales listos para su proceso.
False | Todos los conjuntos de resultados del rdoResultset se han procesado.

Comentarios

Si llama a este método se vaciará el conjunto de resultados actual; llame a la función de la API de ODBC SQLMoreResults para ver si hay otro conjunto de resultados en la misma instrucción y, si lo hay, carga el nuevo conjunto de resultados, sitúa el puntero de la fila actual en la primera fila y devuelve True. Si no hay más conjuntos de resultados, este método devolverá False, y las dos propiedades EOF y BOF serán True.

Si el conjunto de resultados se creó de forma asíncrona (el programador usó rdAsyncEnable en el parámetro opciones), el método MoreResults se ejecutará también de forma asíncrona. Debe usar la propiedad StillExecuting para determinar cuándo se ha completado el conjunto de resultados siguiente. La ejecución asíncrona del método MoreResults sigue las mismas reglas que para abrir de forma asíncrona un conjunto de resultados.

Cuando la consulta usada para crear un rdoResultset devuelve más de un conjunto de resultados, utilice el método MoreResults para terminar de procesar el conjunto de resultados actual y comprobar si quedan más conjuntos de resultados. Si no hay más conjuntos de resultados para procesar, el método MoreResults devuelve False tras lo cual BOF y EOF se establecen a True. En cualquier caso, mediante el método MoreResults se vacía el rdoResultset actual.

También puede usar el método Cancel para vaciar el contenido de un rdoResultset. Sin embargo, Cancel vacía también los conjuntos de resultados adicionales que todavía no se han procesado.

No todas las bibliotecas de cursores son compatibles con consultas de conjuntos de resultados múltiples. Por ejemplo, la biblioteca de cursores del servidor no es compatible con este tipo de consultas si no desactiva el procesamiento del cursor en un cursor de sólo lectura sólo hacia adelante con la propiedad RowsetSize a 1.


Move (Método, datos remotos)

Cambia la posición de la fila actual en un objeto rdoResultset.

Sintaxis

objeto.Move filas[, inicio]

La sintaxis del método Move consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
filas | Un valor de tipo Long con signo que especifica el número de filas que se desplazará la posición, como se describe en Valores.
inicio | Un valor de tipo Variant que identifica un marcador según se describe en Valores.

Valores

Si filas es mayor que 0, la posición se desplaza hacia adelante (hacia el final del cursor). Si filas es menor que 0, la posición se desplaza hacia atrás (hacia el principio del cursor). Si filas es igual a 0, se descartan las modificaciones pendientes y se actualiza la fila actual con el origen de datos. En un nivel inferior, cuando usa 0 como argumento filas, RDO ejecuta la función SQLExtendedFetch de ODBC para volver a obtener el conjunto de filas actual (como determina la propiedad RowsetSize) de la base de datos.

Si se especifica inicio, el desplazamiento comienza en relación con este marcador. Si inicio no se especifica, Move comienza desde la fila actual.

Comentarios

Si mediante Move cambia la posición de la fila actual a una posición anterior a la primera fila, se desplaza a la posición de principio del archivo (BOF). Si el objeto rdoResultset no contiene filas y su propiedad BOF es True, al emplear este método para desplazarse hacia atrás se produce un error interceptable en tiempo de ejecución. Si la propiedad BOF o EOF es True e intenta usar el método Move sin un marcador válido, se producirá un error interceptable.

Si mediante Move se cambia la posición de la fila actual a una posición posterior a la última fila, la posición se desplaza al final del archivo (EOF). Si el objeto rdoResultset no contiene filas y su propiedad EOF es True, se producirá un error interceptable en tiempo de ejecución al usar este método para desplazarse hacia adelante.

Si usa Move en un objeto rdoResultset basado en una consulta específica de SQL o en rdoQuery, se obliga a completar la consulta y el objeto rdoResultset se llena completamente.

Si utiliza un método que cambie la posición del puntero de fila actual después de usar el método Edit o AddNew y antes de usar el método Update, se perderán las modificaciones realizadas en el búfer de copia.

Para transformar en la fila actual la primera, última, siguiente o anterior fila de un rdoResultset, utilice los métodos MoveFirst, MoveLast, MoveNext o MovePrevious. Para situar el puntero de fila actual basándose en un número de fila absoluto, use la propiedad AbsolutePosition. Para situar el puntero de fila actual basándose en un porcentaje de las filas a las que se ha tenido acceso de un conjunto de resultados, utilice la propiedad PercentPosition.

Cuando usa Move o cualquier otro método para cambiar la posición del puntero de la fila actual se activa el evento RowCurrencyChange.

Al usar un rdoResultset de sólo hacia adelante puede volver a situar la fila actual sólo mediante el método MoveNext. No puede usar los métodos MoveLast, MovePrevious, MoveFirst o Move, o las propiedades PercentPosition o AbsolutePosition para volver a situar el puntero de la fila actual.


MoveFirst, MoveLast, MoveNext y MovePrevious (Métodos, datos remotos)

Cambia la posición del puntero de fila actual a la primera, última, siguiente o anterior fila de un objeto rdoResultset específico y la convierte en la actual.

La sintaxis para este método consta de las siguientes partes:

objeto.{MoveFirst | MoveNext | MovePrevious}

objeto. MoveLast ([opciones as Variant])

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto rdoResultset.
opciones | Un tipo Variant o una constante que determina cómo se realiza la operación, como se especifica en Valores.

Valores

El valor admitido para el argumento opciones es:

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecuta una operación de forma asíncrona.

Comentarios

Utilice los métodos Move para cambiar el puntero de fila actual a otra fila sin aplicar ninguna condición.

Si especifica la opción rdAsyncEnable con el método MoveLast, la operación de movimiento se ejecuta de forma asíncrona. Es decir, el control vuelve a su aplicación inmediatamente, a menudo antes de que se haya completado la operación. Esto evita el bloqueo de su aplicación hasta que se complete la operación. Para comprobar el fin de la operación, puede esperar los eventos QueryComplete o RowCurrencyChange, o comprobar periódicamente la propiedad StillExecuting, que devuelve False cuando la operación de movimiento se ha completado.

Precaución Si modifica la fila actual, asegúrese de guardar los cambios mediante el método Update antes de desplazarse a otra fila. Si se desplaza a otra fila sin actualizar, se pierden sin avisar las modificaciones realizadas.

Cuando abre el conjunto de resultados indicado por objeto, la primera fila es la actual y la propiedad BOF se establece a False. Si el conjunto de resultados no contiene filas, la propiedad BOF se establece a True y no hay ninguna fila actual.

Si la primera o la última fila ya es la actual cuando se usa el método MoveFirst o MoveLast, la fila actual no cambia.

Si usa MovePrevious cuando la primera fila es la actual, la propiedad BOF se establece a True y no hay ninguna fila actual. Si usa MovePrevious otra vez, se producirá un error; BOF seguirá siendo True.

Si usa MoveNext cuando la última fila es la actual, la propiedad EOF se establece a True y no hay ninguna fila actual. Si usa MoveNext otra vez, se producirá un error; EOF seguirá siendo True.

Si usa MoveLast en un objeto rdoResultset basado en una consulta específica de SQL o en rdoQuery, se obliga a completar la consulta y el objeto rdoResultset se llena completamente.

Si utiliza un método que cambia la posición del puntero de fila actual después de usar el método Edit o AddNew y antes de usar el método Update, se pierden las modificaciones realizadas en el búfer de copia.

Para desplazar la posición de la fila actual en un objeto rdoResultset un número determinado de filas hacia adelante o hacia atrás, utilice el método Move.

Para situar el puntero de fila actual basándose en un número de fila absoluto, use la propiedad AbsolutePosition. Para situar el puntero de fila actual basándose en un porcentaje de las filas a las que se ha tenido acceso de un conjunto de resultados, utilice la propiedad PercentPosition.

Al usar el método Move o cualquier otro método que cambie el puntero de la fila actual se activa el evento RowCurrencyChange.

Cuando utiliza un rdoResultset de tipo forward-only puede volver a situar la fila actual usando sólo el método MoveNext. No puede emplear los métodos MoveLast, MovePrevious, MoveFirst o Move, o las propiedades PercentPosition o AbsolutePosition, para volver a situar el puntero de fila actual. Si usa uno de los métodos Move prohibidos en un conjunto de resultados de tipo sólo hacia adelante, su código generará un error ODBC del tipo "Tipo de búsqueda fuera del intervalo".


OpenConnection (Método, datos remotos)

Abre una conexión con un origen de datos ODBC y devuelve una referencia al objeto rdoConnection que representa una base de datos específica.

Sintaxis

Set conexión = entorno.OpenConnection(dsNombre[, líneaComandos[, sóloLectura[, conectar[, opciones]]]])

La sintaxis del método OpenConnection consta de las siguientes partes:

Parte | Descripción
conexión | Una expresión de objeto que da como resultado un objeto rdoConnection que está abriendo.
entorno | Una expresión de objeto que da como resultado un objeto rdoEnvironment existente. Debe proporcionar un objeto rdoEnvironment.
dsNombre | Una expresión de cadena que es el nombre de un origen de datos ODBC registrado o una cadena de longitud cero (""), como se describe en Valores.
líneaComandos | Un tipo Variant o una constante que determina cómo se lleva a cabo la operación, como se describe en Valores.
sóloLectura | Un valor de tipo Boolean que es True si la conexión se abre para acceso de sólo lectura y False si la conexión se abre para lectura y escritura. Si omite este argumento, la conexión se abre para acceso de lectura y escritura.
conectar | Una expresión de cadena que se usa para pasar argumentos al Administrador de controladores ODBC para abrir la base de datos; es la cadena de conexión como se describe en Valores.
opciones | Un tipo Variant o una constante que determina cómo se lleva a cabo la operación, como se describe en Valores.

Valores

El argumento conectar constituye los argumentos de conexión ODBC y depende del controlador de ODBC. Vea la propiedad Connect para ver la sintaxis y sus valores más característicos. Si el argumento conectar es una cadena vacía (""), el nombre de usuario y su contraseña se toman de las propiedades UserName y Password del objeto rdoEnvironment, y debe proporcionarse un argumento dsNombre.

Si el dsNombre proporcionado no se refiere a un nombre de origen de datos ODBC válido y no aparece el parámetro Nombre de origen de datos (DSN) en el argumento conectar, se producirá un error si líneaComandos es rdDriverNoPrompt; de lo contrario, se pedirá al usuario que seleccione uno de una lista de nombres de orígenes de datos registrados. Si dsNombre es una cadena de longitud cero, la cadena de conexión debe indicar los nombres del controlador y del servidor.

Basándose en el valor de líneaComandos, el Administrador de controladores ODBC muestra un cuadro de diálogo que pregunta al usuario la información de conexión como el DSN, el nombre de usuario y la contraseña. Use una de las siguientes constantes que definen cómo debe preguntarle al usuario:

Constante de líneaComandos | Valor | Descripción
rdDriverPrompt | 0 | El Administrador de controladores ODBC muestra el cuadro de diálogo Orígenes de datos ODBC. La cadena de conexión usada para establecer la conexión se construye a partir del DSN seleccionado y la completa el usuario mediante los cuadros de diálogo o bien, si no se ha elegido DSN y la propiedad DataSourceName está vacía (en el caso del control RemoteData), se utiliza el DSN predeterminado.
rdDriverNoPrompt | 1 | El Administrador de controladores usa la cadena de conexión proporcionada por dsNombre y conectar. Si no se proporciona información suficiente, el método OpenConnection devuelve un error interceptable.
rdDriverComplete | 2 | (Predeterminado) Si la cadena de conexión proporcionada incluye la palabra clave DSN, el Administrador de controladores ODBC usa la cadena proporcionada en conectar. De lo contrario, se comportará igual que cuando se especifica rdDriverPrompt.
rdDriverComplete Required | 3 | Se comporta como rdDriverComplete excepto en que el controlador deshabilita los controles para cualquier información no necesaria para completar la conexión. Si los controles están deshabilitados, los usuarios no pueden seleccionar o especificar argumentos que falten.

Puede usar la siguiente constante en el argumento opciones:

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecuta la operación de forma asíncrona.

Comentarios

Cuando ejecuta con éxito el método OpenConnection, se crea una instancia del nuevo objeto rdoConnection y se agrega a la colección rdoConnections, estableciéndose una conexión de red con el servidor remoto. Si no puede establecerse la conexión, no se crea ningún objeto y se produce un error interceptable.

Nota RDO 2.0 se comporta de manera diferente que RDO 1.0 en cuanto al tratamiento de las referencias huérfanas a objetos rdoConnection. Cuando establece una variable ya asignada a un objeto rdoConnection con otro objeto rdoConnection mediante el método OpenConnection, se cierra el objeto existente rdoConnection y se quita de la colección rdoConnections. En RDO 1.0, el objeto existente permanecía abierto y seguía estando en la colección rdoConnections.

Si establece el argumento opciones a rdAsyncEnable, la operación de conexión se ejecuta de forma asíncrona. Es decir, el control vuelve a la aplicación antes de que se haya establecido la conexión para evitar que su aplicación se pueda bloquear mientras se realiza la conexión. Puede comprobar si se ha completado la conexión examinando la propiedad StillConnecting del objeto rdoConnection, que devuelve False cuando se ha completado la operación de conexión. También puede escribir código para un procedimiento de evento Connect que se active cuando se complete la operación de conexión. Si usa el método Cancel mientras está esperando que se establezca una conexión asíncrona, se abandonará el intento de conexión.

Antes de comenzar el proceso de establecer una conexión se activa el evento BeforeConnect. Este procedimiento de evento le permite examinar y modificar la cadena de conexión y los niveles de petición de datos según se necesiten.

Hay varias razones por las que quizá no se pueda realizar una conexión, entre las que se encuentran las siguientes:

  • Falta de un Id. de usuario y una contraseña apropiados.

  • Configuración incorrecta del controlador o de las opciones.

  • Falta de permisos correctos de red o servidor.

  • El servidor remoto no se encuentra en la red o no está operativo.

  • El servidor remoto no tiene recursos o conexiones suficientes para permitir la conexión de otro usuario.

Conexiones sin DSN

En algunos casos, puede que no sea necesario crear y registrar un Nombre de origen de datos (DSN) antes de intentar abrir una conexión con un origen de datos. Si su servidor remoto usa el protocolo LAN de canalizaciones con nombre y los valores OEMTOANSI predeterminados, sólo tiene que proporcionar en la cadena de conexión el nombre del servidor y el controlador de ODBC. Debe proporcionar una entrada DSN vacía o bien el parámetro dsNombre como último argumento. Si el Administrador de controladores ODBC encuentra una entrada DSN nula, intentará ubicarlo a menos que ya estén determinados los valores del controlador y el servidor. La cadena de conexión mostrada a continuación se usa para establecer una conexión sin DSN a un SQL Server llamado "BETAV486":

Connect = "UID=;PWD=;Database=WorkDB; " _
& "Server=BETAV486;Driver={SQL Server}" _
& "DSN='';"

Otras opciones de la cadena de conexión

Establecer un rdoConnection puede requerir que el usuario especificado por la propiedad UserName o el argumento UID de la cadena de conexión tenga permiso de acceso a la red, al servidor de origen de datos especificado y a la base de datos elegida en ese servidor. No cumplir estos requisitos puede dar como resultado un fallo en la conexión.

Si no especifica una base de datos mediante el parámetro DATABASE del argumento conectar o mediante la entrada del origen de datos, la base de datos abierta cuando establezca la conexión estará determinada por la base de datos predeterminada asignada al usuario por el administrador de la base de datos. En algunos casos puede cambiar la base de datos predeterminada mediante la ejecución de una consulta de acciones que contenga un comando SQL como es la instrucción Transact SQL USE baseDatos.

Nota La parte conectar del método OpenConnection se codifica de forma distinta que la parte origen del método OpenDatabase que se usa con DAO. La parte conectar no requiere ni admite el uso de la palabra clave "ODBC;" al principio de la cadena de conexión. Además, la parte conectar no admite el uso del argumento LOGINTIMEOUT; utilice en su lugar la propiedad LoginTimeout del objeto rdoEnvironment.

Utilice el método Close en el objeto para cerrar una base de datos asociada con un rdoConnection, quitar la conexión de la colección rdoConnections y desconectarla del origen de datos.

También puede declarar un nuevo objeto rdoConnection mediante la instrucción Dim de esta forma:

Dim miCn as New rdoConnection

Una vez creada una instancia de este modo, puede establecer las propiedades rdoConnection según se requieran y usar el método EstablishConnection para abrir la conexión.

Para obtener más información acerca de los controladores ODBC y los argumentos que requiere la cadena de conexión especificada, vea el archivo de Ayuda proporcionado con el controlador.


OpenResultset (Método, datos remotos)

Crea un nuevo objeto rdoResultset.

Sintaxis

Set variable = conexión.OpenResultset(nombre [,tipo [,tipoBloq [,opciones]]])

Set variable = objeto.OpenResultset([tipo [,tipoBloq [, opciones]]])

La sintaxis del método OpenResultset consta de las siguientes partes:

Parte | Descripción
variable | Una expresión de objeto que da como resultado un objeto rdoResultset.
conexión | Una expresión de objeto que da como resultado un objeto rdoConnection existente que desea usar para crear el nuevo rdoResultset.
objeto | Una expresión de objeto que da como resultado un objeto rdoQuery o rdoTable existente que desea usar para crear el nuevo rdoResultset.
nombre | Un valor de tipo String que especifica el origen de las filas para el nuevo rdoResultset. Este argumento puede especificar el nombre de un objeto rdoTable, el nombre de un objeto rdoQuery o una instrucción SQL que puede devolver filas.
tipo | Un valor de tipo Variant o una constante que especifica el tipo de cursor que se va a crear, como se indica en Valores.
tipoBloq | Un valor de tipo Variant o una constante que especifica el tipo de control de concurrencia. Si no especifica ningún tipoBloq, se asumirá que es rdConcurReadOnly.
opciones | Un valor de tipo Variant o una constante que especifica las características del nuevo rdoResultset.

Valores

  • nombre

    El argumento nombre se utiliza cuando se emplea el método OpenResultset en lugar del objeto rdoConnection y no se han predefinido consultas. En este caso, nombre suele contener una consulta SQL que devuelve filas. La consulta puede contener más de una instrucción SELECT o una combinación de consultas de acciones e instrucciones SELECT, pero no sólo consultas de acciones, ya que se produciría un error interceptable. Vea la propiedad SQL para obtener más detalles al respecto.

  • Cursor tipo

    Nota No todos los controladores de origen de datos ODBC admiten todos los tipos de cursores y concurrencias. Vea rdoResultset para obtener más información. Además, no todos los tipos de controladores de cursores permiten instrucciones SQL que devuelvan más de un conjunto de resultados. Por ejemplo, los cursores del lado del servidor no permiten consultas que contengan mas de una instrucción SELECT.

    El argumento tipo especifica el tipo de cursor usado para administrar el conjunto de resultados. Si no especifica ningún tipo, OpenResultset creará un rdoResultset de tipo forward-only. No todos los orígenes de datos o controladores ODBC pueden implementar todos los tipos de cursores. Si su controlador no puede implementar el tipo elegido, se generará un mensaje de advertencia y se situará en la colección rdoErrors. Use una de las siguientes constantes de tipos de conjunto de resultados que definen el tipo de cursor del nuevo objeto rdoResultset. Vea la propiedad CursorType para obtener más detalles acerca de los tipos de cursores.

    Constante | Valor | Descripción
    rdOpenForwardOnly | 0 | (Predeterminado) Abre un objeto rdoResultset de tipo forward-only.
    rdOpenKeyset | 1 | Abre un objeto rdoResultset de tipo keyset.
    rdOpenDynamic | 2 | Abre un objeto rdoResultset de tipo dinamic.
    rdOpenStatic | 3 | Abre un objeto rdoResultset de tipo estatic.

  • Concurrencia tipoBloq

    Para mantener un control adecuado de los datos que se van a actualizar, RDO proporciona varias opciones de concurrencia para controlar cómo se concede o niega acceso a los usuarios a los datos que se van a actualizar. En algunos casos, cuando bloquee una fila en particular mediante uno de los valores de tipoBloq, el motor remoto puede bloquear también la página completa que contiene la fila. Si hay demasiadas páginas bloqueadas, el servidor remoto puede también extender el bloqueo de la página a un bloqueo de tabla para mejorar el rendimiento global del sistema.

    No están permitidos todos los tipos de bloqueos en todos los orígenes de datos. Por ejemplo, en los servidores SQL Server y Oracle, los objetos rdoResultset de tipo static sólo admiten rdConcurValues o rdConcurReadOnly. Para obtener más información acerca de los tipos de concurrencia, vea la propiedad LockType.

    Constante | Valor | Descripción
    rdConcurReadOnly | 1 | (Predeterminado) Sólo lectura.
    RdConcurLock | 2 | Concurrencia pesimista.
    rdConcurRowVer | 3 | Concurrencia optimista basada en el Id. de fila.
    rdConcurValues | 4 | Concurrencia optimista basada en valores de filas.
    rdConcurBatch | 5 | Concurrencia optimista usando actualizaciones de modo por lotes. Valores Status devueltos por cada fila actualizada con éxito.

  • Otras opciones

    Si utiliza la opción rdAsyncEnable, el control vuelve a la aplicación en cuanto se inicia la consulta, pero antes de que esté disponible el conjunto de resultados. Para comprobar si la consulta se ha completado se utiliza la propiedad StillExecuting. El objeto rdoResultset no es válido hasta que StillExecuting devuelva False. También puede usar el evento QueryComplete para determinar cuándo está preparada para procesarse la consulta. Hasta que la propiedad StillExecuting no devuelva True, no podrá hacer referencia a ninguna otra propiedad del objeto rdoResultset no inicializado y sólo son válidos los métodos Cancel y Close.

    Si usa la opción rdExecDirect, RDO utiliza la función de la API ODBC SQLExecDirect para ejecutar la consulta. En este caso, no se crea un procedimiento almacenado temporal para ejecutar la consulta. Esta opción puede ahorrar tiempo si no espera ejecutar la consulta más que unas pocas veces durante la ejecución de la aplicación. Además, esta opción es obligatoria cuando trabaje con consultas que no se deben ejecutar como procedimientos almacenados sino que se ejecuten directamente. Por ejemplo, en consultas que crean tablas temporales para su uso en consultas subsiguientes debe usar la opción rdExecDirect.

    En el argumento opciones puede usar las siguientes constantes:

    Constante | Valor | Descripción
    rdAsyncEnable | 32 | Ejecuta la operación de forma asíncrona.
    rdExecDirect | 64 | (Predeterminado) Evita la creación de procedimientos almacenados para ejecutar la consulta. Usa SQLExecDirect en lugar de SQLPrepare y SQLExecute.

Comentarios

Si el método OpenResultset se ejecuta correctamente, RDO crea una instancia de un nuevo objeto rdoResultset y lo anexa a la colección rdoResultsets, aunque no se devuelvan filas en la consulta. Si la consulta no se puede compilar o ejecutar debido a un error de sintaxis, problemas de permisos u otro error, no se crea el rdoResultset y se produce un error interceptable. El tema dedicado a rdoResultset contiene información adicional sobre el comportamiento de rdoResultset y la administración de la colección rdoResultsets.

Nota RDO 2.0 se comporta de forma diferente que RDO 1.0 en cómo maneja las referencias huérfanas a objetos rdoResultset. Cuando establece una variable ya asignada a un objeto rdoResultset con otro objeto rdoResultset mediante el método OpenResultset, el objeto rdoResultset existente se cierra y se quita de la colección rdoResultsets. En RDO 1.0, el objeto existente permanecía abierto y seguía en la colección rdoResultsets.

Nota Antes de usar el nombre de una tabla base en el argumento nombre, debe usar primero el método Refresh en la colección rdoTables para llenarla. También puede llenar la colección rdoTables si hace referencia a uno de sus miembros mediante su número ordinal. Por ejemplo, si hace referencia a rdoTables(0) llenará la colección completa.

Ejecutar varias operaciones en una conexión

Si hay un rdoResultset sin llenar pendiente de un origen de datos que sólo permita una única operación con un objeto rdoConnection, no podrá crear objetos rdoQuery o rdoResultset adicionales mediante el método OpenResultset o mediante el método Refresh en el objeto rdoTable hasta que rdoResultset se vacíe, se cierre o se llene completamente. Por ejemplo, cuando se usa SQL Server 4.2 como origen de datos no puede crear un objeto rdoResultset adicional hasta que se mueva a la última fila del último conjunto de resultados del objeto rdoResultset actual. Para llenar el conjunto de resultados, use el método MoreResults para moverse a través de todos los conjuntos de resultados pendientes, o utilice el método Cancel o Close en el rdoResultset para vaciar todos los conjuntos de resultados pendientes.


rdoCreateEnvironment (Método, datos remotos)

Crea un nuevo objeto rdoEnvironment.

Sintaxis

Set variable = rdoCreateEnvironment(nombre, usuario, contraseña)

La sintaxis del método rdoCreateEnvironment consta de las siguientes partes:

Parte | Descripción
variable | Una expresión de objeto que da como resultado un objeto rdoEnvironment.
nombre | Una variable de tipo String que asigna nombre de forma exclusiva al nuevo objeto rdoEnvironment. Vea la propiedad Name para ver detalles de nombres de rdoEnvironment válidos.
usuario | Una variable de tipo String que identifica al propietario del nuevo objeto rdoEnvironment. Vea la propiedad UserName para obtener más información al respecto.
contraseña | Una variable de tipo String que contiene la contraseña para el nuevo objeto rdoEnvironment. La contraseña puede tener hasta 14 caracteres de longitud y puede incluir cualquier carácter excepto el carácter ASCII 0 (null).

Comentarios

El objeto rdoEnvironment define un contexto de transacción, usuario y contraseña. Cuando se inicializa el rdoEngine, se crea automáticamente un rdoEnvironments(0) predeterminado con el nombre de usuario rdoDefaultUser y la contraseña rdoDefaultPassword. Si necesita definir un alcance de transacción alternativo que contenga objetos rdoConnection específicos o usuarios específicos, utilice el método rdoCreateEnvironment y especifique los usuarios para el entorno. Entonces puede abrir conexiones frente a este nuevo entorno.

A diferencia de otros métodos que se usan para crear Objetos de datos remotos, rdoCreateEnvironment requiere que se suministren todas sus partes. Si no las suministra, el objeto no se agregará a la colección. Además, los objetos rdoEnvironment no son permanentes y no se pueden guardar. Una vez que se ha creado un objeto rdoEnvironment, sólo puede modificar el valor de las propiedades UserName y Timeout.

No es necesario agregar el nuevo objeto rdoEnvironment a una colección antes de poder usarlo; se agrega automáticamente a la colección rdoEnvironments.

Si nombre hace referencia a un objeto que ya es miembro de la colección rdoEnvironments, se producirá un error interceptable.

Una vez que se usa rdoCreateEnvironment para crear un nuevo objeto rdoEnvironment, se inicia una sesión rdoEnvironment y es posible hacer referencia al objeto rdoEnvironment en la aplicación.

Para quitar un objeto rdoEnvironment de la colección rdoEnvironments, utilice el método Close sobre el objeto rdoEnvironment. No puede quitar rdoEnvironments(0).


rdoRegisterDataSource (Método, datos remotos)

Introduce información de conexión para un origen de datos ODBC en el Registro de Windows.

Sintaxis

rdoRegisterDataSource DSN, controlador, silencio, atributos

La sintaxis del método rdoRegisterDataSource consta de las siguientes partes:

Parte | Descripción
DSN | Una expresión de cadena que es el nombre utilizado en el método OpenConnection que hace referencia a un bloque de información que describe el origen de datos. Por ejemplo, si el origen de datos es una base de datos remota ODBC, podría ser el nombre del servidor.
controlador | Una expresión de cadena que es el nombre del controlador ODBC. No es el nombre del archivo de biblioteca de vínculos dinámicos (DLL) del controlador ODBC. Por ejemplo, SQL Server es un nombre de controlador, pero SQLSRVR.DLL es el nombre de un archivo DLL. Debe tener ya instalado ODBC y el controlador apropiado.
silencio | Un valor de tipo Boolean que es True si no desea que se muestren los cuadros de diálogo del controlador ODBC que solicitan información específica del controlador o False si desea mostrar los cuadros de diálogos del controlador ODBC. Si silencio es True, atributos debe contener toda información específica del controlador necesaria o los cuadros de diálogos se mostrarán de cualquier forma.
atributos | Una expresión de cadena que es una lista de palabras clave que se van a agregar al archivo ODBC.INI. Las palabras claves están en una cadena delimitadas por retornos de carro.

Comentarios

Cuando use el método OpenConnection o EstablishConnection puede emplear una entrada registrada de origen de datos para proporcionar información de la conexión.

Si el origen de datos ya está registrado en el Registro de Windows cuando utilice el método rdoRegisterDataSource, se actualizará la información de conexión. Si el método rdoRegisterDataSource falla por cualquier razón, no se efectúan modificaciones en el Registro de Windows y se produce un error.

Para obtener más información sobre controladores ODBC como SQL Server, vea el archivo de Ayuda proporcionado con el controlador.

Nota Anímese a usar el cuadro de diálogo Administrador de orígenes de datos ODBC de 32 bits del Panel de control para agregar nuevos orígenes de datos o realizar cambios en las entradas existentes.

Atributos de Microsoft SQL Server

Los siguientes atributos se utilizan al configurar las entradas DSN para los controladores de Microsoft SQL Server que se extraen del archivo Drvssrvr.Hlp. Los controladores de otros proveedores presentan su propio conjunto de atributos que pueden ajustarse o no a este conjunto. Vea la documentación proporcionada con su controlador para obtener información adicional.

Palabra clave | Descripción
ADDRESS | Dirección de red del sistema de administración de base de datos SQL Server del que el controlador recuperará datos.
DATABASE | Nombre de la base de datos de SQL Server.
DESCRIPTION | Descripción de los datos del origen de datos.
LANGUAGE | Idioma que usará SQL Server.
NETWORK | Biblioteca de red que conecta las plataformas en las que residen SQL Server y el controlador de SQL Server.
OEMTOANSI | Permite la conversión del juego de caracteres OEM a ANSI si la máquina cliente SQL Server y SQL Server usan el mismo juego de caracteres no ANSI. Los valores válidos son YES para on (conversión habilitada) y NO para off.
SERVER | Nombre del equipo de la red en el que reside el origen de datos.
TRANSLATIONDLL | Nombre del archivo DLL que traduce los datos que pasan entre la aplicación y el origen de datos.
TRANSLATIONNAME | Nombre del traductor para los datos que pasan entre la aplicación y el origen de datos.
TRANSLATIONOPTION | Habilita la traducción de los datos que pasan entre la aplicación y el origen de datos.
USEPROCFORPREPARE | Deshabilita la generación de procedimientos almacenados por SQLPrepare. Los valores válidos son NO para off (generación deshabilitada) y YES para on. El valor predeterminado (establecido en el cuadro de diálogo de configuración) es YES.

Establecer la opción OEMTOANSI

Seleccione esta opción si el equipo cliente SQL Server y SQL Server están usando el mismo juego de caracteres no ANSI. Por ejemplo, si SQL Server usa la página de códigos 850 y este equipo cliente usa la página de códigos 850 para OEM, al seleccionar esta opción se asegurará que los caracteres extendidos almacenados en la base de datos se convierten de forma adecuada a ANSI para su uso en aplicaciones Windows.

Cuando esta opción está establecida a YES y la máquina cliente SQL Server y SQL Server están usando juegos de caracteres diferentes, debe especificar un traductor de juego de caracteres.

Establecer la opción Servidor

La opción Servidor establece el nombre del servidor. "(local)" puede introducirse como servidor en un equipo con Microsoft Windows NT si el DSN está pensado para hacer referencia a un servidor del sistema local. El usuario puede usar entonces una copia local de SQL Server (que escucha canalizaciones con nombre), aunque se ejecute en una versión de SQL Server que no esté en red. Observe que cuando el controlador SQL Server de 16 bits está usando "(local)" sin red, debe estar instalado el Adaptador MS de bucle de retorno.

Para obtener mas información acerca de los nombres de servidores en los distintos tipos de red, vea la configuración de Microsoft SQL Server.

Establecer la opción Dirección

La opción Dirección establece la dirección de la ruta de red del sistema de administración de base de datos SQL Server (DBMS) desde el que el controlador recupera los datos. Para Microsoft SQL Server puede omitir normalmente este argumento cuando se establece a (predeterminada).

Establecer la opción Red

El atributo Red establece el nombre del archivo DLL de biblioteca de red de SQL Server de 32 bits que SQL Server utiliza para comunicarse con el software de red. Si no se proporciona esta opción, el controlador de SQL Server usa la biblioteca de red predeterminada del equipo cliente, que se especifica en el cuadro Default Network en la ficha Net-Library del programa de configuración cliente de SQL Server.

Si crea un origen de datos mediante una biblioteca de red u opcionalmente una dirección de red, la configuración ODBC de SQL Server creará una entrada con un nombre de servidor que podrá ver en la ficha Advanced del programa de configuración de cliente SQL Server. Las aplicaciones DB-Library pueden usar también estas entradas con el nombre del servidor.


Refresh (Método, datos remotos)

Cierra y vuelve a generar el objeto rdoResultset creado por un control RemoteData o actualiza los miembros de las colecciones de la lista Se aplica a.

Sintaxis

objeto.Refresh

El marcador de posición objeto representa un expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Puede usar el método Refresh en un control RemoteData para cerrar y volver a abrir el rdoResultset si las propiedades que describen el conjunto de resultados han cambiado. Cuando usa el método Refresh, las propiedades y la posición de la fila actual se restablecen al mismo estado en que estaban cuando se ejecutó por primera vez la consulta.

Una vez que se ha aplicado el método Refresh al control RemoteData, todos los marcadores almacenados del rdoResultset dejan de ser válidos.

Si las propiedades BOF y EOF del objeto rdoResultset son ambas True, o si la propiedad RowCount se establece a 0 después de usar el método Refresh, la consulta no devolvió ninguna fila y el nuevo rdoResultset no contiene datos.

Utilice el método Refresh en entornos multiusuario donde el esquema de la base de datos esté sujeto a cambio para recuperar las definiciones de la tabla actual. Si se aplica el método Refresh a una colección rdoTables se obtienen los nombres de las tablas base de la base de datos. Si se aplica Refresh a una colección rdoColumns de un objeto rdoTable específico, se obtienen las estructuras de las tablas, incluyendo los nombre y los tipos de datos de las columnas de las tablas base.

Nota Antes de usar el nombre de la tabla base en el argumento nombre del método OpenResultset, primero debe aplicar el método Refresh a la colección rdoTables para llenarla. También puede llenar la colección rdoTables haciendo referencia a uno de sus miembros con un número ordinal. Por ejemplo, si hace referencia a rdoTables(0) se llenará toda la colección.


Remove (Método, datos remotos)

Quita un miembro específico de un objeto Collection de Remote Data.

Sintaxis

objeto.Remove índice

La sintaxis del método Remove consta de las siguientes partes:

Parte | Descripción
objeto | El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Un entero o una cadena que identifica de forma única el objeto dentro de la colección. Use un entero para indicar el valor de la propiedad Index; use una cadena para indicar el valor de la propiedad Key.

Comentarios

Para quitar todos los miembros de una colección, use el método Clear.


Requery (Método, datos remotos)

Actualiza los datos de un objeto rdoResultset volviendo a ejecutar la consulta en la que está basado el objeto.

Sintaxis

objeto.Requery [opciones]

La sintaxis del método Requery consta de las siguientes partes:

Parte | Descripción
objeto | El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
opciones | Un valor de tipo Variant o una constante que determina cómo se ejecuta la consulta, como se describe en Valores.

Valores

El valor admitido para opciones es:

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecuta la operación de forma asíncrona.

Comentarios

Utilice este método para garantizar que un rdoResultset contiene los datos más recientes. Cuando utiliza Requery, todas las modificaciones efectuadas por los usuarios a los datos de las tablas subyacentes se muestran en el rdoResultset y la primera fila del rdoResultset pasa a ser la fila actual.

Si usa la opción rdAsyncEnable, el control vuelve a su aplicación en cuanto comience la consulta, a menudo antes de que haya disponible un conjunto de resultados. Para comprobar si ha terminado una consulta, use la propiedad StillExecuting. El objeto rdoResultset no será válido hasta que StillExecuting devuelva False. Puede usar también el evento QueryCompleted para indicar cuándo se completado la consulta.

Si los objetos rdoParameter han cambiado, sus nuevos valores se emplean en la consulta utilizada para generar el nuevo rdoResultset.

Una vez se ha ejecutado el método Requery, todos los marcadores rdoResultset almacenados previamente no son válidos.

Si las propiedades BOF y EOF del objeto rdoResultset son ambas True, o si la propiedad RowCount se establece a 0 después de usar el método Requery, la consulta no devolvió ninguna fila y el nuevo rdoResultset no contiene datos.

No es posible aplicar el método Requery a objetos rdoResultset cuya propiedad Restartable se establezca a False.


Update (Método, datos remotos)

Guarda el contenido de la fila del búfer de copia en un objeto rdoResultset actualizable especificado y descarta el búfer de copia.

Sintaxis

objeto.Update

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Utilice Update para guardar la fila actual y las modificaciones realizadas en las tablas de la base de datos subyacente. Los cambios que realice en el rdoResultset después de usar los métodos AddNew o Edit pueden perderse si no usa el método Update antes de que termine la aplicación.

Nota Cuando usa una biblioteca de cursores ClientBatch, todas las actualizaciones de las tablas base se retrasan hasta que use el método BatchUpdate. En este caso, el método Update actualiza el rdoResultset local, pero no actualiza las tablas base. Estos cambios pueden perderse si la aplicación termina antes de que se complete el método BatchUpdate.

Las modificaciones de la fila actual se pierden si:

  • Utiliza el método Edit o AddNew y después cambia la posición del puntero de fila actual a otra fila sin haber usado Update antes.

  • Usa Edit o AddNew y después vuelve a usar Edit o AddNew sin emplear Update primero.

  • Cancela la actualización con el método CancelUpdate.

  • Establece la propiedad Bookmark a otra fila.

  • Cierra el conjunto de resultados al que hace referencia objeto sin usar Update primero.

  • La aplicación termina antes de ejecutarse el método Update, como cuando se interrumpe el suministro eléctrico.

Para modificar una fila, utilice el método Edit para copiar el contenido de la fila actual al búfer de copia. Si no usa AddNew o Edit primero, se producirá un error cuando emplee Update o cuando intente agregar una nueva fila.

Para agregar una nueva fila, use el método AddNew para inicializar y activar el búfer de copia.

Usar Update produce un error bajo cualquiera de la siguientes condiciones:

  • No hay ninguna fila actual.

  • La conexión o el rdoResultset es de sólo lectura.

  • No hay ninguna columna actualizable en la fila.

  • No hay ninguna operación Edit o AddNew pendiente.

  • Otro usuario ha bloqueado la fila o la página de datos que contiene la fila.

  • El usuario no tiene permiso para realizar la operación.

  • Dependiendo del controlador y el tipo de cursor empleados, puede que no sea capaz de usar el cursor para actualizar la clave principal.


UpdateControls (Método, datos remotos)

Obtiene la fila actual de un objeto rdoResultset del control RemoteData y muestra los datos apropiados en controles enlazados a un control RemoteData.

Sintaxis

objeto.UpdateControls

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Utilice este método para restaurar el contenido de los controles enlazados a sus valores originales, como cuando un usuario efectúa cambios en los datos y después decide cancelar las modificaciones.

Este método produce el mismo efecto que convertir en actual de nuevo la fila actual, excepto que no ocurre ningún evento. Al no invocar eventos, este método puede usarse para simplificar una operación de actualización ya que no se desencadenan procedimientos de evento adicionales de validación o de modificación.


UpdateRow (Método, datos remotos)

Guarda los valores actuales de los controles enlazados en la base de datos.

Sintaxis

objeto.UpdateRow

La marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Utilice este método para guardar el contenido actual de los controles enlazados en la base de datos durante el evento Validate, pero sin desencadenar de nuevo el evento Validate. Este método se puede usar para evitar que se inicie el evento Validate. Mediante este método se evita un evento en cascada.

El método UpdateRow tiene el mismo efecto que ejecutar el método Edit, modificar una columna y después ejecutar el método Update, excepto que no ocurre ningún evento.

Nota Cuando usa una biblioteca de cursores ClientBatch, todas las actualizaciones a las tablas base se retrasan hasta que use el método BatchUpdate. En este caso, el método UpdateRow actualiza el rdoResultset local, pero no actualiza las tablas base. Estos cambios pueden perderse si la aplicación termina antes de que se haya completado el método BatchUpdate.

Siempre que intente actualizar una fila de la base de datos, se deben cumplir las reglas de validación antes de escribirse la fila en la base de datos. En el caso de Microsoft SQL Server, estas reglas están establecidas por los valores predeterminados, las reglas y los desencadenantes de Transact SQL escritos para exigir la integridad referencial y de los datos.

Una actualización puede no realizarse por cualquiera de las siguientes razones, que además pueden desencadenar un error interceptable:

  • La página de datos que contiene la fila, o la propia fila, está bloqueada.

  • La base de datos o el objeto rdoResultset no es actualizable.

  • El usuario no tiene permisos para efectuar la operación.


rdoColumn (Objeto)

Un objeto rdoColumn representa una columna de datos con un tipo de datos y un conjunto de propiedades comunes.

Comentarios

El objeto rdoTable, o la colección rdoColumns del objeto rdoResultset, representa el objeto rdoColumn de una fila de datos. Puede usar el objeto rdoColumn en un rdoResultset para leer y establecer valores para las columnas de datos en la fila actual del objeto. Sin embargo, en la mayoría de los casos, las referencias al objeto rdoColumn sólo se incluyen porque la colección rdoColumns es la colección predeterminada del objeto rdoResultset.

El nombre de un objeto rdoColumn está determinado por el nombre utilizado para definir la columna de la tabla del origen de datos o por el nombre que se le asigna en una consulta SQL. Por ejemplo, si una consulta SQL asigna un alias a la columna, se asigna este nombre a la propiedad Name; de lo contrario, se utiliza el nombre de la columna.

Las columnas de la base de datos se manipulan mediante un objeto rdoColumn y sus métodos y propiedades. Por ejemplo, puede:

  • Usar la propiedad Value de un objeto rdoColumn para extraer datos de una columna especificada.

  • Usar los valores de las propiedades Type y Size para determinar el tipo de datos y el tamaño de los mismos.

  • Usar la propiedad Updatable para ver si es posible cambiar la columna.

  • Usar los valores de las propiedades SourceColumn y SourceTable para encontrar el origen original de datos.

  • Usar la propiedad OrdinalPosition para obtener el orden de presentación de los objetos rdoColumn en una colección rdoColumns.

  • Usar los valores de las propiedades Attributes y Required para determinar las características opcionales y si en la columna se permiten valores Null.

  • Usar la propiedad AllowZeroLength para determinar cómo se manejan las cadenas de longitud cero.

  • Usar las propiedades BatchConflictValue y OriginalValue para resolver conflictos de actualizaciones optimistas por lotes.

  • Usar la propiedad KeyColumn para determinar si esta columna forma parte de la clave principal.

  • Usar la propiedad Status para determinar si se ha modificado la columna.

  • Usar los métodos AppendChunk, ColumnSize y GetChunk para manipular columnas que requieran la utilización de estos métodos, como determina la propiedad ChunkRequired.

Cuando sea necesario hacer referencia a datos de una columna rdoResultset, puede hacer referencia a la propiedad Value de un objeto rdoColumn:

  • Haciendo referencia al valor de la propiedad Name mediante esta sintaxis:
    ' Hace referencia a la columna Au_Fname rdoColumns("Au_Fname")
rs.rdoColumns("Au_Fname")

    -o bien-

    ' Hace referencia a la columna Au_Fname
rs.rdoColumns!Au_Fname
  • Haciendo referencia a su posición ordinal en la colección rdoColumns mediante esta sintaxis:
    rs.rdoColumns(0)

La colección rdoColumns del objeto rdoTable contiene especificaciones para las columnas de datos. Puede usar el objeto rdoColumn de un objeto rdoTable para asignar la estructura de columnas de la tabla de base. Sin embargo, no puede modificar directamente la estructura de la tabla de la base de datos mediante propiedades y métodos de RDO. Sin embargo, sí puede usar las consultas de acciones del Lenguaje de definición de datos (DDL) para modificar la estructura de la base de datos.

Cuando se tiene acceso a un objeto rdoColumn como parte de un objeto rdoResultset, los datos de la fila actual son visibles en la propiedad Value del objeto rdoColumn. Por lo general, para manipular datos en el rdoResultset no hará referencia directa a la colección rdoColumns. En su lugar, utilice la sintaxis que hace referencia a la colección rdoColumns como la colección predeterminada de rdoResultset.

dim rs As rdoResultset
Set rs = cn.OpenResultset("Select * from Authors" _
   & "Where Au_Lname = 'White'",rdOpenForwardOnly)
debug.print rs!Au_Fname
   'Hace referencia a la colección rdoColumns del objeto rdoRecordset.


Ejemplo del objeto rdoColumn y la colección rdoColumns

El siguiente ejemplo abre una conexión con una base de datos de SQL Server y crea un objeto rdoResultset que devuelve dos columnas: una columna normal y una derivada de una expresión. A continuación, el ejemplo muestra los objetos rdoColumn devueltos por el conjunto de resultados.

Private Sub rdoColumnButton_Click()
Dim cl As rdoColumn
Dim rs As rdoResultset
Dim sSQL As String
Dim cn As rdoConnection
Dim connect As String

connect = "uid=;pwd=;database=pubs;"

Set cn = rdoEnvironments(0).OpenConnection(workdb, _
             rdDriverNoPrompt, False, connect)

sSQL = "Select Pub_ID, Max(Price) BestPrice " _
    & " from Titles Group by Pub_ID"

Set rs = cn.OpenResultset(sSQL, rdOpenForwardOnly, _
    rdConcurReadOnly)

With rs
    For Each cl In .rdoColumns
        Print cl.Name; "-"; cl.Type; ":"; cl.Size, _
         cl.SourceTable, cl.SourceColumn
    Next cl
    Print
    Do Until .EOF
        For Each cl In .rdoColumns
            Print cl.Value,
        Next cl
        Print
        .MoveNext
    Loop
End With
End Sub


rdoColumns (Colección)

Una colección rdoColumns contiene todos los objetos rdoColumn de un objeto rdoResultset o rdoTable.

Comentarios

El objeto rdoTable, o la colección rdoColumns del objeto rdoResultset, representa los objetos rdoColumn de una fila de datos. El objeto rdoColumn de un rdoResultset se utiliza para leer y establecer valores para las columnas de datos en la fila actual del objeto.

RDO crea automáticamente el objeto rdoColumn cuando:

  • Se crea un objeto rdoTable o rdoResultset.

  • Se hace referencia a un objeto rdoTable.

  • Se crea un rdoResultset mediante OpenResultset.


rdoConnection (Objeto)

Un objeto rdoConnection representa una conexión abierta con un origen de datos remoto y una base de datos específica en ese origen de datos, o un objeto asignado pero no conectado todavía, que puede usarse para establecer una conexión posteriormente.

Comentarios

Generalmente, un objeto rdoConnection representa una conexión física con el origen de datos remoto y corresponde a un único controlador ODBC hDbc. Se requiere una conexión con un origen de datos remoto antes de poder tener acceso a sus datos. Puede abrir conexiones con orígenes de datos ODBC remotos y crear objetos rdoConnection mediante el control RemoteData o mediante el método OpenConnection de un objeto rdoEnvironment.

Para establecer una conexión con un servidor remoto mediante el objeto rdoConnection, puede usar el método OpenConnection para reunir los argumentos connect, dsname, readonly y prompt y abrir la conexión. Después, se aplican estos argumentos al nuevo objeto rdoConnection creado. También puede establecer la conexión mediante el control RemoteData.

Crear objetos rdoConnection independientes

También puede crear un nuevo objeto rdoConnection que no esté vinculado de forma inmediata con una conexión física específica a un origen de datos. Por ejemplo, el siguiente código crea un objeto rdoConnection independiente:

Dim X as new rdoConnection.

Una vez creado, puede establecer las propiedades de un objeto rdoConnection y posteriormente usar el método EstablishConnection. Este método determina cómo se pregunta a los usuarios, en base al argumento prompt, y establece el estado de sólo lectura de la conexión en base al argumento readonly.

Cuando se utiliza esta técnica, RDO establece las siguientes propiedades a partir de los valores predeterminados de rdoEngine: CursorDriver, LoginTimeout, UserName, Password y ErrorThreshold. Las propiedades CursorDriver y LoginTimeout pueden establecerse en el propio objeto rdoConnection, y UserName y Password pueden establecerse a través de argumentos en la cadena de conexión. Una vez abierta la conexión, todas estas propiedades son de sólo lectura.

Al declarar un objeto rdoConnection independiente o usar el método EstablishConnection, el objeto no se agrega automáticamente a la colección rdoConnections. Utilice los métodos Add o Remove para agregar o eliminar objetos rdoConnection independientes a o de la colección rdoConnections. Sin embargo, no es necesario agregar un objeto rdoConnection a la colección rdoConnections antes de que pueda usarse para establecer una conexión.

Nota Las colecciones de RDO 1.0 se comportan de forma diferente a las colecciones de Objetos de acceso a datos (DAO). Cuando se establece con Set una variable que contiene una referencia a un objeto RDO como rdoResultset, el objeto rdoResultset existente no se cierra ni se quita de la colección rdoResultsets. El objeto existente permanece abierto y sigue siendo un miembro de su respectiva colección.

Por el contrario, las colecciones de RDO 2.0 no se comportan de esta forma. Cuando se utiliza una instrucción Set para asignar una variable que contiene una referencia a un objeto RDO, el objeto existente sí se cierra y se quita de la colección asociada. Este cambio está diseñado para hacer más compatible RDO con DAO.

Operaciones asíncronas

Tanto el método EstablishConnection como OpenConnection admiten operaciones síncronas, asíncronas y administradas por eventos. Al establecer la opción rdAsyncEnable, el control vuelve a la aplicación antes de que se establezca la conexión. Cuando la propiedad StillConnecting devuelva False y se produzca el evento Connect, la conexión se ha realizado o no se ha completado. Puede comprobar el éxito o fallo de esta operación si examina los errores devueltos a través de la colección rdoErrors.

Abrir conexiones sin nombres de orígenes de datos

En muchas situaciones es difícil asegurar que existe un Nombre de origen de datos (DSN) registrado en el sistema de destino y, en algunos casos, no es aconsejable crear uno. De hecho, no es necesario un DSN para establecer una conexión si utiliza el protocolo predeterminado de red (canalizaciones con nombre) y conoce el nombre del servidor y del controlador ODBC. En tal caso, puede establecer una conexión sin DSN mediante los siguientes pasos:

  1. Asigne el argumento DSN de la cadena de conexión a una cadena vacía (DSN='').

  2. Incluya el nombre del servidor en la cadena de conexión.

  3. Incluya el nombre del controlador ODBC en la cadena de conexión. Puesto que muchos nombres de controladores tienen más de una palabra, escriba el nombre entre llaves { }.

Nota Esta opción no está disponible si necesita usar otro protocolo de red distinto de canalizaciones con nombre o una de las demás opciones para configurar el DSN como la conversión OEMTOANSI.

Por ejemplo, el siguiente código abre una conexión de sólo lectura de un cursor ODBC en "SEQUEL" de SQL Server e incluye un controlador de error sencillo:

Sub MakeConnection()
Dim rdoCn As New rdoConnection
On Error GoTo CnEh
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .CursorDriver = rdUseODBC
    .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub
CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next
End Sub

Elegir una base de datos específica

Una vez establecida la conexión, puede manipular la base de datos asociada al objeto rdoConnection si utiliza el objeto rdoConnection y sus métodos y propiedades. Para los servidores que admiten más de una base de datos por conexión, la base de datos predeterminada:

  • Queda asignada al nombre de usuario por el administrador del sistema de base de datos

  • Se especifica mediante el argumento de conexión DATABASE utilizado cuando se crea el objeto rdoConnection.

  • Se especifica en la entrada de origen de datos de ODBC registrado.

  • Se selecciona mediante una instrucción SQL como USE <base de datos> enviada con una consulta de acciones.

Todas las consultas ejecutadas en el servidor asumen esta base de datos predeterminada a menos que se haga referencia específica a otra base de datos en la consulta SQL.

Preparar errores al realizar una conexión

Existen diversas razones por las que quizá no pueda conectarse a la base de datos remota. Tenga en cuenta las siguientes condiciones que normalmente pueden impedir que las conexiones se realicen:

  • Puede que el servidor no tenga suficientes recursos de conexión debido a configuraciones administrativas o restricciones de licencia.

  • Puede que el usuario no tenga permisos de acceso a la red, al servidor o a la base de datos con la contraseña proporcionada.

  • El servidor, la red o los puentes de WAN pueden no estar operativos o pueden funcionar más lento de lo esperado.

Cerrar el objeto rdoConnection

Cuando utiliza el método Close con el objeto rdoConnection, se cierra cualquier objeto rdoResultset o rdoQuery abierto. Sin embargo, si el objeto rdoConnection simplemente pierde alcance, estos objetos permanecen abiertos hasta que el objeto rdoConnection o los objetos se cierren de forma explícita. No se recomienda cerrar una conexión cuando existen consultas incompletas o transacciones pendientes sin aceptar.

El cierre de una conexión también la quita de la colección rdoConnections. Sin embargo, no se destruye el objeto rdoConnection propiamente dicho. Si es necesario, puede usar el método EstablishConnection para volver a conectarse al mismo servidor con las mismas configuraciones o cambiar las propiedades del objeto rdoConnection y después usar EstablishConnection para conectarse a otro servidor.

El cierre de una conexión también indica al servidor remoto que descarte cualquiera de los objetos específicos de la instancia asociado a la conexión. Por ejemplo, se eliminan todos los cursores del lado del servidor, las tablas temporales o cualquier otro objeto creado en la base de datos TempDB de SQL Server.

Trabajar con métodos y propiedades de rdoConnection

Puede manipular la conexión, las bases de datos y las consultas asociadas mediante los métodos y propiedades del objeto rdoConnection. Por ejemplo, puede:

  • Usar la propiedad CursorDriver para determinar el tipo de cursor solicitado por los conjuntos de resultados creados en la conexión.

  • Usar el método OpenResultset para crear un nuevo objeto rdoResultset.

  • Usar LastQueryResults para hacer referencia al último objeto rdoResultset creado en esta conexión.

  • Usar las propiedades QueryTimeout o LoginTimeout para especificar cuánto debe esperar el Administrador de controladores ODBC antes de abandonar una consulta o un intento de conexión.

  • Usar la propiedad RowsAffected para determinar a cuántas filas afectó la última consulta de acciones.

  • Usar el método Execute para ejecutar una consulta de acciones o pasar una instrucción SQL a una base de datos para su ejecución.

  • Usar el método CreateQuery para crear un nuevo objeto rdoQuery.

  • Usar el método Close para cerrar una conexión abierta, quitar el objeto rdoConnection de la colección rdoConnections, liberar el controlador de conexión y terminar la conexión.

  • Usar la propiedad Transactions para determinar si la conexión admite transacciones que se pueden implementar mediante los métodos BeginTrans, CommitTrans y RollbackTrans.

  • Usar la propiedad AsyncCheckInterval para determinar con qué frecuencia debe comprobar RDO si una operación asíncrona ha finalizado.

  • Usar la API de ODBC con la propiedad hDbc para establecer las opciones de conexión.

  • Usar la propiedad Connect para determinar el argumento connect utilizado en el método OpenConnection o la propiedad Connect del control RemoteData.

Eventos del objeto rdoConnection

Al manipular un objeto rdoConnection se producen los siguientes eventos. Se pueden usar para administrar el proceso de conexión y desconexión, y para proporcionar un controlador adicional de reintentos en situaciones de exceso de tiempo de espera de la consulta.

Nombre del evento | Descripción
BeforeConnect | Se produce antes de la llamada a ODBC para establecer la conexión
Connect | Se produce después de establecer la conexión
Disconnect | Se produce después de cerrar la conexión
QueryComplete | Se produce después de completar la ejecución de una consulta en esta conexión
QueryTimeout | Se produce después de que se agote el periodo de QueryTimeout

Referencias al objeto rdoConnection

El valor de la propiedad Name de un objeto rdoConnection especifica el parámetro del nombre del origen de datos (DSN) utilizado para abrir la conexión. Esta propiedad se encuentra a menudo en blanco ya que no se utiliza cuando se realiza una conexión sin DSN. En los casos en los que se especifica un DSN diferente para abrir cada conexión, puede hacer referencia a cualquier objeto rdoConnection por su valor de la propiedad Name mediante la siguiente sintaxis. Este código hace referencia a la conexión abierta con el DSN Contabilidad:

rdoConnections("Contabilidad")

También puede hacer referencia al objeto por su número ordinal mediante esta sintaxis (que hace referencia al primer miembro de la colección rdoConnections):

rdoConnections(0)


rdoConnections (Colección)

Una colección rdoConnections contiene todos los objetos rdoConnection abiertos o creados en un objeto rdoEnvironment del motor de base de datos remoto o asignados y anexados a la colección rdoConnections mediante el método Add.

Comentarios

La colección rdoConnections se utiliza para administrar los objetos rdoConnection. Sin embargo, sólo los objetos rdoConnection creados con el método OpenConnection o mediante el control RemoteData se anexan automáticamente a la colección. Cuando asigna un objeto rdoConnection independiente, no se anexa a la colección rdoConnections hasta que se utiliza el método Add.

Nota Las colecciones de RDO 1.0 se comportan de manera diferente a las colecciones de Objetos de acceso a datos (DAO). Cuando establece con Set una variable que contiene una referencia a un objeto RDO como rdoResultset, el rdoResultset existente no se cierra ni se quita de la colección rdoResultsets. El objeto existente permanece abierto y sigue siendo miembro de su respectiva colección.

Por el contrario, las colecciones de RDO 2.0 no se comportan de esta forma. Cuando utiliza la instrucción Set para asignar una variable que contiene una referencia a un objeto RDO, el objeto existente sí se cierra y se quita de la colección asociada. Este cambio está diseñado para hacer RDO más compatible con DAO.

Cerrar objetos rdoConnection

Cuando utiliza el método Close en un objeto rdoConnection, se cierra cualquier rdoResultset u rdoQuery abierto y el objeto rdoConnection se quita de la colección rdoConnections. Sin embargo, si el objeto rdoConnection simplemente pierde alcance, estos objetos permanecen abiertos hasta que el objeto rdoConnection o los objetos se cierren de forma explícita.


Ejemplo del objeto rdoConnection y la colección rdoConnections

Este ejemplo establece un objeto rdoConnection independiente, establece sus propiedades y utiliza el método EstablishConnection para abrir la conexión.

Option Explicit
Dim cn As New rdoConnection

Private Sub rdoConnectionButton_Click()
WorkingLight.Caption = "Conectando..."
With cn
    .Connect = "DSN=BadServerName;" _
     & "UID=;PWD=;DATABASE=WorkDB;"
    .LoginTimeout = 20
    .CursorDriver = rdUseOdbc
    .EstablishConnection _
      prompt:=rdDriverNoPrompt, _
      Option:=rdAsyncEnable
End With
While .StillConnecting
  ToggleLight      ' Conmutar indicador de estado
  DoEvents
Wend
WorkingLight = True      ' Mostrar indicador de estado
WorkingLight.Caption = "Conectado"
End Sub

Sub ToggleLight()   'Conmuta el indicador de "Abriendo"
WorkingLight = Not WorkingLight
End Sub


rdoEngine (Objeto)

El objeto rdoEngine representa el origen de datos remoto. Como objeto de nivel superior, contiene todos los demás objetos de la jerarquía de Objetos de datos remotos (RDO).

Comentarios

El objeto rdoEngine puede representar un motor de base de datos remoto u otro origen de datos administrado por el Administrador de controladores ODBC como una base de datos. El objeto rdoEngine es un objeto predefinido, por lo que no puede crear objetos rdoEngine adicionales y no es miembro de ninguna colección.

El objeto rdoEngine se utiliza para hacer referencia a la colección rdoEnvironments o para establecer valores predeterminados para los objetos rdoEnvironment de nueva creación. Cuando se crea un objeto rdoEnvironment, sus propiedades se inicializan en base a los valores predeterminados establecidos en el objeto rdoEngine. Se crea de forma automática un objeto rdoEnvironments(0) predeterminado cuando se hace referencia a él por primera vez.

El objeto rdoEngine produce el evento InfoMessage cuando el origen de datos remoto devuelve un mensaje informativo. Los mensajes informativos están indicados por un código de retorno SQL_SUCCESS_WITH_INFO de ODBC. Estos mensajes se sitúan en la colección rdoErrors. En los casos en los que se reciben varios mensajes a la vez, sólo se produce un único evento InfoMessage: después de la llegada del último mensaje y de haberlo agregado a la colección rdoErrors.

Establecer los valores predeterminados de las propiedades de rdoEnvironment

Las siguientes propiedades establecen valores predeterminados para todos los objetos rdoEnvironment de nueva creación. También se utilizan cuando se generan instancias de objetos rdoConnection independientes.

  • Utilice la propiedad rdoDefaultLoginTimeout para determinar el valor predeterminado la propiedad LoginTimeout del objeto rdoEnvironment; dicha propiedad se utiliza en la administración del tiempo disponible para la conexión.

  • Utilice la propiedad rdoDefaultCursorDriver para determinar el valor predeterminado CursorDriver del objeto rdoEnvironment. Esta propiedad determina si el Administrador de controladores ODBC crea cursores por lotes del lado del cliente, locales, del servidor o si no crea cursores.

  • Utilice las propiedades rdoDefaultUser y rdoDefaultPassword para determinar los valores predeterminados de las propiedades UserName y Password del objeto rdoEnvironment. Esto determina el nombre y la contraseña de usuario cuando se abren conexiones si no se suministran valores específicos.

Trabajar con otras propiedades y métodos del objeto rdoEngine

Puede establecer la configuración predeterminada de los nuevos objetos rdoEnvironment y crear nuevas entradas de orígenes de datos ODBC mediante las propiedades y métodos del objeto rdoEngine. Por ejemplo, puede:

  • Usar la colección rdoEnvironments para examinar objetos rdoEnvironment que se han anexado a la colección. Observe que los objetos rdoEnvironment pueden asignarse como objetos independientes.

  • Usar la propiedad rdoLocaleID para determinar qué archivos DLL se cargan por idioma.

  • Usar la propiedad Version para examinar la versión de RDO en uso.

  • Usar la colección rdoErrors para examinar información acerca de los errores generados por la interfaz de ODBC. Los errores generados por Visual Basic se mantienen en otra colección Errors.

  • Usar el método rdoRegisterDataSource para crear una nueva entrada de origen de datos en el Registro del sistema de Windows.

  • Usar el método rdoCreateEnvironment para crear un nuevo objeto rdoEnvironment. También puede asignar un nuevo objeto rdoEnvironment mediante programa.
   Dim MiEnt as New rdoEnvironment


Ejemplo del objeto rdoEngine

Este ejemplo establece varias propiedades del objeto rdoEngine y crea un objeto rdoEnvironment personalizado basado en estos nuevos valores predeterminados. Observe que mientras el código puede establecer una contraseña en un objeto rdoEnvironment, no se puede leer una vez establecida.

Dim en As rdoEnvironment
Private Sub Form_Load()
With rdoEngine
    .rdoDefaultLoginTimeout = 20
    .rdoDefaultCursorDriver = rdUseOdbc
    .rdoDefaultUser = "Fred"
    .rdoDefaultPassword = ""
End With
Set en = rdoEnvironments(0)
'
'   Volcar la colección actual rdoEnvironments
'   y presentar, si es posible, las propiedades
'   actuales
'
For Each en In rdoEnvironments
    Debug.Print "LoginTimeout:" & en.LoginTimeout
    Debug.Print "CursorDriver:" & en.CursorDriver
    Debug.Print "User:" & en.UserName
   ' (Sólo escritura) Debug.Print "Password:" & en.Password
Next
End Sub


rdoEnvironment (Objeto)

Un objeto rdoEnvironment define un conjunto lógico de conexiones y el alcance de una transacción para un determinado nombre de usuario. Contiene tanto conexiones abiertas como asignadas pero no abiertas, proporciona mecanismos para transacciones simultáneas y proporciona un contexto de seguridad para las operaciones del lenguaje de manipulación de datos (DML) en la base de datos.

Comentarios

En general, un objeto rdoEnvironment corresponde a un entorno ODBC al que se puede hacer referencia mediante la propiedad hEnv del objeto rdoEnvironment. Sin embargo, si no se proporciona el argumento Nombre cuando el método rdoCreateEnvironment crea el objeto rdoEnvironment, se crea un objeto rdoEnvironment independiente que no se agrega a la colección rdoEnvironments. Los objetos rdoEnvironment independientes no están expuestos a otros archivos DLL en proceso a menos que no se designen de manera específica como públicos. Si el número de referencias a cualquier rdoEnvironment privado se reduce a cero, se cierran todos los objetos rdoConnection asociados al objeto rdoEnvironment.

Una vez que establezca las propiedades de un objeto rdoEnvironment, puede usar el método Add para anexarlo a la colección rdoEnvironments o el método Remove para desvincular y liberar el objeto. La propiedad Name es de sólo lectura y está determinada por el objeto de datos remoto específico.

El objeto rdoEnvironment predeterminado se crea automáticamente cuando se inicializa el control RemoteData o cuando en el código se hace referencia al primer objeto de datos remotos. La propiedad Name de rdoEnvironments(0) es "Default_Environment". El nombre y contraseña de usuario para rdoEnvironments(0) son ambos "".

Se pueden crear objetos rdoEnvironment con el método rdoCreateEnvironment del objeto rdoEngine, que anexa automáticamente el nuevo objeto a la colección rdoEnvironments. A todos los objetos rdoEnvironment creados de esta forma se les asignan propiedades basadas en las propiedades predeterminadas establecidas en el objeto rdoEngine.

Para establecer la conexión se utiliza la información de nombre y contraseña de usuario del objeto rdoEnvironment, si estos valores no están en el argumento connect del método OpenConnection o en la propiedad Connect del control RemoteData.

Todos los objetos rdoEnvironment comparten un valor de hEnv común que se crea aplicación por aplicación. Utilice el objeto rdoEnvironment para administrar el entorno ODBC actual o para comenzar una conexión adicional. En un objeto rdoEnvironment puede abrir múltiples conexiones, administrar transacciones y establecer seguridad basada en los nombres y contraseñas de usuario. Por ejemplo, puede:

  • Crear un objeto rdoEnvironment utilizando las propiedades Name, Password y UserName para establecer un entorno con nombre y protegido por contraseña. El entorno crea un alcance en el que puede abrir múltiples conexiones y dirigir una instancia de transacciones coordinadas.

  • Usar la propiedad CursorDriver para determinar la biblioteca de controladores de cursor que se utiliza para crear objetos rdoResultset. Puede elegir entre cuatro tipos de cursores o establecer la propiedad CursorDriver a rdUseNone para indicar que no se usará ningún cursor para administrar los conjuntos de resultados.

  • Usar el método OpenConnection para abrir una o más conexiones existentes en el objeto rdoEnvironment.

  • Usar la propiedad LoginTimeout para determinar cuánto tiempo deben esperar los controladores ODBC antes de abandonar el intento de conexión.

  • Usar los métodos BeginTrans, CommitTrans y RollbackTrans para administrar el proceso de transacciones en un objeto rdoEnvironment en varias conexiones.

  • Usar varios objetos rdoEnvironment para dirigir transacciones múltiples, simultáneas, independientes y superpuestas.

  • Usar el método Close para terminar un entorno y la conexión, y quitar el objeto rdoEnvironment de la colección rdoEnvironments. De esta forma también se cierran todas las conexiones asociadas al objeto.

Administrar transacciones

El objeto rdoEnvironment también determina el alcance de la transacción. Al aceptar una transacción rdoEnvironment se realiza en todas las bases de datos rdoConnection abiertas y sus correspondientes objetos rdoResultset abiertos. Esto no supone una operación de confirmación en dos fases sino que simplemente se indica a los objetos rdoConnection individuales que acepten cualquier operación pendiente, de una en una.

Con las bases de datos de Microsoft SQL Server, se puede usar el Distributed Transaction Coordinator (DTC, Coordinador de transacciones distribuidas) para administrar bloques de transacciones simplemente introduciendo la consulta SQL con la instrucción BEGIN DISTRIBUTED TRANSACTION. El DTC facilita la creación de actualizaciones de base de datos en toda la red a través de su propio protocolo de confirmación en dos fases. Siempre que SQL Server confirma una transacción, el DTC asegura que todos los recursos relacionados también confirman la transacción. Si falla alguna parte de la transacción, el DTC asegura que la transacción entera se cancelará en todos los servidores implicados.

Cuando utiliza transacciones se ven afectadas todas las bases de datos del objeto rdoEnvironment especificado, incluso si hay abiertos múltiples objetos rdoConnection en el objeto rdoEnvironment. Por ejemplo, suponga que utiliza un método BeginTrans en una de las bases de datos visibles desde la conexión, actualiza varias filas en la base de datos y, a continuación, elimina filas en otra base de datos del objeto rdoConnection. Cuando utilice el método RollbackTrans, se cancelarán tanto las operaciones de actualización como de eliminación. Para evitar este problema, puede crear objetos rdoEnvironment adicionales para administrar transacciones independientemente a través de los objetos rdoConnection. Observe que las transacciones ejecutadas por múltiples objetos rdoEnvironment son operaciones serializadas y no atómicas. Por este motivo, su éxito o fracaso no es interdependiente. Éste es un ejemplo de transacciones por lotes.

Puede ejecutar transacciones anidadas sólo si los orígenes de datos las admiten. Por ejemplo, en una conexión única puede ejecutar una instrucción SQL BEGIN TRANS, ejecutar varias consultas UPDATE y otra instrucción BEGIN TRANS. Cualquier operación ejecutada después de la segunda instrucción SQL BEGIN TRANS se puede cancelar independientemente de las instrucciones ejecutadas después de la primera instrucción BEGIN TRANS. Es un ejemplo de transacciones anidadas. Para confirmar el primer conjunto de instrucciones UPDATE, debe ejecutar una instrucción COMMIT TRANS o una instrucción ROLLBACK TRANS para cada BEGIN TRANS ejecutada.

Eventos del objeto rdoEnvironment

Se producen los siguientes eventos cuando se manipula el objeto rdoEnvironment. Se pueden usar para administrar las transacciones RDO asociadas con el objeto rdoEnvironment o para sincronizar otros procesos con la transacción.

Nombre del evento | Descripción
BeginTrans | Se produce después de que se ha completado el método BeginTrans.
CommitTrans | Se produce después de que se ha completado el método CommitTrans.
RollbackTrans | Se produce después de que se ha completado el método RollbackTrans.

Referencias a los objetos rdoEnvironment

La propiedad Name de los objetos rdoEnvironment se establece a partir del argumento nombre pasado al método rdoCreateEnvironment. Puede hacer referencia a cualquier otro objeto rdoEnvironment si especifica el valor de su propiedad Name mediante esta sintaxis:

rdoEnvironments("MiNombreEntorno")

o simplemente:

rdoEnvironments!MiNombreEntorno

También puede hacer referencia a los objetos rdoEnvironment por su posición en la colección rdoEnvironments utilizando esta sintaxis (donde n es el enésimo miembro de la colección rdoEnvironments comenzando desde cero):

rdoEngine.rdoEnvironments(n)

o simplemente:

rdoEnvironments(n)


rdoEnvironments (Colección)

La colección rdoEnvironments contiene todos los objetos rdoEnvironment activos del objeto rdoEngine.

Comentarios

Los objetos rdoEnvironment se crean mediante el método rdoCreateEnvironment del objeto rdoEngine. Los nuevos objetos rdoEnvironment se anexan automáticamente a la colección rdoEnvironments a menos que no proporcione un nombre para el nuevo objeto cuando utilice el método rdoCreateEnvironment o simplemente declare un nuevo objeto rdoEnvironment en el código.

La colección rdoEnvironments se inicializa de forma automática con un objeto rdoEnvironment predeterminado basado en las propiedades predeterminadas establecidas en el objeto rdoEngine.

Si utiliza el método Close con un objeto rdoEnvironment, se cierran todos los objetos rdoConnection que contiene y se quita el objeto de la colección rdoEnvironments.


Ejemplo del objeto rdoEnvironment y la colección rdoEnvironments

El siguiente ejemplo ilustra la creación de un objeto rdoEnvironment y su posterior utilización para abrir un objeto rdoConnection.

Private Sub rdoEnvironmentButton_Click()
Dim en As rdoEnvironment
Dim cn As rdoConnection
Set en = rdoEngine.rdoEvironments(0)
With en
    en.CursorDriver = rdUseOdbc
    en.LoginTimeout = 5
    en.Name = "TransOp1"
    Set cn = en.OpenConnection(dsname:="", _
        prompt:=rdDriverNoPrompt, _
        Connect:="UID=;PWD=;" _
        driver={SQL Server};Server=SEQUEL;", _
        Options:=rdAsyncEnable)
End With
Print "Conectando ";
While cn.StillConnecting
    Print ".";
    DoEvents
Wend
Print "Terminado."

End Sub


rdoError (Objeto)

Contiene detalles acerca de los errores de acceso a datos remotos.

Comentarios

Cualquier operación que afecte a objetos de datos remotos puede potencialmente generar uno o más errores de ODBC o mensajes informativos. A medida que se produce cada error o se generan mensajes, se agregan uno o más objetos rdoError a la colección rdoErrors del objeto rdoEngine. Cuando una operación RDO posterior genera un error, se borra la colección rdoErrors y se agrega a la colección rdoErrors el nuevo conjunto de objetos rdoError. Las operaciones RDO que no generan ningún error no afectan a la colección rdoErrors. Para facilitar el tratamiento de errores, puede usar el método Clear para purgar la colección rdoErrors entre operaciones.

En general, todos los errores ODBC generan un error interceptable de algún tipo en Visual Basic. Compruebe el contenido de la colección rdoErrors para cualquiera y todos los errores resultantes de la última operación que proporcione detalles específicos de la causa del error.

No todos los errores generados por ODBC son fatales. En el curso normal del trabajo con conexiones, bases de datos predeterminadas, instrucciones Print de procedimientos almacenados y otras operaciones, el servidor remoto a menudo devuelve advertencias o mensajes que en general resulta inofensivo pasar por alto. Cuando llega un mensaje informativo, se produce el evento InfoMessage del objeto rdoEngine. Debe examinar la colección rdoErrors en este procedimiento de evento.

Si la gravedad del número de error está por debajo del umbral de error especificado en las propiedades rdoDefaultErrorThreshold o ErrorThreshold, se produce un error interceptable cuando se detecta el error. De lo contrario, simplemente se anexa un objeto rdoError a la colección rdoErrors. Para controlar errores interceptables en Microsoft SQL Server, debe usar la instrucción Transact SQL RAISERROR junto con un argumento apropiado Gravedad para indicar el error u otra información.

Utilice el objeto rdoError para determinar el tipo y la gravedad de cualquier error generado por el control RemoteData u operaciones RDO. Por ejemplo, puede:

  • Usar la propiedad Description para presentar un mensaje de texto que describa el error.

  • Usar la propiedad Number para determinar el número de error del origen de datos nativo.

  • Usar la propiedad Source para determinar el origen del error y la clase de objeto que causa el error.

  • Usar las propiedades SQLRetCode y SQLState para determinar el código de retorno ODBC y los indicadores SQLState.

  • Usar el método Clear en la colección rdoErrors para quitar todos los objetos rdoError. En la mayoría de los casos, no es necesario usar el método Clear porque la colección rdoErrors se borra automáticamente cuando se produce un nuevo error.

Los miembros de la colección rdoErrors no se anexan de la misma forma que se hace en otras colecciones . Los errores más generales se colocan al final de la colección (Count -1) y los errores más detallados se colocan en el índice 0. Debido a esta implementación, puede determinar a menudo la causa principal del fallo si examina rdoErrors(0).

El conjunto de objetos rdoError de la colección rdoErrors describe un error. El primer objeto rdoError corresponde al nivel de error inferior, el segundo es el nivel superior inmediato, y así sucesivamente. Por ejemplo, si se produce un error ODBC mientras el control RemoteData intenta crear un objeto rdoResultset, el último objeto rdoError contiene el error RDO indicando que el objeto no se pudo abrir. El primer objeto de error contiene el nivel inferior de error ODBC. Los errores posteriores contienen los errores ODBC devueltos por los distintos niveles de ODBC. En este caso, el administrador de controladores, y posiblemente el controlador propiamente dicho, devuelven errores distintos que generan objetos rdoError.

La colección rdoErrors también se utiliza para administrar mensajes informativos devueltos por el origen de datos. Por ejemplo, los mensajes devueltos desde instrucciones PRINT, peticiones u operaciones DBCC de SQL Server se devuelven como objetos rdoError en la colección rdoErrors. Este tipo de mensaje desencadena el evento InfoMessage, pero no un error interceptable. Por eso, debe comprobar la propiedad Count de la colección rdoErrors para ver si ha llegado algún error nuevo.


rdoErrors (Colección)

Contiene todos los objetos rdoError almacenados que pertenecen a una única operación en la que intervienen objetos de datos remotos (RDO).

Comentarios

Cualquier operación en la que participan objetos de datos remotos puede generar uno o más errores. A medida que se produce cada error, se agregan a la colección rdoErrors del objeto rdoEngine uno o más objetos rdoError. Cuando otra operación RDO genera un error, se borra la colección rdoErrors y el nuevo conjunto de objetos rdoError se agrega a la colección rdoErrors. Las operaciones RDO que no generan ningún error no afectan a la colección rdoErrors.

  • Utilice el método Clear en la colección rdoErrors para quitar todos los objetos rdoError. En la mayoría de los casos, no es necesario usar el método Clear porque la colección rdoErrors se borra automáticamente cuando se produce un nuevo error.

Los miembros de la colección rdoErrors no se anexan de la misma forma que se hace en otras colecciones . Los errores más generales se colocan al final de la colección (Count -1) y los errores más detallados se colocan en el índice 0. Debido a esta implementación, puede determinar a menudo la causa principal del fallo si examina rdoErrors(0).

El conjunto de objetos rdoError de la colección rdoErrors describe un error. El primer objeto rdoError corresponde al nivel de error inferior, el segundo es el nivel superior inmediato, y así sucesivamente. Por ejemplo, si se produce un error ODBC mientras el control RemoteData intenta crear un objeto rdoResultset, el último objeto rdoError contiene el error RDO indicando que el objeto no se pudo abrir. El primer objeto de error contiene el nivel inferior de error ODBC. Los errores posteriores contienen los errores ODBC devueltos por los distintos niveles de ODBC. En este caso, el administrador de controladores, y posiblemente el controlador propiamente dicho, devuelven errores distintos que generan objetos rdoError.


Ejemplo del objeto rdoError y la colección rdoErrors

El siguiente código ilustra un tratamiento sencillo de errores RDO en tiempo de diseño. Observe que el controlador simplemente presenta los errores de la colección rdoErrors en la ventana Inmediato.

Dim er as rdoError
On Error GoTo CnEh
.
.
.

CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next


Datos remotos (Objetos y colecciones)

Los objetos y colecciones de datos remotos proporcionan el marco para usar código para crear y manipular componentes de un sistema de base de datos ODBC remoto. Los objetos y colecciones tienen propiedades que describen las características de los componentes y métodos de la base de datos que se usan para manipularlos. Al usar el marco de contención, se crean las relaciones entre los objetos y colecciones, y estas relaciones representan la estructura lógica del sistema de base de datos.

Los objetos y colecciones proporcionan distintos tipos de relaciones de contención: los objetos contienen cero o más colecciones, todas de diferentes tipos, y las colecciones contienen cero o más objetos, todos del mismo tipo. Aunque los objetos y las colecciones son entidades similares, la distinción diferencia los dos tipos de relaciones.

Nota RDO sólo está admitido en sistemas operativos de 32 bits como Windows 95 y Windows NT. Para usar objetos de datos remotos, debe establecer una referencia a la biblioteca de objetos Microsoft Remote Data Object 2.0 en el cuadro de diálogo Referencias de Visual Basic.

En la siguiente tabla, el tipo de colección de la primera columna contiene el tipo de objeto de la segunda columna. La tercera columna describe qué representa cada tipo de objeto.

Colección | Objeto | Descripción
rdoConnections | rdoConnection | Una conexión abierta o asignada.
Ninguna | rdoEngine | El motor de base de datos remoto.
rdoErrors | rdoError | Información acerca de errores ODBC.
rdoEnvironments | rdoEnvironment | Un conjunto lógico de objetos rdoConnection con un nombre de usuario y una contraseña comunes.
rdoColumns | rdoColumn | Una columna que forma parte de un objeto rdoResultset.
rdoParameters | rdoParameter | Un parámetro de un objeto rdoQuery o un objeto rdoPreparedStatement.
rdoPreparedStatements | rdoPreparedStatements | Una definición de consulta almacenada (obsoleta).
rdoQueries | rdoQuery | Una definición de consulta guardada.
rdoResultsets | rdoResultset | Las filas devueltas por una consulta.
rdoTables | rdoTable | Una definición de tabla.


rdoParameter (Objeto)

Un objeto rdoParameter representa un parámetro asociado a un objeto rdoQuery.

Comentarios

Cuando trabaja con procedimientos almacenados o consultas SQL que requieren la utilización de argumentos que cambian de una ejecución a otra, debe crear un objeto rdoQuery para administrar la consulta y sus parámetros. Por ejemplo, si realiza una consulta que incluye información proporcionada por el usuario como un intervalo de fechas o un código de artículo, las interfaces de RDO y ODBC pueden insertar estos valores automáticamente en la instrucción SQL en posiciones concretas dentro de la consulta.

Proporcionar parámetros

Los parámetros de la consulta se pueden proporcionar de diferentes maneras:

  • Directamente en la cadena de consulta SQL.
    "Select Name from Animals Where ID = 'Cat'"
  • Como texto concatenado o valores numéricos extraídos de un control TextBox, Label u otros controles.
    "Select Name from Animals Where ID = '"  _
& IDWanted.Text & "'"
  • Como marcador de posición de parámetro de signo de interrogación (?)
    "Select Name from Animals Where ID = ?"
  • Como marcador de posición de parámetro de signo de interrogación (?) en una llamada de procedimiento almacenado que acepte argumentos de entrada, de salida o de retorno de estado.
    "{ ? = Call MySP (?, ?, ?) }"

Nota Las llamadas a procedimientos almacenados que utilizan la sintaxis Call (como se muestra arriba) se ejecutan en su formato "nativo" por lo que no requieren que el Administrador de controladores ODBC realice el análisis y la conversión de datos. Por este motivo, la sintaxis Call puede ejecutarse algo más rápidamente que otras sintaxis.

Usar marcadores de parámetros

La única ocasión en la que debe usar marcadores de parámetros es en la ejecución de procedimientos almacenados que requieran argumentos de entrada, salida o retorno. Si el procedimiento almacenado sólo requiere argumentos de entrada, se pueden proporcionar en línea como valores concatenados en la consulta (como se muestra a continuación).

Cuando se hace referencia por primera vez (pero no antes) a la colección rdoParameters, RDO y la interfaz de ODBC preprocesan la consulta y crean un objeto rdoParameter para cada parámetro marcado. También puede crear consultas con múltiples parámetros y, en este caso, puede marcar algunos parámetros y proporcionar los otros escribiéndolos directamente o mediante concatenación. Sin embargo, todos los parámetros marcados deben aparecer a la izquierda de los demás parámetros. Si no se hace, se producirá un error interceptable que indica "Número de parámetros erróneo".

Nota Debido a la carga adicional que conlleva la creación y administración de los objetos rdoQuery y su colección rdoParameters, no debe usar consultas de parámetros para instrucciones SQL que no cambien de una ejecución a otra, especialmente aquellas que sólo se ejecutan una vez o con poca frecuencia.

Marcar parámetros

Cada parámetro de consulta que desee que administre RDO se debe indicar con un signo de interrogación (?) en el texto de la instrucción SQL y corresponde a un objeto rdoParameter al que se hace referencia por su número ordinal contando desde cero y de izquierda a derecha. Por ejemplo, para ejecutar una consulta que tiene un único parámetro de entrada, su instrucción SQL sería parecida a la siguiente:

SQL$ = "Select Au_LName, Au_FName where Au_ID Like ? "
Dim qd as rdoQuery, rd as rdoResultset
Set qd = CreateQuery ("SeekAUID", SQL$)
qd(0) = "236-66-%"
set rd = qd.OpenResultset(rdOpenForwardOnly)

Nota También puede crear un objeto rdoQuery mediante el Diseñador de consultas de conexión, y dar un nombre y establecer el tipo y la dirección de los parámetros individuales.

Parámetros aceptables

No todos los tipos de datos se pueden pasar como parámetros. Por ejemplo, no puede usar siempre el tipo datos TEXT o IMAGE como un parámetro OUTPUT. Además, si la consulta no requiere parámetros o no tiene parámetros en una llamada específica de la consulta, no puede usar paréntesis en la consulta. Por ejemplo, para un procedimiento almacenado que no requiera parámetros se podría usar un código como el siguiente:

"{ ? = Call MySP }"

Al realizar consultas que devuelven parámetros de salida, estos parámetros se deben enviar al final de la lista de los parámetros de la consulta. Aunque es posible proporcionar parámetros tanto marcados como sin marcar (incluidos en la línea), los parámetros de salida deben aparecer al final de la lista de parámetros.

Todos los parámetros incluidos se deben proporcionar a la derecha de los parámetros marcados. De lo contrario, RDO devuelve un error que indica "Número de parámetros erróneo".

RDO 2.0 admite tipos de datos BLOB como parámetros y también se puede usar el método AppendChunk con el objeto rdoParameter para pasar tipos de datos TEXT o IMAGE como parámetros a un procedimiento.

Identificar el tipo de datos del parámetro

Cuando ODBC procesa la consulta de parámetros, intenta identificar el tipo de datos de cada parámetro ejecutando funciones de ODBC que consultan al servidor remoto para obtener información específica acerca de la consulta. En algunos casos no se puede determinar correctamente el tipo de datos. En estos casos, utilice la propiedad Type para establecer el tipo de datos correcto o crear una consulta personalizada mediante el Diseñador de usuarios de conexión.

Por ejemplo, en la siguiente consulta, el parámetro pasado a la función Charindex de TSQL se escribe como un entero. Mientras que esto resulta correcto para la propia función, el parámetro hace referencia a un argumento de cadena de la función TSQL, por lo que debe establecerse como un tipo carácter de ODBC para que funcione correctamente.

Dim SQL as string, qd as rdoQuery
SQL = "Select * From Titles " _
    & "Where Charindex( ?,  Title) > 0
Set qd = cn.CreateQuery("FindTitle", SQL)
qd(0).Type = rdTypeChar

Nota No tiene que escribir los parámetros de texto entre comillas ya que lo maneja de forma automática la interfaz de la API de ODBC

Tratar argumentos de salida y estado de retorno

En algunos casos, un procedimiento almacenado devuelve un argumento de salida o estado de retorno en lugar de, o además de, las filas devueltas por una instrucción SELECT. Cada uno estos parámetros se debe marcar también con un signo de interrogación en la instrucción SQL. Mediante esta técnica puede marcar la posición de cualquier número de parámetros en la consulta SQL, incluyendo entrada, salida o entrada y salida.

Siempre que la consulta devuelva argumentos de salida o estado de retorno, debe usar la sintaxis CALL de ODBC al establecer la propiedad SQL del objeto rdoQuery. En este caso, una llamada típica al procedimiento almacenado podría ser como sigue:

Dim qd as rdoQuery, rd as rdoResultset, SQL as String
SQL = "{ ? = Call master..sp_password (?, ?) }"
Set qd = CreateQuery ("SetPassword", SQL)
qd.rdoParameters(0).Direction = rdParamReturnValue
qd(1) = "Fred"      ' la contraseña anterior
qd(2) = "George"   ' la contraseña nueva
set rd = qd.Execute
if qd(0) <> 0 then _
   MsgBox "Falló la operación"

Sugerencia Asegúrese de hacer referencia específicamente a los procedimientos almacenados que no residen en la base de datos activa (predeterminada). En este ejemplo, la base de datos predeterminada no es Master, donde se mantiene el procedimiento sp_password, por lo que se hace referencia específica a este procedimiento.

Cuando el control vuelve a su aplicación después de haberse ejecutado el procedimiento, los objetos rdoParameter designados como rdParamReturnValue, rdParamOutput o rdParamInputOutput contienen los valores del argumento devuelto. En el ejemplo presentado anteriormente, el estado de retorno está disponible si examina qd(0)después de que se haya ejecutado la consulta.

Usar otras propiedades

Mediante las propiedades de un objeto rdoParameter puede configurar un parámetro de consulta que se puede cambiar antes de ejecutar la consulta. Puede:

  • Usar el valor de la propiedad Direction para determinar si el parámetro es un parámetro de entrada, salida o entrada y salida, o un valor devuelto. En RDO 2.0, la propiedad Direction se establece normalmente de forma automática, por lo que no es necesario establecer este valor. Tampoco es necesario establecerlo para los parámetros de entrada, ya que es el valor predeterminado.

  • Usar el valor de la propiedad Type para determinar el tipo de datos del objeto rdoParameter. Los tipos de datos son idénticos a los especificados por la propiedad rdoColumn.Type. En algunos casos, RDO puede no ser capaz de determinar el tipo de datos correcto del parámetro. En estos casos, puede forzar un tipo de datos específico si establece la propiedad Type.

  • Usar la propiedad Value (la propiedad predeterminada de un objeto rdoParameter) para pasar valores a las consultas SQL que contienen marcadores de parámetro utilizados en los métodos rdoQuery.Execute o rdoQuery.OpenResultset. Por ejemplo:
    MiConsulta(0) = 5

Nota RDO requiere que el controlador ODBC que utilice admita una serie de opciones que cumplan con el nivel II y admita las funciones SQLNumParams, SQLProcedureColumns y SQLDescribeParam de la API de ODBC para poder crear la colección rdoParameters y analizar los marcadores de parámetro en instrucciones SQL. Aunque se pueden usar algunos controladores para crear y ejecutar consultas, si su controlador no admite la creación de la colección rdoParameters, RDO fallará de forma silenciosa y simplemente no creará la colección. Como resultado, cualquier referencia a la colección origina un error interceptable.

Referencias a los parámetros

De forma predeterminada, los miembros de la colección rdoParameters se denominan "Parametron", donde n es el número ordinal del objeto rdoParameter. Por ejemplo, si una colección rdoParameters tiene dos miembros, se denominan "Parametro0" y "Parametro1". Sin embargo, si utiliza el Diseñador de usuarios de conexión, puede especificar nombres para parámetros específicos.

Puesto que la colección rdoParameters es la colección predeterminada para el objeto rdoQuery, la referencia a los parámetros es sencilla. Suponiendo que ha creado un objeto rdoQuery referenciado como rdoQo, puede hacer referencia a la propiedad Value de sus objetos rdoParameter mediante:

  • Referencia al valor de la propiedad Name utilizando esta sintaxis:
    ' Referencia al parámetro PubDate
rdoQo("PubDate")

    - o bien -

    ' Referencia al parámetro PubDate
rdoQo!PubDate
  • Referencia a su posición ordinal en la colección rdoParameters utilizando esta sintaxis:
    ' Referencia al primer marcador de parámetro
rdoQo(0)


rdoParameters (Colección)

Una colección rdoParameters contiene todos los objetos rdoParameter de un objeto rdoQuery.

Comentarios

La colección rdoParameters proporciona información sólo sobre parámetros marcados de un objeto rdoQuery o un procedimiento almacenado. No puede anexar objetos o eliminar objetos de una colección rdoParameters.

Cuando se hace referencia por primera vez a la colección rdoParameters, RDO y la interfaz de ODBC analizan la consulta buscando los marcadores de parámetros: el signo de interrogación (?). Por cada marcador encontrado, RDO crea un objeto rdoParameter y lo sitúa en la colección rdoParameters. Sin embargo, si la consulta no se puede compilar o procesar de otra forma, no se crea la colección rdoParameters y el código generará un error interceptable que indica que el objeto no existe. En este caso, revise la consulta para ver si hay sintaxis incorrecta, permisos en los objetos subyacentes y la ubicación adecuada de los marcadores de parámetros.


Ejemplo del objeto rdoParameter, la colección rdoParameters y la propiedad Direction

Este ejemplo ejecuta un procedimiento almacenado en la base de datos 'Pubs’ de SQL Server. Se incluye aquí también el texto del procedimiento para que pueda reproducir este ejemplo en su equipo. El procedimiento almacenado espera que el código proporcione tres argumentos de entrada: una cadena para usarla en una expresión para elegir el título y dos números utilizados para elegir un intervalo de precios para los libros. El procedimiento devuelve el número de libros que pertenecen al intervalo y el precio máximo de los libros. También devuelve un conjunto de filas que contiene información detallada acerca de los libros.

Para establecer la conexión, suponemos que el nombre del servidor es "SEQUEL" y es Microsoft SQL Server; es decir, una conexión sin DSN. A continuación, utilizamos la sintaxis CALL de ODBC para preparar la consulta. Observe que cada parámetro está marcado con un signo de interrogación. Una vez marcado, la colección rdoParameters se utiliza para establecer la dirección para los parámetros de salida y valores devueltos y los valores iniciales para los parámetros de entrada. Aunque no vea la colección rdoParameters invocada específicamente, interprete que es la colección predeterminada del objeto rdoQuery de forma que las referencias se hagan de manera más simple sin incluir una referencia a la colección rdoParameters propiamente dicha.

Sub RunQuery_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim qd As New rdoQuery
Dim cl As rdoColumn
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

Set qd.ActiveConnection = cn
qd.SQL = "{ ? = Call ShowOutputRS (?,?,?,?,?) }"
qd(0).Direction = rdParamReturnValue
qd(4).Direction = rdParamOutput
qd(5).Direction = rdParamOutput
qd(1) = "c"
qd(2) = 5
qd(3) = 50

Set rs = qd.OpenResultset(rdOpenForwardOnly, _
    rdConcurReadOnly)

For Each cl In rs.rdoColumns
    Debug.Print cl.Name,
Next
Debug.Print

Do Until rs.EOF
    For Each cl In rs.rdoColumns
        Debug.Print cl.Value,
    Next
    rs.MoveNext
Debug.Print
Loop

Debug.Print "Resultado de SP="; qd(3)
Debug.Print "Devolver estado de SP="; qd(0)

rs.Close
qd.Close
cn.Close

End Sub

Éste es el procedimiento almacenado que se ejecuta en el ejemplo que se acaba de presentar.

CREATE PROCEDURE ShowOutputRS
(
   @Ser varChar(128),
   @PriceLow Integer,
   @PriceHigh Integer,
   @Hits Integer OUTPUT,
   @MaxPrice integer OUTPUT
)
AS
Select @MaxPrice = Max(Price) from Titles
where Charindex(@Ser, title) > 0
and price between @priceLow and @priceHigh

Select * from Titles
where Charindex(@Ser, title) > 0
and price between @priceLow and @PriceHigh

Select @Hits = @@RowCount

return @@ROWCOUNT


rdoPreparedStatement (Objeto)

Un objeto rdoPreparedStatement es una definición de consulta preparada.

Comentarios

Nota El objeto rdoPreparedStatement está obsoleto y sólo se mantiene por compatibilidad con versiones anteriores. Se debe reemplazar por el objeto rdoQuery. El objeto rdoQuery admite todas las propiedades y métodos del objeto rdoPreparedStatement. Por el contrario, el objeto rdoPreparedStatement sólo admite un subconjunto de las propiedades y métodos del objeto rdoQuery y ninguno de sus eventos.


rdoPreparedStatements (Colección)

Una colección rdoPreparedStatements contiene todos los objetos rdoPreparedStatement de un objeto rdoConnection.

Comentarios

Nota La colección rdoPreparedStatements está obsoleta y sólo se mantiene por compatibilidad con versiones anteriores. Se debe reemplazar por la colección rdoQueries. El objeto rdoQuery y la colección rdoQueries admiten todas las propiedades y métodos del objeto rdoPreparedStatement. Por el contrario, el objeto rdoPreparedStatement sólo admite un subconjunto de las propiedades y métodos del objeto rdoQuery y ninguno de sus eventos.

Nota RDO requiere que el controlador ODBC admita una serie de opciones que cumplan con el Nivel II y admita las funciones SQLNumParams, SQLProcedureColumns y SQLDescribeParam de la API de ODBC para poder crear la colección rdoParameters y analizar los marcadores de parámetros en instrucciones. SQL. Aunque se pueden usar algunos controladores para crear y ejecutar consultas, si su controlador no admite la creación de la colección rdoParameters, RDO fallará de forma silenciosa y simplemente no creará la colección.


rdoQueries (Colección)

Contiene objetos rdoQuery que se han agregado a la colección rdoQueries automáticamente a través del método CreateQuery o mediante el método Add.

Comentarios

Al usar el método CreateQuery del objeto rdoConnection se anexa automáticamente un objeto rdoQuery a la colección rdoQueries. También puede usar el método Add con la colección rdoQueries suministrando como argumento un objeto rdoQuery independiente.

Al usar el método Close con un objeto rdoQuery, se quita de la colección rdoQueries, pero el objeto permanece en la instancia. Si vuelve a establecer la propiedad ActiveConnection, puede asociar el objeto rdoQuery con otra conexión y usar el método Add para anexarlo a la colección rdoQueries.

No es necesario que un objeto rdoQuery sea miembro de la colección rdoQueries antes de que se pueda asociar a un objeto rdoConnection y usar con los métodos Execute u OpenResultset.


rdoQuery (Objeto)

Un objeto rdoQuery es una definición de consulta que puede incluir cero o más parámetros.

Comentarios

El objeto rdoQuery se utiliza para administrar consultas SQL que requieren el uso de parámetros de entrada, salida o entrada y salida. Básicamente, rdoQuery funciona como una instrucción SQL compilada. Cuando se trabaja con procedimientos almacenados o consultas que requieran el uso de argumentos que cambian de una ejecución a otra, puede crear un objeto rdoQuery para administrar los parámetros de la consulta. Si el procedimiento almacenado devuelve parámetros de salida o un valor devuelto, o si desea usar objetos rdoParameter para controlar los parámetros, debe usar un objeto rdoQuery para administrarlo. Por ejemplo, si ejecuta una consulta que incluya información proporcionada por el usuario como un intervalo de fechas o un código de artículo, RDO puede sustituir estos valores automáticamente en la instrucción SQL cuando se ejecute la consulta.

Nota El objeto rdoQuery reemplaza al objeto rdoPreparedStatement obsoleto. El objeto rdoQuery mantiene una interfaz similar a la de rdoPreparedStatement, pero agrega la capacidad de ser persistente en un proyecto de Visual Basic, lo que le permite crearlo y manipularlo en tiempo de diseño. Además, los objetos rdoQuery pueden o no estar preparados, lo que permite elegir el uso más adecuado de la consulta.

Crear objetos rdoQuery

Para crear un objeto rdoQuery, utilice el método CreateQuery que asocia el objeto rdoQuery a un objeto rdoConnection específico y lo agrega a la colección rdoQueries. Una vez creado, debe completar los parámetros requeridos mediante la colección rdoParameters y, a continuación, usar el método OpenResultset para crear conjuntos de resultados desde la consulta o el método Execute para simplemente ejecutar la consulta si no devuelve filas.

También puede usar el Diseñador de usuarios de conexión (CQD) para crear objetos rdoQuery en su proyecto. El CQD toma su consulta SQL y le permite especificar los tipos de datos para cada parámetro. Entonces inserta código apropiado en la aplicación para exponer estos procedimientos como métodos del objeto rdoQuery.

Nota Debido a la carga adicional que implica la creación y administración de los objetos rdoQuery y su colección rdoParameters, no debe usar consultas de parámetros para instrucciones SQL que no cambien de una ejecución a otra, especialmente aquellas que sólo se ejecutan una vez o con poca frecuencia.

Objetos rdoQuery independientes

Puede declarar un objeto rdoQuery independiente mediante la instrucción Dim como se indica a continuación:

Dim MiConsulta as New rdoQuery

Los objetos rdoQuery independientes no se asignan a un objeto rdoConnection específico, por lo que debe establecer la propiedad ActiveConnection antes de intentar ejecutar la consulta o usar el objeto OpenResultset con éste. Las propiedades CursorType y ErrorThreshold se establecen a partir de los valores predeterminados establecidos por el valor predeterminado de rdoEngine. Además, los nuevos objetos rdoQuery no se anexan automáticamente a la colección rdoQueries hasta que no utilice el método Add.

Por ejemplo, el código que se presenta a continuación crea un objeto rdoQuery, lo asocia a una conexión y lo ejecuta. A continuación, se asocia el objeto rdoQuery con una conexión diferente y se ejecuta de nuevo. El objeto de consulta es como un encapsulado de cualquier tipo de consulta y, por tanto, se puede ejecutar con cualquier tipo de conexión, siempre y cuando la instrucción SQL sea apropiada para la conexión.

Dim MyQuery As rdoQuery '
MyQuery.SQL = "Actualizar clientes " _
   & " Set LastTouched = GetDate()"
MyQuery.Prepared = False    'no prepararlo,
                           'sólo SQLExecDirect
'asumir que cnSomeConnection
'es un objeto rdoConnection o independiente
MyQuery.ActiveConnection = cnSomeConnection
MyQuery.Execute

MyQuery.ActiveConnection = cnOtherConnection
'cnOtherConnection es en una WAN, así que se puede
' incrementar el tiempo de espera de consulta para
' compensar
MYQuery.QueryTimeout = 120
MyQuery.Execute

Elegir la sintaxis SQL correcta

Al codificar la propiedad SQL de un objeto rdoQuery, puede elegir entre uno de tres estilos de sintaxis para codificar la consulta de parámetros:

  • Cadenas concatenadas: el código crea la instrucción SQL y sus parámetros mediante el operador de concatenación (&) de Visual Basic. Esta instrucción se puede pasar al argumento SQL del método OpenResultset o a la propiedad SQL del objeto rdoQuery. En este caso, una consulta de parámetros podría ser como ésta:
   sSQL = "Select Name, Age From Animals " _
   & " Where Weight > " & WeightWanted.Text _
   & " and Type = ' & TypeWanted.Text & "'"
  • Sintaxis SQL nativa: la sintaxis SQL utilizada por el servidor remoto. En este caso puede ejecutar su propia consulta o procedimiento almacenado y pasar parámetros por concatenación, mediante marcadores o ambos. RDO administra los parámetros marcados con marcadores de posición como objetos rdoParameter. Una consulta de parámetros podría ser como ésta:
    sSQL = "Select Au_LName from Authors" _
    & " Where Au_Fname = ?"

    – o bien –

    sSQL = "Execute MyStoredProc 'Arg1', 450, '"  _
    & Text1

    – o bien –

    sSQL = "Execute MyStoredProc ?, ?, ?"
  • Sintaxis CALL de ODBC: diseñada para llamar a procedimientos almacenados que devuelven parámetros de estado de retorno o salida En este caso, se puede definir un marcador de posición para cada parámetro de entrada, salida o entrada y salida que se asigna automáticamente a objetos rdoParameter. También puede combinar operadores concatenados como sea necesario. En este caso, una consulta de parámetros podría ser como ésta:
    sSQL = "{call ParameterTest (?,?,?) }"

    – o bien –

    sSQL = "{? = call ParameterTest (?,?,?) }"

    – o bien –

    sSQL = "{? = call CountAnimals (?, ?, 14, 'Cerdo')}

El objeto rdoQuery se administra estableciendo las siguientes propiedades y métodos.

  • Utilice la propiedad SQL para especificar una instrucción SQL parametrizada para ejecutar. También se puede usar el argumento name del método CreateQuery para proporcionar la cadena de consulta SQL.

  • Establezca los parámetros de la consulta mediante la colección rdoParameters del objeto rdoQuery.

  • Utilice la propiedad Prepared para indicar si se debe preparar el objeto rdoQuery a través de la función SQLPrepare de ODBC. Si es False, la consulta se ejecuta mediante la función SQLExecDirect.

  • Utilice la propiedad Type para determinar si la consulta selecciona filas de una tabla (consulta de selección) existente, realiza una acción (una consulta de acciones), contiene operaciones de acción y selección o representa un procedimiento almacenado.

  • Utilice el valor de la propiedad RowsetSize para determinar cuántas filas se almacenarán internamente en un búfer cuando se crea un cursor y cuántas se bloquearán cuando se utilice el bloqueo pesimista.

  • Utilice la propiedad KeysetSize para indicar el tamaño del búfer del conjunto de claves cuando se creen cursores.

  • Utilice la propiedad MaxRows para indicar el número máximo de filas que devolverá una consulta.

  • Utilice la propiedad RowsAffected para indicar cuántas filas se verán afectadas por una consulta de acciones.

  • Utilice la propiedad QueryTimeout para indicar cuánto debe esperar el administrador de controladores antes de detener una consulta y generar el evento QueryTimeout.

  • Utilice la propiedad BindThreshold para indicar la columna más grande que se enlazará automáticamente.

  • Utilice la propiedad ErrorThreshold para indicar el nivel de error que constituye un error interceptable.

  • Utilice la propiedad Updatable para ver si se puede actualizar el conjunto de resultados generado por un objeto rdoQuery.

  • Utilice el método OpenResultset para crear un objeto rdoResultset basado en los argumentos y propiedades OpenResultset del objeto rdoQuery.

  • Utilice el método Execute para ejecutar una consulta de acciones mediante SQL y otras propiedades de rdoQuery, incluyendo cualquier valor especificado en la colección rdoParameters.

  • Utilice la propiedad LogMessages para activar el seguimiento de ODBC.

Eventos del objeto rdoQuery

Cuando se manipula el objeto rdoQuery se producen los siguientes eventos, que se pueden usar para administrar las consultas asociadas con el rdoQuery o coordinar otros procesos en sus aplicaciones.

Nombre del evento | Descripción
QueryComplete | Se produce cuando se ha completado una consulta.
QueryTimeout | Se produce cuando ha transcurrido el periodo QueryTimeout y la consulta no ha comenzado a devolver filas.
WillExecute | Se produce antes de que se ejecute la consulta permitiendo cambios de última hora a SQL o impedir que se ejecute la consulta.

Cerrar el objeto rdoQuery

Utilice el método Close para cerrar un objeto rdoQuery, establezca la propiedad ActiveConnection a Nothing y quítelo de la colección rdoQueries. Sin embargo, aún se puede volver a asociar el objeto rdoQuery a otro objeto rdoConnection si establece su propiedad ActiveConnection a otro objeto rdoConnection. Se producirá un error interceptable si utiliza el método Execute o el método OpenResultset con un objeto rdoQuery cuya propiedad ActiveConnection está establecida a Nothing o a un objeto rdoConnection no válido.

Referencias a objetos rdoQuery

Los objetos rdoQuery son el medio preferido para enviar consultas de parámetros al servidor externo. Por ejemplo, puede crear una consulta Transact SQL parametrizada (como se utiliza en Microsoft SQL Server) y almacenarla en un objeto rdoQuery.

Haga referencia a un objeto rdoQuery mediante el valor de la propiedad Name utilizando la siguiente sintaxis. Puesto que la colección predeterminada del objeto rdoQuery es rdoParameters, todas las referencias no cualificadas al objeto rdoQuery hacen referencia a la colección rdoParameters. En estos ejemplos, suponga que ha creado un objeto rdoQuery llamado rdoQo utilizando la sintaxis Dim rdoQo as rdoQueries. Los dos primeros ejemplos hacen referencia al objeto rdoQuery denominado "MiConsulta".

rdoQo("MiConsulta")

– o bien –

rdoQo!MiConsulta

También puede hacer referencia a los objetos rdoQuery (y a la colección rdoPreparedStatements) por su posición en la colección rdoQueries utilizando esta sintaxis (donde n es el enésimo miembro de la colección rdoQueries comenzando desde cero):

rdoQo(n)


Ejemplo del objeto rdoQuery y la colección rdoQueries

Este ejemplo muestra la capacidad de RDO para establecer el tipo de datos de los argumentos individuales de una consulta. En este caso, se pasa como parámetro un argumento de la función CHARINDEX. Puesto que el controlador ODBC no reconoce este tipo de datos correctamente, simplemente lo cambiamos a CHAR antes de asignar un valor al parámetro. La consulta utiliza la sintaxis TSQL: no necesita usar la sintaxis CALL de ODBC pues no ejecuta ningún procedimiento almacenado basado en parámetros. Este ejemplo también crea una conexión sin DSN a un Microsoft SQL Server y utiliza la base de datos de ejemplo Pubs.

Private Sub Query1_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim qd As New rdoQuery
Dim cl As rdoColumn
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

Set qd.ActiveConnection = cn
qd.SQL = "Select * From Titles" _
    & " Where CharIndex( ?, Title) > 0"

qd(0).Type = rdTypeCHAR
qd(0) = InputBox("Escriba la cadena de búsqueda", , "C")

Set rs = qd.OpenResultset(rdOpenForwardOnly, rdConcurReadOnly)

For Each cl In rs.rdoColumns
    Debug.Print cl.Name,
Next
Debug.Print

Do Until rs.EOF
    For Each cl In rs.rdoColumns
        Debug.Print cl.Value,
    Next
    rs.MoveNext
Debug.Print
Loop
End Sub


rdoResultset (Objeto)

Un objeto rdoResultset representa las filas que devuelve la ejecución de una consulta.

Comentarios

Cuando utiliza objetos de datos remotos, interactúa con los datos casi por completo mediante objetos rdoResultset. Los objetos rdoResultset se crean con el control RemoteData o el método OpenResultset de un objeto rdoQuery, rdoTable o rdoConnection.

Al ejecutar una consulta que contiene una o más instrucciones SELECT de SQL, el origen de datos devuelve cero o más filas en un objeto rdoResultset. Todos los objetos rdoResultset se crean utilizando filas y columnas.

Un único rdoResultset puede contener cero o cualquier número de conjuntos de resultados, denominados conjuntos de resultados "múltiples". Una vez completado el procesamiento del primer conjunto de resultados del objeto rdoResultset, utilice el método MoreResults para descartar las filas actuales de rdoResultset y activar el siguiente objeto rdoResultset. Puede procesar filas individuales del nuevo conjunto de resultados de la misma forma que si procesara el primer objeto rdoResultset. Esto se puede repetir hasta que el método MoreResults devuelva False.

Al abrir el objeto se agrega automáticamente un nuevo objeto rdoResultset a la colección rdoResultsets y se quita automáticamente cuando se cierra.

Nota Las colecciones de RDO 1.0 se comportan de forma diferente a las colecciones de Objetos de acceso a datos (DAO). Cuando establece con Set una variable que contiene una referencia a un objeto RDO como rdoResultset, el objeto rdoResultset existente no se cierra ni se quita de la colección rdoResultsets. El objeto existente permanece abierto y sigue siendo miembro de su respectiva colección.

Por el contrario, las colecciones de RDO 2.0 no se comportan de esta forma. Cuando utiliza una instrucción Set para asignar una variable que contiene una referencia a un objeto RDO, el objeto existente sí se cierra y se quita de la colección asociada. Este cambio está diseñado para hacer más compatible RDO con DAO.

Procesar conjuntos de resultados múltiples

Cuando ejecuta una consulta que contiene más de una instrucción SELECT, debe usar el método MoreResults para descartar las filas actuales del objeto rdoResultset y activar cada objeto rdoResultset posterior. Se debe procesar o descartar cada una de las filas de rdoResultset antes de que se puedan procesar conjuntos de resultados posteriores. Para procesar las filas de un conjunto de resultados, utilice los métodos Move para desplazarse a filas individuales o el método MoveLast para situarse en la última fila del objeto rdoResultset. Puede usar los métodos Cancel o Close con los objetos rdoResultset que no se han procesado completamente.

Elegir un tipo de cursor

Puede elegir el tipo de objeto rdoResultset que desea crear mediante el argumento tipo del método OpenResultset: el valor predeterminado para Type es rdOpenForwardOnly para RDO y rdOpenKeyset para el control RemoteData. Si especifica rdUseNone en la propiedad CursorDriver, se crea un conjunto de resultados de tipo forward-only y de sólo lectura. Cada tipo de rdoResultset puede contener columnas de una o más tablas de una base de datos.

Hay cuatro tipos de objetos rdoResultset basados en el tipo de cursor que se crea para tener acceso a los datos:

  • rdoResultset de tipo forward-only: se puede tener acceso y actualizar las filas individuales del conjunto de resultados (cuando se utilizan cursores del servidor), pero el puntero de la fila actual sólo se puede mover hasta el final del objeto rdoResultset mediante el método MoveNext; no se admite otro método.

  • rdoResultset de tipo estatic: es una copia estática de un conjunto de filas que puede usar para buscar datos o generar informes. Los cursores estáticos pueden ser actualizables cuando utilizan la biblioteca de cursores ODBC o cursores del lado del servidor, dependiendo de qué controladores se admiten y si se pueden actualizar los datos de origen.

  • rdoResultset de tipo keyset: el resultado de una consulta que puede tener filas actualizables. El movimiento dentro del conjunto de claves no está restringido. Un objeto rdoResultset de tipo conjunto de claves es un conjunto dinámico de filas que puede usar para agregar, cambiar o eliminar filas de una tabla o tablas de una base de datos subyacente. Los miembros de un conjunto de claves rdoResultset son fijos.

  • rdoResultset de tipo dynamic: el resultado de una consulta que puede tener filas actualizables. Un rdoResultset de tipo dynamic es un conjunto dinámico de filas que puede usar para agregar, cambiar o eliminar filas de una tabla o tablas de una base de datos subyacente. Los miembros de un objeto rdoResultset de tipo dynamic no son fijos.

Disociar objetos rdoResultset

Cuando se utiliza la biblioteca de cursores por lotes del cliente, RDO le permite desconectar un objeto rdoResultset del objeto rdoConnection utilizado para llenar sus filas si establece la propiedad ActiveConnection a Nothing. Cuando está disociado, el objeto rdoResultset se convierte en una instantánea temporal estática de un cursor local. Se puede actualizar, y se pueden agregar nuevas filas y quitar filas de este objeto rdoResultset. Puede volver a asociar el rdoResultset si establece la propiedad ActiveConnection a otro (o el mismo) objeto rdoConnection. Una vez que se ha vuelto a conectar, puede usar el método BatchUpdate para sincronizar el objeto rdoResultset con una base de datos remota.

Para llevar a cabo este tipo de operación de actualización disociada, debe abrir el objeto rdoResultset utilizando un cursor rdOpenStatic y usar rdConcurBatch como opción de concurrencia.

Administrar propiedades y métodos del objeto rdoResultset

Puede usar los métodos y las propiedades del objeto rdoResultset para manipular datos y desplazarse por las filas de un conjunto de resultados. Por ejemplo, puede:

  • Usar la propiedad Type para indicar el tipo de objeto rdoResultset creado y la propiedad Updatable indica si puede cambiar o no las filas del objeto.

  • Usar las propiedades BOF y EOF para ver si el puntero de la fila actual está situado más allá del final del objeto rdoResultset o si no contiene filas.

  • Utilice el método MoveNext para volver a situar la fila actual en los objetos rdoResultset de tipo forward-only.

  • Usar las propiedades Bookmarkable, Transactions y Restartable para determinar si el objeto rdoResultset admite marcadores o transacciones, o se puede reiniciar.

  • Usar la propiedad LockEdits para determinar el tipo de bloqueo utilizado para actualizar el objeto rdoResultset.

  • Usar la propiedad RowCount para determinar cuántas filas están disponibles en el objeto rdoResultset. Si la propiedad RowCount devuelve -1, RDO no puede determinar cuántas filas se han procesado. Sólo cuando se desplaza a EOF la propiedad RowCount refleja el número de filas devueltas por la consulta. No todos los tipos de cursor admiten esta funcionalidad. La propiedad RowCount devuelve -1 si no está disponible.

  • Usar los métodos AddNew, Edit, Update y Delete para agregar nuevas filas o para modificar objetos rdoResultset actualizables. Utilice el método CancelUpdate para cancelar modificaciones pendientes.

  • Usar el método Requery para reiniciar la consulta utilizada para crear un objeto rdoResultset. Puede usar este método para volver a ejecutar una consulta parametrizada.

  • Usar el método MoreResults para completar el procesamiento del objeto rdoResultset actual y empezar el procesamiento del siguiente conjunto de resultados generado por una consulta. Utilice el método Cancel para terminar el procesamiento de todas las consultas pendientes cuando la consulta contiene más de una operación SQL. Cuando utiliza el método Close frente a un rdoResultset, todas las consultas pendientes se vacían y el rdoResultset se quita automáticamente de la colección rdoResultsets.

  • Usar el método Close para finalizar y liberar el objeto rdoResultset y quitarlo de la colección rdoResultsets.

Eventos del objeto rdoResultset

Al manipular el objeto rdoResultset se producen los siguientes eventos. Se pueden usar para administrar los conjuntos de resultados o para sincronizar otros procesos con las operaciones realizadas sobre el objeto rdoResultset.

Nombre del evento | Descripción
Associate | Se produce después de asociar una nueva conexión al objeto.
ResultsChange | Se produce después de cambiar el conjunto de filas actual (múltiples conjuntos de resultados).
Dissociate | Se produce después de que la conexión se establece a Nothing.
QueryComplete | Se produce después de que se ha completado una consulta.
RowStatusChange | Se produce después de que el estado de la fila actual ha cambiado después de una operación de modificación, eliminación o inserción.
RowCurrencyChange | Se produce después de que se vuelva a situar el puntero de la fila actual.
WillAssociate | Se produce antes de que se asocie una nueva conexión al objeto.
WillDissociate | Se produce antes de que se establezca una conexión a Nothing.
WillUpdateRows | Se produce antes de que se realice una actualización en el servidor.

Ejecutar varias operaciones en una conexión

Si existe un objeto rdoResultset sin llenar pendiente en un origen de datos que sólo admite una única operación en un objeto rdoConnection, no puede crear objetos rdoQuery o rdoResultset adicionales o usar el método Refresh en el objeto rdoTable antes de que el objeto rdoResultset se haya vaciado, cerrado o llenado totalmente. Por ejemplo, cuando se utiliza SQL Server 4.2 como origen de datos, no puede crear un objeto rdoResultset adicional hasta que vaya a la última fila del último conjunto de resultados del objeto rdoResultset actual. Para llenar el conjunto de resultados, utilice el método MoreResults para moverse a través de todos los conjuntos de resultados pendientes o utilice los métodos Cancel o Close en el rdoResultset para vaciar todos los conjuntos de resultados pendientes.

Tratar las condiciones de inicio y fin de archivo

Al crear un objeto rdoResultset, la fila actual se sitúa en la primera fila si existe alguna fila. Si no hay filas, el valor de la propiedad RowCount es 0 y los valores de las propiedades BOF y EOF son ambos True.

Nota Un objeto rdoResultset puede no ser actualizable, incluso si se ha solicitado un objeto rdoResultset actualizable. Si la base de datos, la tabla o la columna subyacentes no son actualizables, o si su usuario no tiene permiso de actualización, todo o parte del objeto rdoResultset puede ser de sólo lectura. Examine la propiedad Updatable de los objetos rdoConnection, rdoResultset y rdoColumn para determinar si el código puede modificar las filas.

Cerrar objetos rdoResultset

Utilice el método Close para quitar un objeto rdoResultset de la colección rdoResultsets, disociarlo de su conexión y liberar todos los recursos asociados. No se produce ningún evento cuando utiliza el método Close.

Al establecer la propiedad ActiveConnection a Nothing se quita el objeto rdoResultset de la colección rdoResultsets y se producen eventos, pero no se liberan los recursos del objeto. Al establecer la propiedad ActiveConnection del objeto rdoResultset a un objeto rdoConnection válido se vuelve a anexar el objeto rdoResultset a la colección rdoResultsets del objeto rdoConnection.

Referencias a objetos rdoResultset

La colección predeterminada de un objeto rdoResultset es la colección rdoColumns y la propiedad predeterminada de un objeto rdoColumn es Value. Puede simplificar el código aprovechando estas configuraciones predeterminadas. Por ejemplo, todas estas líneas de código establecen el valor de la columna PubID de la fila actual de un objeto rdoResultset:

MyRs.rdoColumns("PubID").Value = 99
MyRs("PubID") = 99
MyRs!PubID = 99
' Ésta es la primera columna
' devuelta por la instrucción SELECT...
MyRs(0) = 99

La propiedad Name de un objeto rdoResultset contiene los 255 primeros caracteres de la consulta utilizada para crear el conjunto de resultados, por lo que resulta a menudo poco adecuada como índice en la colección rdoResultsets, ya que se pueden crear varias consultas con la misma consulta SQL.

Puede hacer referencia a los objetos rdoResultset por su posición en la colección rdoResultsets utilizando esta sintaxis (donde n es el enésimo miembro de la colección rdoResultsets comenzando desde cero):

rdoResultsets(n)


Ejemplo del objeto rdoResultset y la colección rdoResultsets

El siguiente ejemplo ilustra la ejecución de una consulta de varios conjuntos de resultados. Aunque esta consulta utiliza tres instrucciones SELECT, sólo dos devuelven filas a la aplicación. La subconsulta utilizada en lugar de una combinación no pasa filas fuera del alcance de la propia consulta. También constituye un ejemplo de una consulta con parámetros sencilla que concatena los argumentos en lugar de usar un objeto rdoQuery para administrar la consulta. El método OpenResultset también se ejecuta de forma asíncrona: el código comprueba la finalización completa de la operación si examina la propiedad StillExecuting.

Private Sub ShowResultset_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim cl As rdoColumn
Dim SQL As String
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"

cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

SQL = "Select Au_Lname, Au_Fname" _
    & " From Authors A" _
    & " Where Au_ID in " _
    & " (Select Au_ID" _
    & "     from TitleAuthor TA, Titles T" _
    & "     Where TA.Au_ID = A.Au_ID" _
    & "     And TA.Title_ID = T.Title_ID " _
    & "     And T.Title Like '" _
    & InputBox("Escriba la cadena de búsqueda", , "C") & "%')" _
    & "Select * From Titles Where price > 10"

Set rs = cn.OpenResultset(SQL, rdOpenKeyset, _
    rdConcurReadOnly, rdAsyncEnable + rdExecDirect)

Debug.Print "Ejecutando ";
While rs.StillExecuting
    Debug.Print ".";
    DoEvents
Wend

Do
    Debug.Print String(50, "-")  _
   & "Procesando el conjunto de resultados " & String(50, "-")
    For Each cl In rs.rdoColumns
        Debug.Print cl.Name,
    Next
    Debug.Print

    Do Until rs.EOF
        For Each cl In rs.rdoColumns
            Debug.Print cl.Value,
        Next
        rs.MoveNext
    Debug.Print
    Loop
    Debug.Print "Número de filas="; rs.RowCount

Loop Until rs.MoreResults = False
End Sub


rdoResultsets (Colección)

La colección rdoResultsets contiene todos los objetos rdoResultset abiertos en un objeto rdoConnection.

Comentarios

Cuando se abre el objeto, se agrega automáticamente un nuevo rdoResultset a la colección rdoResultsets y se quita también automáticamente al cerrarlo. Pueden haber activos a la vez varios objetos rdoResultset.

Utilice el método Close para quitar un objeto rdoResultset de una colección rdoResultsets, disociarlo de su conexión y liberar todos los recursos asociados. No se produce ningún evento cuando se utiliza el método Close.

Al establecer la propiedad ActiveConnection a Nothing se quita el objeto rdoResultset de la colección rdoResultsets y se producen eventos, pero no se liberan los recursos del objeto. Al establecer la propiedad ActiveConnection del objeto rdoResultset a un objeto rdoConnection válido, se vuelve a anexar el objeto rdoResultset a la colección rdoResultsets del objeto rdoConnection.

Nota Las colecciones de RDO 1.0 se comportan de forma diferente a las colecciones de Objeto de acceso a datos (DAO). Cuando se establece con Set una variable que contiene una referencia a un objeto RDO como rdoResultset, el objeto rdoResultset existente no se cierra ni se quita de la colección rdoResultsets. El objeto existente permanece abierto y sigue siendo miembro de su respectiva colección.

Por el contrario, las colecciones de RDO 2.0 no se comportan de esta forma. Cuando utiliza una instrucción Set para asignar una variable que contiene una referencia a un objeto RDO, el objeto existente sí se cierra y se quita de la colección asociada. Este cambio está diseñado para hacer más compatible RDO con DAO.

Administrar la colección rdoResultsets

Cuando utiliza el método OpenResultset en un objeto rdoConnection o rdoQuery y asigna el resultado a un objeto rdoResultset existente, se mantiene el objeto existente y se anexa un nuevo objeto rdoResultset a la colección rdoResultsets. Si se realizan operaciones similares usando el motor de base de datos Microsoft Jet y los Objetos de acceso a datos (DAO), los conjuntos de registros existentes se cierran automáticamente cuando se asigna un valor a la variable, no estando permitido que dos miembros de la colección Recordsets tengan el mismo nombre. Por ejemplo, usando RDO:

Dim rs as rdoResultset
Dim cn as rdoConnection
Set cn = OpenConnection....
Set rs = cn.OpenResultset("Select * from Authors", _
    rdOpenStatic)
Set rs = cn.OpenResultset("Select * from Titles", _
    rdOpenDynamic)

Este código abre dos objetos rdoResultset distintos; ambos se almacenan en la colección rdoResultsets. Después de ejecutar este código, la segunda consulta, que se almacena en rdoResultsets(1), se asigna a la variable rdoResultset rs. La primera consulta está disponible y su cursor está todavía disponible mediante la referencia rdoResultsets(0). Debido a esta implementación, más de un miembro de la colección rdoResultsets puede tener el mismo nombre.

Este comportamiento le permite conservar objetos rdoResultset existentes, que se encuentran en la colección rdoResultsets, o cerrarlos cuando sea necesario. Es decir, tiene que cerrar explícitamente todos los objetos rdoResultset que ya no sean necesarios. La simple asignación de otro objeto rdoResultset a una variable de tipo rdoResultset no tiene efecto sobre el objeto rdoResultset existente mencionado anteriormente por la variable. Observe que los procedimientos y otros objetos temporales creados para administrar el objeto rdoResultset se mantienen en el servidor remoto siempre y cuando el rdoResultset permanezca abierto.

Si escribe una aplicación que no cierre cada rdoResultset antes de abrir objetos rdoResultset adicionales, el número de procedimientos mantenidos en TempDB o en cualquier otra parte del servidor se incrementa cada vez que se abre otro objeto rdoResultset. Además, estos conjuntos de resultados podrían necesitar muchos recursos del cliente o el servidor para almacenar conjuntos de claves o valores de filas. Con el tiempo, este comportamiento puede desbordar la capacidad de los recursos del servidor o de la estación de trabajo.


rdoTable (Objeto)

Un objeto rdoTable representa la definición almacenada de una tabla base o de una vista SQL.

Comentarios

Nota No se aconseja el uso del objeto rdoTable y la colección rdoTables para administrar o inspeccionar la estructura de las tablas de la base de datos. Este objeto se mantiene por compatibilidad con versiones anteriores y puede no estar disponible en versiones futuras de Visual Basic o RDO.

Puede asignar una definición de tabla mediante un objeto rdoTable y determinar las características de un objeto rdoTable mediante sus métodos y propiedades. Por ejemplo, puede:

  • Examinar las propiedades de columna de cualquier tabla de una base de datos ODBC. (Observe que todas las propiedades del objeto rdoTable son de sólo lectura.)

  • Usar el método OpenResultset para crear un objeto rdoResultset basado en todas las filas de la tabla base

  • Usar la propiedad Name para determinar el nombre de la tabla o la vista.

  • Usar la propiedad RowCount para determinar el número de filas de la tabla o la vista. Si se hace referencia a la propiedad RowCount, se completa la consulta como si se hubiera usado el método MoveLast.

  • Usar la propiedad Type para determinar el tipo de tabla. El controlador de origen de datos ODBC determina los tipos de tabla admitidos.

  • Usar la propiedad Updatable para determinar si la tabla permite cambios en los datos.

No puede hacer referencia a los objetos rdoTable antes de haber llenado la colección rdoTables ya que ésta no se puebla automáticamente al conectarse con un origen de datos. Para llenar la colección rdoTables, utilice el método Refresh o haga referencia a miembros individuales de la colección por su número ordinal.

Al usar el método OpenResultset con un objeto rdoTable, RDO ejecuta una consulta "SELECT * FROM tabla" que devuelve todas las filas de la tabla usando el tipo de cursor especificado. De manera predeterminada se crea un cursor de tipo forward-only.

No puede definir nuevas tablas ni cambiar la estructura de las tablas existentes mediante RDO o el control RemoteData. Para cambiar la estructura de una base de datos o realizar otras funciones administrativas, utilice consultas SQL o las herramientas de mantenimiento que proporciona la base de datos.

La colección predeterminada de un objeto rdoTable es rdoColumns. La propiedad predeterminada de un objeto rdoTable es Name. Puede simplificar el código aprovechando estos valores predeterminados. Por ejemplo, las siguientes instrucciones son idénticas ya que ambas muestran el número correspondiente al tipo de datos de columna de un objeto rdoTable mediante un control RemoteData:

Print RemoteData1.Connection.rdoTables _
   ("Publishers").rdoColumns("PubID").Type
Print RemoteData1.Connection("Publishers"). _
   ("PubID").Type

La propiedad Name de un objeto rdoTable no es igual que el nombre de la variable de objeto a la que se asigna, sino que se deriva del nombre de la tabla base de la base de datos

Haga referencia a un objeto rdoTable estableciendo su propiedad Name mediante la sintaxis siguiente:

rdoTables("Authors")   'Hace referencia a la tabla Authors

– o bien –

rdoTables!Authors      'Hace referencia a la tabla Authors

También puede hacer referencia a los objetos rdoTable por su posición en la colección rdoTables mediante esta sintaxis (donde n es el miembro enésimo de la colección rdoTables comenzando desde cero):

rdoTables(n)


rdoTables (Colección)

La colección rdoTables contiene todos los objetos rdoTable almacenados en una base de datos.

Comentarios

Nota No se aconseja el uso del objeto rdoTable y de la colección rdoTables para administrar o inspeccionar la estructura de la base de datos o de las tablas. Este objeto se mantiene por compatibilidad con versiones anteriores y puede no estar disponible en versiones futuras de Visual Basic

Por razones de rendimiento, no puede hacer referencia a un objeto rdoTable antes de haber llenado la colección rdoTables ya que no se puebla de forma automática cuando se conecta a un origen de datos. Para llenar la colección rdoTables, utilice el método Refresh o haga referencia a miembros individuales de la colección por su número ordinal. Dependiendo del número de tablas de la base de datos, puede tardar bastante.


AbsolutePosition (Propiedad, datos remotos)

Devuelve o establece el número de fila absoluto de la fila actual de un objeto rdoResultset.

Sintaxis

objeto.AbsolutePosition [= valor]

La sintaxis de la propiedad AbsolutePosition consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un valor de tipo Long entre -1 y el número máximo de filas del objeto rdoResultset. Corresponde a la posición ordinal de la fila actual en el objeto rdoResultset especificado por objeto. El valor predeterminado es -1.

Comentarios

Utilice la propiedad AbsolutePosition para situar el puntero de fila actual en una fila específica, basándose en su posición ordinal en un objeto rdoResultset de tipo keyset o static. No puede usarse con objetos rdoResultset de tipo dynamic o forward-only. Aunque en el caso de un cursor dinámico se obtiene un valor, éste no es necesariamente exacto. En general, la propiedad Bookmarkable del objeto rdoResultset debe ser True para que puedan usarse los valores de AbsolutePosition.

También puede determinar el número de la fila actual si comprueba el valor de la propiedad AbsolutePosition. Por ejemplo, si ha llenado 10 filas de un objeto rdoResultset de 50 filas, la propiedad AbsolutePosition devolverá el valor 10. Si ejecuta el método MoveLast sobre el conjunto de resultados, AbsolutePosition devolverá el valor 50. Ahora puede establecer la propiedad AbsolutePosition a cualquier valor entre 1 y 50 para situar el puntero de fila actual en esa fila.

Los valores de la propiedad AbsolutePosition comienzan en -1, por lo que el valor 1 se refiere a la primera fila del objeto rdoResultset. Si se establece un valor mayor que el número de filas llenas, RDO se situará en la última fila del conjunto de resultados (EOF).

Si no hay ninguna fila actual, como ocurre cuando el objeto rdoResultset no contiene filas, se devuelve el valor -1. Si se elimina la fila actual, el valor de AbsolutePosition queda indefinido y se producirá un error interceptable en caso de que se haga referencia a él. Las nuevas filas se agregan al final de la secuencia cuando el tipo de cursor incluye pertenencia dinámica.

Nota El propósito de esta propiedad no es servir como un número de fila alternativo. El uso de marcadores sigue siendo el método recomendado para conservar y devolver una posición determinada de un cursor. Además, no se asegura que una fila vaya a conservar la misma posición absoluta si se vuelve a crear el objeto rdoResultset, pues el orden y la pertenencia de las filas individuales de un objeto rdoResultset pueden variar entre las distintas ejecuciones.


Ejemplo de la propiedad AbsolutePosition

En el ejemplo siguiente se utiliza la base de datos Pubs de SQL Server para ilustrar el uso de la propiedad AbsolutePosition como índice de letra secundario de un conjunto de filas. El programa empieza obteniendo el nombre y el Id. de todos los editores de un control ComboBox desplegable. Inicialmente, y cuando se elige un editor específico en el control ComboBox, se obtiene de la tabla Titles el conjunto de títulos correspondiente. Para ello se crea una consulta con el método de concatenación y se asigna a la propiedad SQL del control RemoteData. El control RemoteData tiene asociado un control DataGrid, que reflejará el conjunto de títulos que corresponde al editor elegido. En el proceso de llenado del conjunto de resultados, la primera letra de cada título se coloca en una matriz junto con el valor de AbsolutePosition para la fila. Al elegir una letra y hacer clic en el botón MoveToRow, la propiedad AbsolutePosition del control RemoteData se establece al valor asociado a la letra.

Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim rs As rdoResultset
Dim LetterIndex() As Long

Private Sub Form_Load()
Dim Li As Integer
'
'   Abrir la conexión. Se trata de una conexión sin DSN
'
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=SEQUEL;database=pubs;")

MsRdc1.Connect = cn.Connect

'
'   Llenar el cuadro con la lista de editores.
'
Set rs = cn.OpenResultset _
    ("Select distinct Pub_Name, Pub_ID" _
   & " from Publishers",  _
   rdOpenStatic, rdConcurReadOnly)
Do Until rs.EOF
    If rs(0) = Null Then
    Else
        PubList.AddItem " " _
         & rs!Pub_ID & ":" & rs!Pub_Name
    End If
    rs.MoveNext
Loop
PubList.ListIndex = 1
rs.Close

PubList_Click ' Realizar la primera consulta

End Sub

Sub GetLetterIndexes()
'
'   Crear una matriz de índices para la primera
'   aparición de una letra en la lista de
'   títulos. Guardar un valor de AbsolutePosition
'   para cada letra.

ReDim LetterIndex(122) As Long
Screen.MousePointer = vbHourglass

Set rs = MsRdc1.Resultset
Do Until rs.EOF
    Li = Convert(Left$(rs!Title, 1))
    If LetterIndex(Li) = 0 Then
        LetterIndex(Li) = rs.AbsolutePosition
    End If
    rs.MoveNext
Loop

Screen.MousePointer = vbDefault
End Sub
'
'   Situar el objeto rdoResultset del control RemoteData
'   en la primera fila de la letra elegida, según
'   el valor de AbsolutePosition
'
Private Sub MoveToRow_Click()
Dim i
i = Convert(LetterWanted)
If LetterIndex(i) > 0 Then
    MsRdc1.Resultset.AbsolutePosition = LetterIndex(i)
Else
    LetterWanted = "(No se ha encontrado)"
    Beep
    For i = i + 1 To Asc("z")
        If LetterIndex(i) > 0 Then
            MsRdc1.Resultset.AbsolutePosition = _
                  LetterIndex(i)
            LetterWanted = Chr(i + 64)
            Exit For
        End If
    Next i
End If
End Sub

Private Function Convert(Li As String) As Integer
Dim i As Integer
i = Asc(Li) ' Sólo la primera letra
Select Case i
    Case Is < 65: Convert = 0
    Case Is > 122: Convert = 58
    Case Else: Convert = i - 64
End Select
End Function
'
'   Obtener la lista de títulos
'   de este editor
'
Private Sub PubList_Click()
Dim PubWanted As String
'   Obtener el identificador
'
'   Crear la consulta SQL según el
'   editor elegido
'
PubWanted = Trim(Left(PubList,
   InStr(PubList, ":") - 1))
Screen.MousePointer = vbHourglass

MsRdc1.SQL = "select * from Titles" _
    & " where Pub_ID = '" _
    & PubWanted & "'" _
    & " order by Title"
MsRdc1.Refresh
Screen.MousePointer = vbDefault
If MsRdc1.Resultset.EOF Then
    MoveToRow.Enabled = False
Else
    MoveToRow.Enabled = True
    GetLetterIndexes
    MsRdc1.Resultset.MoveFirst
End If
End Sub


ActiveConnection (Propiedad)

Devuelve o establece una referencia de objeto que indica la conexión con la que debe asociarse esta consulta.

Sintaxis

objeto.ActiveConnection [= valor]

La sintaxis de la propiedad ActiveConnection consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión que da como resultado un rdoConnection válido o un objeto derivado. valor es de forma predeterminada el rdoConnection usado para crear el objeto o Nothing.

Comentarios

La propiedad ActiveConnection mantiene una referencia a la conexión asociada con el objeto rdoQuery o rdoResultset. Todas las instrucciones de la base de datos ejecutadas por el objeto se ejecutan con esta conexión.

Cuando trabaja con un objeto rdoQuery, la propiedad ActiveConnection puede establecerse a Nothing que disocia el objeto de una conexión específica. Puede volver a asociar posteriormente el objeto rdoQuery a otro objeto rdoConnection si establece el objeto ActiveConnection. Con esta técnica, una consulta puede ejecutarse en un conjunto de conexiones.

Cuando se trabaja con objetos rdoResultset y la biblioteca de cursores por lotes del cliente, puede establecer la propiedad ActiveConnection a Nothing. En este caso, si el conjunto de resultados se crea con un cursor estático y la opción de concurrencia rdConcurBatch, los datos de rdoResultset todavía están disponibles y puede realizar cambios o incorporaciones al conjunto de resultados. Una vez que haya establecido ActiveConnection a un objeto rdoConnection abierto, puede usar el método BatchUpdate para enviar estos cambios a la base de datos remota.


Ejemplo de la propiedad ActiveConnection

El ejemplo siguiente ilustra el uso de la propiedad ActiveConnection para seleccionar un rdoConnection. En este caso, la aplicación abre dos conexiones diferentes y utiliza en ellas el mismo rdoQuery.

Dim rdoCn As New rdoConnection
Dim rdoCn2 As New rdoConnection
Dim rdoQy As New rdoQuery
Dim rdoRs As rdoResultset
Dim rdoCol As rdoColumn
Dim rdoEn As rdoEnvironment

Private Sub Form_Load()
On Error GoTo CnEh

Set rdoEn = rdoEnvironments(0)

With rdoCn

    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=Betav486;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True
    rdoEn.rdoConnections.Add rdoCn
End With

With rdoCn2
    .Connect = "UID=;PWD=;Database=Pubs;" _
        & "Server=Betav486;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True
    rdoEn.rdoConnections.Add rdoCn2
End With

With rdoQy
    Set .ActiveConnection = rdoCn
    .SQL = "Select Name, refDate " _
      & " from Sysobjects where type = 'U' "
    .LockType = rdConcurReadOnly
    .RowsetSize = 1
    .CursorType = rdUseServer
End With

For Each rdoCn In rdoEn.rdoConnections
    Set rdoQy.ActiveConnection = rdoCn
    Set rdoRs = rdoQy.OpenResultset(rdOpenForwardOnly)
    With rdoRs
        For Each rdoCol In rdoRs.rdoColumns
            Debug.Print rdoCol.Name,
        Next
        Debug.Print
        Do Until rdoRs.EOF
                For Each rdoCol In rdoRs.rdoColumns
                    Debug.Print rdoCol
                Next
            rdoRs.MoveNext
        Loop
    End With
Next                    ' Próxima conexión

Exit Sub
CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next
End Sub


Ejemplo de los métodos AddNew, Update y CancelUpdate

El ejemplo siguiente muestra el uso del método AddNew para agregar nuevas filas a una tabla base. Este ejemplo asume que tiene permiso de lectura y escritura para la tabla, que la columna de datos proporcionada cumple las reglas y otras restricciones asociadas con la tabla, y que hay un índice único para la tabla. Los valores de los datos para la operación se toman de tres controles TextBox del formulario. Tenga en cuenta que la clave única para esta tabla no se establece aquí y se proporciona automáticamente, es una columna identidad.

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub AddNewJob_Click()
On Error GoTo ANEH

With rs
   .AddNew
   !job_desc = JobDescription
   !min_lvl = MinLevel
   !max_lvl = MaxLevel
   .Update
End With
Exit Sub

UpdateFailed:
MsgBox "La actualización no ha tenido éxito."
rs.CancelUpdate
Exit Sub
A
NEH:
Debug.Print Err, Error
For Each er In rdoErrors
   Debug.Print er
Next
Resume UpdateFailed

End Sub

Private Sub Form_Load()

cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection
With qy
   .Name = "JobsQuery"
   .SQL = "Select * from Jobs"
   .RowsetSize = 1
   Set .ActiveConnection = cn
   Set rs = .OpenResultset(rdOpenKeyset, _
      rdConcurRowver)
   Debug.Print rs.Updatable
End With

Exit Sub
End Sub


AllowZeroLength (Propiedad, datos remotos)

Devuelve un valor que indica si la cadena de longitud cero ("") es válida para la propiedad Value de un objeto rdoColumn con tipo de datos rdTypeCHAR, rdTypeVARCHAR o rdTypeLONGVARCHAR.

Sintaxis

objeto.AllowZeroLength

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad AllowZeroLength son los siguientes:

Valor | Descripción
True | La cadena de longitud cero es un valor válido.
False | La cadena de longitud cero no es un valor válido.

Comentarios

Si AllowZeroLength es False para una columna, deberá usar Null para representar los estados "desconocidos" en lugar de cadenas vacías.


Ejemplo de los métodos AppendChunk y GetChunk

Este ejemplo muestra el uso de los métodos AppendChunk y GetChunk para escribir datos de objetos binarios grandes basados en páginas (BLOB) en un origen de datos remoto. El código espera una tabla con un carácter, texto y un campo de imagen llamado Chunks. Para crear esta tabla, realice lo siguiente como una consulta de acciones sobre su base de datos de prueba:

CREATE TABLE Chunks (ID integer identity NOT NULL, PName char(10) NULL,
Description TEXT NULL,
Photo IMAGE NULL)
CREATE UNIQUE INDEX ChunkIDIndex on Chunks(ID)

Una vez que ha creado la tabla, necesitará encontrar uno o más .BMP o cualquier imagen gráfica disponible que se pueda cargar en un control PictureBox.

'
Option Explicit
Dim en As rdoEnvironment
Dim Qd As rdoQuery
Dim Cn As rdoConnection
Dim Rs As rdoResultset
Dim SQL As String
Dim DataFile As Integer, Fl As Long, Chunks As Integer
Dim Fragment As Integer, Chunk() As Byte, I As Integer
Const ChunkSize As Integer = 16384

Private Sub Form_Load()
Set en = rdoEnvironments(0)
Set Cn = en.OpenConnection(dsname:="", _
   Connect:="UID=;PWD=;DATABASE=WorkDB;" _
   & "Driver={SQL Server};SERVER=Betav486", _
   prompt:=rdDriverNoPrompt)
Set Qd = Cn.CreateQuery("TestChunk", "Select * from
   Chunks Where PName = ? ")
End Sub

Private Sub LoadFromFile_Click()
'
'  Encuentra un archivo y establece Filename para este archivo.
'
With CommonDialog1
   .Filter = "Imágenes(*.bmp;*.ico)|*.bmp;*.ico"
   .ShowOpen
   FileName = .FileName
End With
End Sub

Private Sub ReadFromDB_Click()
If Len(NameWanted) = 0 Then _
   NameWanted = InputBox("Escriba el nombre que desee", "Animal")
   Qd(0) = NameWanted
   Set Rs = Qd.OpenResultset(rdOpenKeyset,
   rdConcurRowver)
If Rs Is Nothing Or Rs.Updatable = False Then
   MsgBox "Imposible abrir o escribir el conjunto de resultados"
   Exit Sub
End If
If Rs.EOF Then
   MsgBox "Imposible encontrar la imagen con este nombre"
   Exit Sub
End If
Description = Rs!Description
DataFile = 1
Open "pictemp" For Binary Access Write As DataFile
Fl = Rs!Photo.ColumnSize
Chunks = Fl \ ChunkSize
Fragment = Fl Mod ChunkSize
ReDim Chunk(Fragment)
Chunk() = Rs!Photo.GetChunk(Fragment)
Put DataFile, , Chunk()
For I = 1 To Chunks
ReDim Buffer(ChunkSize)
Chunk() = Rs!Photo.GetChunk(ChunkSize)
Put DataFile, , Chunk()
Next I
Close DataFile
FileName = "pictemp"
End Sub

Private Sub SaveToDB_Click()
If Len(NameWanted) = 0 Then _
NameWanted = InputBox("Escriba el nombre para" _
& " esta imagen", "Animal")
Qd(0) = NameWanted
Set Rs = Qd.OpenResultset(rdOpenKeyset, _
rdConcurRowver)
If Rs Is Nothing Or Rs.Updatable = False Then
MsgBox "Imposible abrir o escribir el conjunto de resultados"
Exit Sub
End If
If Rs.EOF Then
Rs.AddNew
Rs!PName = NameWanted
If Description = "" Then  _
Description = InputBox("Describa la imagen", _
"No se preocupe")
'Rs!Description = Description
Else
Rs.Edit
End If
DataFile = 1
Open FileName For Binary Access Read As DataFile
Fl = LOF(DataFile)    ' Longitud de los datos en el archivo
If Fl = 0 Then Close DataFile: Exit Sub
Chunks = Fl \ ChunkSize
Fragment = Fl Mod ChunkSize
Rs!Photo.AppendChunk Null
ReDim Chunk(Fragment)
Get DataFile, , Chunk()
Rs!Photo.AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For I = 1 To Chunks
Get DataFile, , Chunk()
Rs!Photo.AppendChunk Chunk()
Next I
Close DataFile
Rs.Update
End Sub

Private Sub FileName_Change()
Picture1.Picture = LoadPicture(FileName)
End Sub


AsyncCheckInterval (Propiedad, datos remotos)

Devuelve o establece un valor que especifica el número de milisegundos que espera RDO entre dos comprobaciones para ver si se ha completado una consulta asíncrona.

Sintaxis

objeto.AsyncCheckInterval [= valor]

La sintaxis de la propiedad AsyncCheckInterval consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Long, según se describe en Comentarios.

Comentarios

Al usar la opción rdAsyncEnable para ejecutar una consulta de forma asíncrona, RDO comprueba periódicamente el origen de datos para determinar si la consulta se ha completado. Puede modificar la duración del intervalo entre comprobaciones mediante la propiedad AsyncCheckInterval. RDO también comprueba el estado de las consultas asíncronas cuando se examina la propiedad StillExecuting.

El valor predeterminado de la propiedad AsyncCheckInterval es 1000 milisegundos (una vez por segundo).

Una comprobación demasiado frecuente puede afectar negativamente tanto al rendimiento del servidor como al de la estación de trabajo. Una comprobación menos frecuente puede mejorar el rendimiento, pero puede afectar a la disponibilidad de los datos para el usuario.

Mientras se ejecuta la consulta asíncrona, la propiedad StillExecuting devuelve True. Una vez completada la consulta, StillExecuting se establece a False y se activa el evento QueryComplete. También puede interrumpir y terminar una consulta asíncrona con el método Cancel o Close del objeto rdoResultset.


Attributes (Propiedad, datos remotos)

Devuelve un valor que indica una o más características de un objeto rdoColumn.

Sintaxis

objeto.Attributes

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad Attributes devuelve un valor que especifica las características de la columna representada por el objeto rdoColumn y puede ser una suma de las constantes siguientes:

Constante | Valor | Descripción
rdFixedColumn | 1 | El tamaño de columna es fijo (opción predeterminada para las columnas numéricas). Por ejemplo, Char, Binary.
rdVariableColumn | 2 | El tamaño de columna es variable. Por ejemplo, columnas VarChar y LongVarChar, VarBinary y LongVarBinary.
rdAutoIncrColumn | 16 | El valor de la columna se incrementa automáticamente en las nuevas filas a un valor único que no puede cambiarse.
rdUpdatableColumn | 32 | El valor de la columna puede cambiarse.
rdTimeStampColumn | 64 | La columna contiene un valor de marca de hora. Este atributo sólo se establece para los cursores rdClientBatch.

Comentarios

Al comprobar el valor de esta propiedad debe usar el operador And para examinar un atributo específico. La comparación con valores absolutos puede comprometer la compatibilidad en el futuro. Por ejemplo, para determinar si un objeto rdoColumn tiene tamaño fijo, puede usar código similar al siguiente:

If MiResultset![NombreColumna].Attributes And rdFixedColumn Then...


BatchCollisionCount (Propiedad)

Devuelve un valor que especifica el número de filas que no finalizaron la última actualización por lotes.

Sintaxis

objeto.BatchCollisionCount

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto de la propiedad BatchCollisionCount es una expresión de tipo Long que especifica el número de filas fallidas o 0 si se han procesado todas.

Comentarios

Esta propiedad indica el número de filas que encontraron colisiones o no pudieron actualizarse durante el último intento de actualización por lotes. El valor de esta propiedad se corresponde con el número de marcadores de la matriz BatchCollisionRows.

Si se establece la propiedad Bookmark del objeto rdoResultset sobre el que se trabaja a los valores de marcador contenidos en la matriz BatchCollisionRows, puede situarse en cada una de las filas que no pudieron actualizarse en la última operación BatchUpdate.

Una vez corregidas las filas que tuvieron colisiones, puede invocarse de nuevo el método BatchUpdate. Al hacerlo, RDO intenta otra actualización por lotes y la propiedad BatchCollisionRows volverá a reflejar el conjunto de filas para las que el segundo intento ha fracasado. Las filas que se han actualizado correctamente en un intento no se envían en el siguiente, ya que su propiedad Status tendrá el valor rdRowUnmodified. Este proceso puede continuar mientras se produzcan colisiones o hasta que se abandonen las actualizaciones y se cierre el conjunto de resultados.


BatchCollisionRows (Propiedad)

Devuelve una matriz de marcadores que indica las filas que han provocado colisiones en la última operación de actualización por lotes.

Sintaxis

objeto.BatchCollisionRows

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto de la propiedad BatchCollisionRows es una expresión de tipo Variant (cadena), según se describe en Comentarios.

Comentarios

Esta propiedad contiene una matriz de marcadores de las filas que han provocado una colisión la última vez que se invocó el método BatchUpdate. El número de elementos de esta matriz es el que indica la propiedad BatchCollisionCount.

Si se establece la propiedad Bookmark del objeto rdoResultset sobre el que se trabaja a los valores de marcador contenidos en la matriz BatchCollisionRows, puede situarse en cada una de las filas que no pudieron actualizarse en la última operación BatchUpdate.

Una vez corregidas las filas que tuvieron colisiones, puede invocarse de nuevo el método BatchUpdate. Al hacerlo, RDO intenta otra actualización por lotes y la propiedad BatchCollisionRows volverá a reflejar el conjunto de filas para las que el segundo intento ha fracasado. Las filas que se han actualizado correctamente en un intento no se envían en el siguiente, ya que su propiedad Status tendrá el valor rdRowUnmodified. Este proceso puede continuar mientras se produzcan colisiones o hasta que se abandonen las actualizaciones y se cierre el conjunto de resultados.

La matriz se vuelve a crear cada vez que se ejecuta el método BatchUpdate.


BatchConflictValue (Propiedad)

Devuelve el valor que hay actualmente en la base de datos, que es posterior al que indica la propiedad Value y que por ello ha provocado un conflicto en una actualización optimista por lotes.

Sintaxis

objeto.BatchConflictValue

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto de la propiedad BatchConflictValue es una expresión de tipo Variant (cadena), según se describe en Comentarios.

Comentarios

Esta propiedad contiene el valor de la columna que hay actualmente en la base de datos del servidor. Durante una actualización optimista por lotes, puede producirse una colisión si un segundo cliente ha modificado la misma columna y fila en el intervalo que va desde que el primer cliente obtuvo los datos a su intento de actualización. Cuando se produce esta circunstancia, a través de esta propiedad se podrá tener acceso al valor que ha establecido el segundo cliente.


BatchSize (Propiedad)

Devuelve o establece un valor que especifica el número de instrucciones enviadas al servidor en cada lote.

Sintaxis

objeto.BatchSize [= valor]

La sintaxis de la propiedad BatchSize consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el número de instrucciones enviadas al servidor en cada lote. El valor predeterminado es 15.

Comentarios

Esta propiedad determina el tamaño del lote de instrucciones enviado al servidor durante una actualización optimista por lotes. El valor de la propiedad determina el número de instrucciones enviadas al servidor en un búfer de comandos. De forma predeterminada se envían 15 instrucciones al servidor en cada lote. Esta propiedad puede modificarse en cualquier momento. Si un DBMS no admite lotes de instrucciones, puede establecer esta propiedad a 1, con lo que cada instrucción se enviará por separado.


BindThreshold (Propiedad)

Devuelve o establece un valor que especifica la mayor columna que se enlazará automáticamente en ODBC.

Sintaxis

objeto.BindThreshold [= valor]

La sintaxis de la propiedad BindThreshold consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Long, según se describe en Comentarios.

Comentarios

El valor predeterminado de BindThreshold es 1024 bytes.

Algunos tipos de datos admiten tamaños demasiado grandes para poder tratarlos con las técnicas convencionales de matrices de cadenas o de bytes. Para estas columnas debe usar los métodos GetChunk y AppendChunk. Sin embargo, el uso de estos métodos no es requerido. Puede simplemente usar la propiedad Value suponiendo que el tamaño de los datos no agotará los recursos.

Al establecer la propiedad BindThreshold puede indicar el tamaño máximo de los datos que RDO enlaza automáticamente a las cadenas. Las columnas de tamaño superior al valor de BindThreshold requerirán el uso del método GetChunk para recuperar los datos. La propiedad ChunkRequired indica si la columna requiere el uso de los métodos AppendChunk y GetChunk comparando el tamaño de los datos con el valor de BindThreshold.


BOFAction, EOFAction (Propiedades, datos remotos)

Devuelven o establecen un valor que indica la acción que debe tomar el control RemoteData cuando el valor de las propiedades BOF o EOF es True.

Sintaxis

objeto.BOFAction [= valor]

objeto.EOFAction [= valor]

La sintaxis de las propiedades BOFAction y EOFAction consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor que especifica una acción, según se describe en Valores.

Valores

Para la propiedad BOFAction, los valores admitidos para valor son:

Constante | Valor | Descripción
rdMoveFirst | 0 | MoveFirst (predeterminado): mantiene la primera fila como fila actual.
rdBOF | 1 | BOF: al llegar más allá del principio de un objeto rdoResultset se activa el evento Validate del control RemoteData para la primera fila, seguido de un evento Reposition en la fila no válida (BOF). En este punto, se desactiva el botón Desplazar a anterior del control RemoteData.

Para la propiedad EOFAction, los valores admitidos para valor son:

Constante | Valor | Descripción
rdMoveLast | 0 | MoveLast (predeterminado): mantiene la última fila como fila actual.
rdEOF | 1 | EOF: al llegar más allá del final de un objeto rdoResultset se activa el evento Validation del control RemoteData para la última fila, seguido de un evento Reposition en la fila no válida (EOF). En este punto, el botón Desplazar a siguiente del control RemoteData se desactiva.
rdAddNew | 2 | AddNew: al llegar más allá de la última fila se activa el evento Validation del control RemoteData sobre la fila actual, seguido de un AddNew automático, seguido a su vez de un evento Reposition en la nueva fila.

Comentarios

Si establece a rdAddNew la propiedad EOFAction, cuando el usuario mueva el puntero de fila actual hasta EOF con el control RemoteData, la fila actual se sitúa en una nueva fila del búfer de copia. En este punto, puede modificar la fila recién agregada. Si la modifica y posteriormente el usuario mueve el puntero de fila actual con el control RemoteData, la fila se agregará automáticamente al objeto rdoResultset. Si no hace ningún cambio en esta nueva fila y establece como fila actual otra distinta, la nueva fila se perderá. Si utiliza el control RemoteData para situarse en otra fila mientras se encuentra en la fila nueva, se creará otra fila más.

Cuando utiliza código para manipular objetos rdoResultset creados con el control RemoteData, la propiedad EOFAction no tiene ningún efecto. Sólo se aplica al manipular el control RemoteData con el mouse (ratón).

En las situaciones en las que el objeto rdoResultset del control RemoteData no devuelve ninguna fila, o después de eliminar la última, el uso de la opción rdAddNew en la propiedad EOFAction simplifica en gran medida el código, ya que siempre es posible modificar una nueva fila como fila actual.


BOF, EOF (Propiedades, datos remotos)

  • BOF: devuelve un valor que indica si la posición de la fila actual es anterior a la primera fila de un objeto rdoResultset.

  • EOF: devuelve un valor que indica si la posición de la fila actual es posterior a la última fila de un objeto rdoResultset.

Sintaxis

objeto.BOF

objeto.EOF

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos de la propiedad BOF son los siguientes:

Valor | Descripción
True | La posición de la fila actual es anterior a la primera fila.
False | La posición de la fila actual es la de la primera fila o posterior.

Los valores devueltos de la propiedad EOF son los siguientes:

Valor | Descripción
True | La posición de la fila actual es posterior a la última fila.
False | La posición de la fila actual es la de la última fila o anterior.

Comentarios

BOF y EOF devuelven valores determinados por la ubicación del puntero de fila actual, cuando este puntero es válido. Si BOF o EOF son True, no hay ninguna fila actual y cualquier intento de hacer referencia a los datos del objeto rdoResultset provocará un error interceptable.

Puede usar las propiedades BOF y EOF para determinar si un objeto rdoResultset contiene filas o si se ha ido más allá de los límites de un rdoResultset al desplazarse de una fila a otra.

Si abre un objeto rdoResultset que no contiene ninguna fila, tanto BOF como EOF tendrán el valor True y el valor de la propiedad RowCount del conjunto de resultados será 0. Al abrir un objeto rdoResultset que contenga al menos una fila, la primera será la fila actual, y tanto BOF como EOF serán False, conservando este valor hasta que se desplace más allá del principio o del final del objeto rdoResultset con los métodos MovePrevious o MoveNext, respectivamente. Al traspasar el comienzo o el final del rdoResultset, no hay fila actual.

Si elimina la última fila que queda en el objeto rdoResultset, BOF y EOF pueden continuar teniendo el valor False hasta que intente volver a situar la fila actual.

Si utiliza el método MoveLast en un objeto rdoResultset que contiene filas, la última de ellas pasará a ser la fila actual. Si a continuación usa el método MoveNext, la fila actual dejará de ser válida y EOF adoptará el valor True. Por el contrario, si utiliza el método MoveFirst en un objeto rdoResultset que contiene filas, la primera fila pasará a ser la fila actual, y si a continuación usa el método MovePrevious, no habrá fila actual y en BOF se establecerá el valor True.

Con frecuencia, al trabajar con todas las filas de un objeto rdoResultset, el código hará un bucle para cada fila utilizando MoveNext hasta que la propiedad EOF tenga el valor True.

Si utiliza MoveNext mientras EOF es True o MovePrevious mientras BOF es True, se producirá un error interceptable.

En esta tabla se indican los métodos Move permitidos con distintas combinaciones de BOF y EOF.

 | MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0
BOF = True, EOF = False | Permitido | Error | Error | Permitido
BOF = False, EOF = True | Permitido | Permitido | Error | Error
Ambos True | Error | Error | Error | Error
Ambos False | Permitido | Permitido | Permitido | Permitido

El hecho de que esté permitido un método Move no significa que tal método vaya a encontrar con éxito una fila. Simplemente indica que el intento de ejecutar el método Move especificado no generará un error. El estado de las propiedades BOF y EOF puede cambiar como resultado del método Move ejecutado.

Efectos de métodos específicos sobre el valor de BOF y EOF:

  • El método OpenResultset invoca internamente al método MoveFirst. Por tanto, OpenResultset sobre un conjunto de filas vacío hace que BOF y EOF se establezcan a True.

  • Todos los métodos Move que encuentren una fila con éxito establecen BOF y EOF a False.

  • En los objetos rdoResultset de tipo dynamic, cualquier método Delete, aunque quite la única fila que quede en un objeto rdoResultset, no cambia el valor de BOF ni el de EOF.

  • Para otros tipos de objetos rdoResultset, las propiedades BOF y EOF no varían en las operaciones de agregar y eliminar filas, ya que la pertenencia al conjunto de resultados es fija.


Bookmark (Propiedad, datos remotos)

Devuelve o establece un marcador que identifica de forma única la fila actual de un objeto rdoResultset. Si dispone de un marcador válido, puede usarlo para cambiar la posición de la fila actual en un objeto rdoResultset.

Sintaxis

objeto.Bookmark [= valor]

La sintaxis de la propiedad Bookmark consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Variant (cadena) que da como resultado un marcador válido.

Comentarios

Cuando se crea o abre un objeto rdoResultset que no sea de tipo forward-only, cada una de sus filas tiene ya un marcador único. Puede guardar el marcador de la fila actual si asigna el valor de la propiedad Bookmark a una variable declarada como Variant. Para volver a esa fila rápidamente en cualquier momento después de haberse movido a otra fila distinta, establezca la propiedad Bookmark del objeto rdoResultset al valor de esa variable.

No hay límite en cuanto al número de marcadores que puede establecer. Para crear un marcador para una fila distinta de la actual, vaya a la fila deseada y luego asigne el valor de la propiedad Bookmark a una variable Variant que identifique la fila.

Para asegurarse de que el objeto rdoResultset admite marcadores, examine el valor de su propiedad Bookmarkable antes de usar su propiedad Bookmark. Si Bookmarkable es False, el objeto rdoResultset no admite marcadores y el uso de Bookmark producirá un error interceptable. Aunque es posible obtener un valor de marcador cuando se utiliza un cursor dinámico, ese valor no será siempre fiable.

El valor de la propiedad Bookmark no coincide necesariamente con el número de fila.

Nota La propiedad Bookmark no se aplica a los objetos rdoResultset de tipo forward-only.


Bookmarkable (Propiedad, datos remotos)

Devuelve un valor que indica si un objeto rdoResultset admite marcadores, que puede establecer con la propiedad Bookmark.

Sintaxis

objeto.Bookmarkable

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos de la propiedad Bookmarkable son los siguientes:

Valor | Descripción
True | El objeto rdoResultset admite marcadores.
False | El objeto rdoResultset no admite marcadores.

Comentarios

Para asegurarse de que un objeto rdoResultset admite marcadores, compruebe el valor de la propiedad Bookmarkable antes de establecer o leer la propiedad Bookmark.


ChunkRequired (Propiedad, datos remotos)

Devuelve un valor booleano que indica si es necesario que el acceso a los datos se haga a través del método GetChunk.

Sintaxis

objeto.ChunkRequired

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos de la propiedad ChunkRequired son los siguientes:

Valor | Descripción
True | El acceso a los datos debe realizarse con el método GetChunk.
False | No es necesario que el acceso se haga con el método GetChunk.

Comentarios

Puede usar la propiedad ChunkRequired para determinar si la columna en cuestión debe manipularse con los métodos AppendChunk y GetChunk. El uso de la propiedad Value de una columna cuya propiedad ChunkRequired sea True sólo producirá un error interceptable cuando RDO no sea capaz de obtener los datos sin usar los métodos AppendChunk o GetChunk. Es decir, cuando la columna de datos no contenga más datos de los que pueden manejarse con el tratamiento convencional de cadenas, no se requiere usar los métodos GetChunk y AppendChunk.

Mediante la propiedad BindThreshold puede ajustar el número de bytes que obligarán al uso de los métodos AppendChunk y GetChunk. Con el método ColumnSize también puede determinar la longitud de una columna de datos.


Connect (Propiedad, datos remotos)

Devuelve o establece un valor que proporciona información sobre el origen de un objeto rdoConnection abierto. La propiedad Connect contiene la cadena de conexión ODBC. Esta propiedad puede leerse siempre, pero no puede modificarse una vez establecida la conexión.

Sintaxis

objeto.Connect [= valor]

La sintaxis de la propiedad Connect consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de cadena, según se describe en Comentarios. (El tipo de datos es String.)

Valores

El valor que devuelve la propiedad Connect es una expresión de tipo String compuesta por cero o más parámetros, separados por caracteres de punto y coma, según se describe en Comentarios.

Comentarios

Cuando se utiliza con los objetos rdoQuery o rdoConnection, esta propiedad es de sólo lectura, a menos que se haya creado como un objeto autónomo, en cuyo caso es de lectura y escritura hasta que se establece la conexión. La propiedad Connect pasa a ser de lectura y escritura de nuevo cuando se cierra el objeto rdoConnection. Cuando se utiliza con el control RemoteData, esta propiedad es de lectura y escritura.

La propiedad Connect se utiliza para pasar información adicional hacia y desde el administrador de controladores ODBC con el fin de establecer una conexión con un origen de datos. La propiedad Connect almacena la cadena de conexión ODBC, que se utiliza también como argumento del método OpenConnection. Cuando se trabaja con un objeto rdoQuery o rdoConnection autónomo, es el método EstablishConnection el que utiliza la propiedad Connect.

A excepción de cuando está asociada al control RemoteData, una vez establecida una conexión la propiedad Connect se completa con los valores que opcionalmente proporcionan el usuario y el Administrador de controladores ODBC. La propiedad Connect del objeto rdoQuery contiene esta cadena de conexión.

La propiedad Connect del control RemoteData no cambia después de establecida la conexión. Sin embargo, sí es posible extraer la cadena de conexión completa de la propiedad Connection. Por ejemplo:

FullConnect = MSRDC1.Connection.Connect

En la tabla siguiente se indican argumentos de cadena de conexión ODBC válidos y su uso habitual. Observe que cada parámetro se delimita con un carácter de punto y coma (;).

Argumentos de cadena de conexión ODBC

Parámetro | Especifica | Ejemplo
DSN | Origen de datos ODBC registrado por nombre. | DSN=MiOrigenDatos; (Si se especifica al establecer una conexión sin DSN, DSN debe ser el último argumento)
UID | Nombre de un usuario reconocido de la base de datos | UID=Victoria;
PWD | Contraseña asociada al nombre de usuario. | PWD=ChemMajor;
DRIVER | Descripción del controlador. (Observe el uso de llaves para los nombres de controlador que incluyen espacios en blanco). | DRIVER={SQL Server};
DATABASE | Base de datos predeterminada que se va a usar una vez establecida la conexión. | DATABASE=Pubs;
SERVER | Nombre del servidor remoto | SERVER=SEQUEL;
WSID | Identificador de estación de trabajo (nombre de su equipo en la red) | WSID=MIP5
APP | Nombre de aplicación. En tiempo de diseño será el nombre del proyecto. En tiempo de ejecución será el nombre del archivo .exe | APP=Contabilidad

Nota Algunos controladores ODBC requieren parámetros distintos que no aparecen en esta lista.

Por ejemplo, para establecer la propiedad Connect de un control RemoteData podría usar código como el siguiente:

Dim Cnct As String
Cnct = "DSN=WorkData;UID=Chrissy;"  _
      & "PWD=MIDFLD;DATABASE=WorkDB;"
RemoteData1.Connect = Cnct
RemoteData1.SQL = "Select Name, City " _
   & " From Teams Where Type = 12"
RemoteData1.Refresh

Puede usar esta misma cadena para establecer una nueva conexión:

Dim Cn As rdoConnection
Set Cn = rdoEnvironments(0).OpenConnection("", _
rdDriverNoPrompt,True,Cnct$)

Nota Los parámetros válidos vienen determinados por el controlador ODBC. Los que se muestran en el ejemplo anterior son los que admite el controlador ODBC de Microsoft SQL Server. ODBC, LOGINTIMEOUT y DBQ no son parámetros válidos del control RemoteData ni de la propiedad Connect del objeto rdoConnection. Estos parámetros son compatibles con el motor de base de datos Microsoft Jet y no con el controlador ODBC. Para establecer el intervalo de espera de inicio de sesión, debe usar la propiedad LoginTimeout del objeto rdoEnvironment.

Capturar argumentos omitidos

Si la cadena de conexión es nula, la información proporcionada por el DSN es incompleta, o si se especifican argumentos no válidos, la conexión no podrá establecerse. Si en el código se establece el argumento prompt del método OpenConnection o la propiedad Prompt del control RemoteData de forma que impidan que el usuario complete los argumentos de conexión ODBC que falten, se producirá un error interceptable. De lo contrario, el Administrador de controladores ODBC presentará un cuadro de diálogo para obtener del usuario la información que falte. Dependiendo del valor del argumento prompt de los métodos OpenConnection o EstablishConnection, estos cuadros de diálogo capturarán el DSN de una lista de orígenes de datos ODBC registrados. Los nombres se presentarán entonces al usuario y, opcionalmente, el identificador de usuario y la contraseña. Si la conexión falla con los valores que proporciona el usuario, los cuadros de diálogo aparecerán de nuevo hasta que la conexión se realice correctamente o hasta que el usuario cancele la operación. En algunos casos, el usuario puede crear su propio DSN mediante estos cuadros de diálogo.

Si es necesaria una contraseña y no se incluye en el valor de la propiedad Connect, aparecerá un cuadro de diálogo de inicio de sesión la primera vez que el controlador ODBC intente el acceso a una tabla y cada vez que la conexión se cierre y se vuelva a abrir.

Conectar con la seguridad administrada para el dominio

Al conectar con orígenes de datos ODBC que admiten seguridad administrada para el dominio, establezca a "" los parámetros UID y PWD. En este caso, se trasladarán al origen de datos el nombre de usuario de Windows NT y la contraseña correspondiente para su validación. Esta estrategia permite el acceso al origen de datos a los usuarios que hayan conseguido acceso al dominio de NT a través de la autentificación de sus inicios de sesión en las estaciones de trabajo.

Puede establecer la propiedad Connect de un objeto rdoConnection si especifica un argumento connect en el método OpenConnection. Una vez establecida la conexión, puede comprobar el valor de la propiedad Connect para determinar el DSN, la base de datos, el nombre de usuario, la contraseña o el origen de datos ODBC de la base de datos.

Registrar nombres de orígenes de datos

Para poder establecer una conexión con un Nombre de origen de datos (DSN), previamente debe registrar manualmente el DSN con el Panel de control de Windows o bien usar el método rdoRegisterDataSource. En este proceso se establece el nombre del servidor, el nombre del controlador y otras opciones que se usarán al referirse a este origen de datos.

Establecer conexiones sin DSN

En las circunstancias adecuadas, puede que no sea necesario el registro previo de un DSN antes de establecer la conexión. Si se satisfacen las condiciones siguientes, RDO podrá establecer una conexión sin DSN con el control RemoteData, o con los métodos OpenConnection o EstablishConnection y una propiedad Connect o una cadena de conexión completa:

  • La conexión utiliza el protocolo predeterminado de canalizaciones con nombre de la red.

  • La conexión no establece la opción OEMTOANSI.

  • El nombre del servidor se especifica con el argumento SERVER de la cadena de conexión.

  • El nombre del controlador ODBC se especifica con el argumento DRIVER de la cadena de conexión.

  • Se establece una cadena vacía como argumento DSN en la cadena de conexión (o en cualquier otro lugar donde aparezca, como en la propiedad DataSourceName del control RemoteData). El argumento DSN vacío debe especificarse como último parámetro de la cadena de conexión.


Connection (Propiedad, datos remotos)

Devuelve una referencia al objeto rdoConnection subyacente de un control RemoteData.

Sintaxis

objeto.Connection

Set conexión = objeto.Connection

La sintaxis de la propiedad Connection consta de las siguientes partes:

Parte | Descripción
conexión | Una expresión de objeto que da como resultado un objeto rdoConnection válido.
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Cuando se inicializa un control RemoteData, RemoteData abre una conexión con el origen de datos especificado en la propiedad Connect del control. El objeto rdoConnection que crea RDO se muestra a través de la propiedad Connection.

Los objetos rdoConnection tienen propiedades y métodos que puede usar para administrar los datos. Con la propiedad Connection de un control RemoteData puede usar cualquier método de un objeto rdoConnection, como por ejemplo Close y Execute.

A excepción de cuando está asociada al control RemoteData, una vez establecida una conexión, la propiedad Connect se completa con los valores que opcionalmente proporcionan el usuario y el Administrador de controladores ODBC. La propiedad Connect del objeto rdoQuery contiene esta cadena de conexión corregida.

La propiedad Connect del control RemoteData no cambia una vez establecida la conexión. Sin embargo, sí es posible extraer la cadena de conexión ya completa de la propiedad Connection. Por ejemplo:

FullConnect = MSRDC1.Connection.Connect


Ejemplo de la propiedad Connect y OpenConnection: conexión con DSN mediante OpenConnection

El ejemplo siguiente establece una conexión ODBC empleando el método OpenConnection, pero el usuario debe proporcionar toda la información de conexión. En este caso, el ejemplo imprime la propiedad Connect resultante en la ventana Inmediato.

Dim cn As rdoConnection
Dim en As rdoEnvironment

Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="WorkDB", _
    Prompt:=rdDriverCompleteRequired)
debug.print cn.Connect


Ejemplo de la propiedad Connect y OpenConnection: conexión sin DSN mediante OpenConnection

El ejemplo siguiente establece una conexión ODBC sin DSN empleando el método OpenConnection sobre el objeto rdoEnvironment predeterminado. En este caso, el ejemplo imprime la propiedad Connect resultante en la ventana Inmediato.

Dim en as rdoEnvironment
Dim cn as rdoConnection

Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=SEQUEL;database=pubs;")
debug.print cn.Connect


Ejemplo de la propiedad Connect: conexión sin DSN mediante una conexión autónoma

El ejemplo siguiente establece una conexión ODBC sin DSN creando un objeto rdoConnection autónomo y empleando el método EstablishConnection para abrir la conexión. Observe que el argumento DSN=''; aparece al final de la cadena de conexión. El ejemplo imprime la propiedad Connect resultante en la ventana Inmediato.

' Crear una conexión sin DSN
'   utilizando un objeto rdoConnection autónomo y
'   el método EstablishConnection
'
Dim cn As New rdoConnection
Dim qd As New rdoQuery

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.cursordriver = rdUseOdbc
cn.EstablishConnection rdDriverNoprompt
debug.print cn.Connect

Set qd.ActiveConnection = cn


Ejemplo de la propiedad Connect: conexión DSN mediante EstablishConnection

El ejemplo siguiente establece una conexión ODBC utilizando un DSN registrado para obtener la mayoría de los argumentos necesarios. El Id. de usuario y la contraseña la proporcionan la seguridad administrada de dominio. En este caso, el ejemplo imprime la propiedad Connect resultante en la ventana Inmediato.

Dim cn As New rdoConnection
Dim qd As New rdoQuery

cn.Connect = "uid=;pwd=;"DSN=WorkDB;"
cn.cursordriver = rdUseOdbc
cn.EstablishConnection rdDriverNoprompt
debug.print cn.Connect


CursorDriver (Propiedad, datos remotos)

Devuelve o establece un valor que especifica el tipo de cursor que se va a crear.

Sintaxis

objeto.CursorDriver [= valor]

La sintaxis de la propiedad CursorDriver consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un valor de tipo Integer o una constante, según se describe en Valores.

Valores

Constante | Valor | Descripción
rdUseIfNeeded | 0 | El controlador ODBC elegirá el tipo de cursores adecuado. Se usarán cursores del servidor si hay alguno disponible.
rdUseOdbc | 1 | RemoteData usará la biblioteca de cursores de ODBC .
rdUseServer | 2 | Se usarán cursores del lado del servidor.
rdUseClientBatch | 3 | RDO usará la biblioteca de cursores por lotes de tipo optimista.

Comentarios

La propiedad CursorDriver sólo afecta a las conexiones realizadas después de establecer la propiedad. Esta propiedad es de sólo lectura para las conexiones existentes.

Cuando se crea el objeto rdoEnvironment inicial (predeterminado) y los sucesivos, la propiedad CursorDriver recibe su valor de la propiedad rdoDefaultCursorDriver del objeto rdoEngine, que se establece con las mismas constantes.

Elegir un controlador de cursores

La elección del controlador de cursores adecuado puede tener un impacto importante en el rendimiento global de la aplicación, en los recursos que el cursor consume y en limitar el tipo o complejidad de los cursores que se pueden crear. Cada tipo de cursor presenta sus ventajas y limitaciones. En muchos casos, lo mejor es no usar ningún cursor, ya que a menudo la aplicación no precisa desplazarse por los datos ni realizar operaciones de actualización en un conjunto de claves.

En los párrafos siguientes se indica brevemente la funcionalidad y usos sugeridos para cada uno de los tipos de cursor.

  • Cursores del lado del servidor
    • Esta biblioteca de cursores mantiene el conjunto de claves en el servidor (en TempDB), lo que elimina la necesidad de transferirlo a la estación de trabajo, donde consumiría recursos que pueden ser necesarios. Sin embargo, esta opción consume espacio en TempDB en el servidor remoto, por lo que hay que ampliar esta base de datos hasta satisfacer los requisitos. Los cursores creados con el controlador del lado del servidor no pueden contener más de una instrucción SELECT y si lo hacen se producirá un error interceptable. Aún así, puede usar el controlador de cursores del lado del servidor con varias consultas sobre conjuntos de resultados. Para ello desactive el cursor creando uno de tipo forward-only y de sólo lectura con un tamaño de conjunto de filas de uno. No todos los servidores remotos admiten cursores en el lado del servidor. Observe que este tipo de cursores se activan cuando se utiliza rdUseIfNeeded o rdUseServer en bases de datos de Microsoft SQL Server.
  • Cursores ODBC en el lado del cliente
    • Esta biblioteca de cursores crea conjuntos de claves en la memoria RAM local de la estación de trabajo, utilizando también el disco si es necesario. Debido a este diseño, deben realizarse un número de operaciones de red considerablemente mayor para crear inicialmente el conjunto de claves, pero con cursores pequeños no debería suponer una carga significativa para la estación de trabajo o la red. Los cursores ODBC en el lado del cliente no imponen ningún tipo de restricción sobre el tipo de consulta ejecutado. Para los conjuntos de resultados pequeños esta opción ofrece un mejor rendimiento, aunque se degrada rápidamente para conjuntos mayores.
  • Cursores por lotes del cliente
    • Esta biblioteca de cursores está diseñada para ocuparse de los requisitos especiales de las actualizaciones optimistas por lotes y otras características complejas de cursor. Los cursores de este tipo son necesarios para disociar conexiones, para el modo por lotes y para actualizaciones de varias tablas. También permiten la obtención retardada de columnas BLOB, cursores en búfer y un control adicional sobre las actualizaciones. Esta biblioteca es más grande que las demás, pero también ofrece un rendimiento mejor en muchas situaciones.
  • Sin cursores
    • En los casos en que es necesario obtener filas rápidamente o realizar consultas de acciones sobre la base de datos sin la carga adicional de un cursor, puede indicar a RDO que omita la creación de un cursor. Básicamente, esta opción crea un conjunto de resultados de tipo forward-only y de sólo lectura con el valor 1 en RowsetSize. Esta opción puede mejorar el rendimiento en muchas operaciones. Aunque no es posible actualizar las filas ni desplazarse por ellas con un cursor, sí es posible efectuar consultas de acciones independientes para manipular los datos. Esta opción es especialmente útil cuando el acceso a los datos se realiza a través de procedimientos almacenados.


CursorType (Propiedad)

Devuelve o establece un valor que especifica el tipo de cursor predeterminado que se usará al abrir un conjunto de resultados desde la consulta especificada.

Sintaxis

objeto.CursorType [= valor]

La sintaxis de la propiedad CursorType consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el tipo de cursor, según describen las siguientes constantes:

Constante | Valor | Tipo de rdoResultset
rdOpenForwardOnly | 0 | (Predeterminado) Conjunto fijo, sin desplazamiento.
rdOpenKeyset | 1 | Cursor actualizable, de conjunto fijo, con conjunto de resultados de la consulta desplazable.
rdOpenDynamic | 2 | Cursor actualizable, de conjunto dinámico, con conjunto de resultados de la consulta desplazable.
rdOpenStatic | 3 | Conjunto fijo, de sólo lectura.

Comentarios

Determina el tipo de cursor que se va a usar al abrir un objeto rdoResultset desde esta consulta.

Al crear un objeto rdoQuery autónomo cuya consulta se vaya a usar como un método, debe establecer CursorType antes de ejecutar la consulta, ya que no hay ninguna opción para hacerlo cuando la consulta se ejecuta.

El valor de la propiedad CursorType se emplea como argumento Type del método OpenResultset.

No todas las bibliotecas de cursores admiten todos los tipos de cursores. Por ejemplo, el controlador ODBC del lado del cliente sólo admite los tipos de cursor rdOpenStatic y rdOpenForwardOnly, mientras que el controlador del lado del servidor SQL Server admite los cuatro. En general, la mayoría de los controladores admite cursores de tipo forward-only y estáticos.


Ejemplo de la propiedad CursorType

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub Form_Load()

cn.CursorDriver = rdUseClientBatch
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection

'
'   Configurar la consulta
'
With qy
    .Name = "ShowAuthor"
    .SQL = "Select * from Authors " _
      & "where Au_LName = ? "
    .LockType = rdConcurReadOnly
    .CursorType = rdOpenForwardOnly
    .RowsetSize = 1
    Set .ActiveConnection = cn
End With

'
'   Ejecutar la consulta por nombre
'   Pasar un parámetro a la consulta
'
cn.ShowAuthor "White"
'
'   Procesar las filas resultantes
'

If cn.LastQueryResults is Nothing then
Else
   Set rs = cn.LastQueryResult
   For Each col In rs.rdoColumns
       Print col.Name,
   Next
   Print String(80, "-")

   Do Until rs.EOF
       For Each col In rs.rdoColumns
           Print col,
       Next
       Print
       rs.MoveNext
   Loop
End if

End Sub


DataSourceName (Propiedad, datos remotos)

Devuelve o establece el nombre del origen de datos de un control RemoteData.

Sintaxis

objeto.DataSourceName [= nombreOrigenDatos ]

La sintaxis de la propiedad DataSourceName consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
nombreOrigenDatos | Una expresión de cadena que indica un nombre de origen de datos registrado.

Comentarios

Esta propiedad puede dejarse en blanco cuando la propiedad Connect del control RemoteData identifique un nombre de origen de datos (DSN) registrado en el Registro de Windows (32 bits) o si se crea una conexión sin DSN que proporcione toda la información necesaria en la propiedad Connect.

Una vez que el control RemoteData ha abierto el objeto rdoConnection, la propiedad DataSourceName contiene el DSN utilizado para establecer la conexión. Este DSN puede ser distinto del valor establecido antes de abrir la conexión, ya que es posible que un usuario seleccione un origen de datos en una lista de entradas de DSN válidas durante el proceso de conexión.

Si modifica esta propiedad después de abrir el objeto rdoConnection del control, deberá usar el método Refresh del control RemoteData para abrir una nueva conexión con el origen de datos.


Description (Propiedad, datos remotos)

Devuelve una cadena descriptiva asociada a un error.

Sintaxis

objeto.Description

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto de la propiedad Description es una expresión de cadena que contiene una descripción del error.

Comentarios

Cuando se produce un error en el servidor remoto o en la interfaz ODBC durante el procesamiento de una consulta, se crea un objeto rdoError que se agrega a la colección rdoErrors. La propiedad Description del objeto rdoError devuelve una breve descripción e información de contexto sobre el error. Esta información puede usarse para indicar al usuario que se ha producido un error que no se puede o no se desea tratar. El código SQLState se agrega al principio del mensaje, seguido de un signo de dos puntos y un espacio en blanco. Por ejemplo, "S0021: No se encuentra XXX".


Direction (Propiedad, datos remotos)

Devuelve o establece un valor que indica la forma en que se pasa un parámetro hacia o desde un procedimiento.

Sintaxis

objeto.Direction [= valor]

La sintaxis de la propiedad Direction consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor Integer, según se describe en Valores.

Valores

Los valores admitidos para valor son los siguientes:

Constante | Valor | Descripción
rdParamInput | 0 | (Predeterminado) El parámetro se utiliza para pasar información al procedimiento.
rdParamInputOutput | 1 | El parámetro se utiliza para pasar información hacia y desde el procedimiento.
rdParamOutput | 2 | El parámetro se utiliza para devolver información desde el procedimiento, como en el caso de un parámetro de salida de SQL.
rdParamReturnValue | 3 | El parámetro se utiliza para obtener el valor de estado de devolución de un procedimiento.

Comentarios

Al trabajar con procedimientos almacenados y consultas con parámetros debe identificar los parámetros que RDO va a administrar en su nombre, pero sólo cuando vaya a usar controladores que no detecten automáticamente la dirección de los parámetros. Una consulta con parámetros puede tomar virtualmente cualquier número de argumentos de entrada y cada uno de ellos deberá marcarse al crear la consulta.

En general, la consulta devuelve un conjunto de filas que satisfacen los requisitos establecidos en ella según los parámetros suministrados en tiempo de ejecución. Sin embargo, al trabajar con procedimientos almacenados se plantea otra cuestión. Los procedimientos almacenados devuelven información mediante conjuntos de filas, estado de devolución y parámetros de salida. Por ello, cada parámetro devuelto por un procedimiento almacenado debe marcarse al crear la consulta.

La propiedad Direction determina si el parámetro es de entrada, de salida o ambas cosas, o bien si el parámetro es el valor devuelto del procedimiento.

Nota La primera vez que se haga referencia al objeto rdoParameter para establecer la propiedad Direction, puede producirse un error interceptable si no se puede crear la colección rdoParameters. Por lo general, se debe a errores de sintaxis en la consulta u otros problemas que han impedido que RDO cree la colección.

Algunos controladores ODBC no proporcionan información sobre la dirección de los parámetros a las instrucciones SELECT o llamadas a procedimientos, por lo que todas las direcciones de parámetros toman como valor predeterminado rdParamInput. En estos casos, es necesario establecer la dirección en el código antes de ejecutar la consulta.

Nota El controlador Microsoft SQL Server 6.x establece automáticamente la propiedad Direction de todos los parámetros de procedimientos, por lo que no es necesario establecerla para ninguno de los parámetros de las consultas.

La propiedad Direction está asociada al objeto rdoParameter, pero por lo general no es necesario hacer referencia al objeto rdoParameter propiamente dicho, pues es la colección predeterminada del objeto rdoQuery, como se muestra más adelante en los ejemplos.

Por ejemplo, el procedimiento siguiente devuelve un valor de un procedimiento almacenado:

{? = call sp_test}

Esta llamada produce un parámetro: el valor devuelto. Es necesario establecer la dirección de este parámetro a rdParamOutput o rdParamReturnValue antes de ejecutar la instrucción preparada. Por ejemplo:

Dim my_statement As rdoQuery
Set my_statement = unaRdoConnection.CreateQuery _
   ("MiPs", "{? = call sp_testprocedure }", ...)
my_statement.rdoParameters(0).Direction =  _
   rdParamReturnValue
my_statement.Execute
Print my_statement.rdoParameters(0)

Es necesario establecer todas las direcciones de los parámetros, excepto rdParamInput, antes de tener acceso o establecer los valores de los parámetros y de ejecutar el objeto rdoQuery.

Para los valores devueltos debe usar rdParamReturnValue, aunque puede usar rdParamOutput cuando no se admita rdParamReturnValue.


EditMode (Propiedad, datos remotos)

Devuelve un valor que indica el estado de edición de la fila actual.

Sintaxis

objeto.EditMode

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad EditMode devuelve un valor de tipo Integer o una constante, según se describe en la tabla siguiente:

Constante | Valor | Descripción
rdEditNone | 0 | No se está efectuando ninguna operación de modificación.
rdEditInProgress | 1 | Se ha invocado el método Edit y la fila actual está en el búfer de copia.
rdEditAdd | 2 | Se ha invocado el método AddNew y la fila actual del búfer de copia es una fila nueva que no se ha guardado en la base de datos.

Comentarios

La propiedad EditMode tiene su máxima utilidad cuando se desea partir de la funcionalidad predeterminada de un control RemoteData. Puede comprobar el valor de la propiedad EditMode y del parámetro acción del procedimiento de evento Validate para determinar si se invoca o no el método UpdateRow.

También puede comprobar si la propiedad LockEdits del objeto rdoResultset es True y el de la propiedad EditMode es rdEditInProgress para determinar si la página de datos actual está bloqueada.


Environment (Propiedad, datos remotos)

Devuelve una referencia al objeto rdoEnvironment subyacente de un control RemoteData.

Sintaxis

objeto.Environment

Set entorno = objeto.Environment

La sintaxis de la propiedad Environment consta de las siguientes partes:

Parte | Descripción
entorno | Una expresión de objeto que da como resultado un objeto rdoEnvironment válido.
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

Cuando se inicializa un control RemoteData, RemoteData utiliza el objeto rdoEnvironments(0) predeterminado, por lo que inicialmente en la propiedad Environment se establece este objeto.

Si asigna otro objeto rdoResultset a la propiedad Resultset del control RemoteData, en la propiedad Environment se establecerá el objeto rdoEnvironment utilizado para crear el conjunto de resultados.

Los objetos rdoEnvironment tienen propiedades y métodos que puede usar para administrar datos. Por ejemplo, puede usar cualquier método de un objeto rdoEnvironment, como OpenConnection, BeginTrans, CommitTrans o RollbackTrans, con la propiedad Environment.


ErrorThreshold (Propiedad, datos remotos)

Devuelve o establece un valor que determina el nivel de gravedad que constituye un error fatal.

Nota Esta propiedad se incluye por compatibilidad con el código para RDO versión 1.0. Debe sustituirse por código que implemente el evento InfoMessage del objeto rdoEngine, que proporciona una funcionalidad equivalente.

Comentarios

En la versión 4.x de Microsoft SQL Server no es posible establecer la gravedad de los errores con la instrucción RAISERROR. Como resultado, la propiedad ErrorThreshold era necesaria para permitir al código filtrar los mensajes que sobrepasaran un determinado nivel de gravedad.

La versión 6.x de Microsoft SQL Server admite la inclusión de un nivel de gravedad en la instrucción RAISERROR, por lo que no es necesario continuar utilizando la propiedad ErrorThreshold.

Todos los errores con un nivel de gravedad inferior a 10 se interceptan en los niveles de ODBC y establecen el código de resultado SQL_SUCCESS_WITH_INFO. Esto hace que RDO active el evento InfoMessage, pero sin detener el procesamiento de la consulta.


Ejemplo del método Execute

Este ejemplo demuestra el uso del método Execute para ejecutar consultas SQL en un origen de datos remoto. Estas consultas de acciones no devuelven filas, pero en algunos casos devuelven el número de filas afectadas en las propiedad RowsAffected. El ejemplo crea una tabla de trabajo llamada "TestData", inserta unas cuantas filas de datos en la tabla y ejecuta una consulta de eliminación en la tabla. Tenga en cuenta que las consultas de eliminación incorporan su propia administración de transacciones. Por tanto, debe usar la opción rdExecDirect para evitar la creación de procedimientos almacenados que negarán el uso de transacciones proporcionadas por las consultas.

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn
Dim SQL As String

Private Sub DropRows_Click()
Dim SQL As String, Ans As Integer

SQL = "Begin Transaction Delete TestData " _
   & " Where State = '" & StateWanted & "'"
cn.Execute SQL, rdExecDirect
Ans = MsgBox("¿Desea eliminar estas "  _
   & cn.RowsAffected & " filas?", vbOKCancel)
If Ans = vbOK Then
   cn.Execute "Commit Transaction", rdExecDirect
Else
   cn.Execute "Rollback Transaction", rdExecDirect
End If
Exit Sub
End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};" _
   & "database=pubs;dsn=''; "
cn.EstablishConnection
With qy
   .Name = "TestList"
   .SQL = "Select * from TestData Where State = ? "
   .RowsetSize = 1
   Set .ActiveConnection = cn
End With
SQL = "Drop Table TestData"
cn.Execute SQL

SQL = " CREATE TABLE TestData " _
   & " (ID integer identity NOT NULL, " _
   & " PName char(10) NULL, " _
   & " State Char(2) NULL) " _
   & " CREATE UNIQUE INDEX " _
   &   "TestDataIndex on TestData(ID)"

cn.Execute SQL
SQL = "Insert TestData (PName,State)  " _
   & "Values('Bob', 'CA')" _
   & " Insert TestData (PName,State) " _
   & " Values('Bill', 'WA') " _
   & " Insert TestData (PName,State) " _
   & " Values('Fred', 'WA') " _
   & " Insert TestData (PName,State) " _
   & " Values('George', 'CA') " _
   & " Insert TestData (PName,State) " _
   & " Values('Sam', 'TX') " _
   & " Insert TestData (PName,State) " _
   & " Values('Marilyn', 'TX') "
cn.Execute SQL
Debug.Print cn.RowsAffected
' Devuelve 1
' (La última instrucción INSERT afectó a 1 fila)
End Sub

Private Sub SeekRows_Click()
qy(0) = StateWanted
Set rs = qy.OpenResultset(rdOpenForwardOnly, _
rdConcurReadOnly)
List1.Clear
If rs.EOF Then
   MsgBox "No hay elementos para este estado"
Exit Sub
End If
Do Until rs.EOF
   List1.AddItem rs!PName & " - " & rs!state
   rs.MoveNext
Loop
End Sub


Ejemplo del método GetRows

Este ejemplo demuestra el uso del método GetRows para obtener filas de un rdoResultset en una matriz de tipo Variant. El código abre una conexión con un origen de datos remoto y crea un objeto rdoQuery que sólo necesita un parámetro. El procedimiento GetRowsNow ejecuta la consulta con un parámetro proporcionado por el usuario y usa GetRows para obtener las filas del conjunto de resultados.

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim RowBuf As Variant
Dim RowsReturned As Integer
Dim i As Integer
Dim Ans As Integer

Private Sub GetRowsNow_Click()
qy(0) = StateWanted
rs.Requery

Do Until rs.EOF
   List1.Clear
   RowBuf = rs.GetRows(5)      ' Obtiene las 5 filas siguientes
   RowsReturned = UBound(RowBuf, 2) + 1
   For i = 0 To RowsReturned - 1
      List1.AddItem RowBuf(0, i) & ":" & RowBuf(1, i)
   Next i
   Ans = MsgBox("Haga clic en Aceptar para ver las 5 filas siguientes " _
      &" o en Cancelar para salir", vbOKCancel)
   If Ans = vbOK Then Else Exit Sub
Loop
End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=SEQUEL;" _
   driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection
With qy
   .Name = "GetRowsQuery"
   .SQL = "Select * from Titles T, Publishers P " _
   & " Where T.Pub_ID = P.Pub_ID " _
   & " and P.State = ? "
   .RowsetSize = 1
   Set .ActiveConnection = cn
   .rdoParameters(0) = "CA"
   Set rs = .OpenResultset(rdOpenKeyset, _
      rdConcurRowver)
End With
End Sub


hDbc (Propiedad, datos remotos)

Devuelve un valor que corresponde al controlador de conexión ODBC.

Sintaxis

objeto.hDbc

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad hDbc devuelve un valor de tipo Long que contiene el controlador de conexión ODBC creado por el Administrador de controladores ODBC y que corresponde al objeto rdoConnection especificado.

Comentarios

Este controlador puede emplearse para ejecutar funciones de ODBC que requieran un controlador de conexión ODBC hDbc.

Nota Aunque es posible ejecutar funciones de la API de ODBC mediante los controladores hEnv, hDbc y hStmt de ODBC, se recomienda hacerlo con cuidado. El uso inadecuado de funciones arbitrarias de la API de ODBC con estos controladores puede provocar un comportamiento impredecible. No debe intentar guardar este controlador en una variable con el fin de usarlo posteriormente, pues su valor puede cambiar.

Si la aplicación requiere acceso a una configuración especial de las opciones de conexión ODBC, deberá establecerla o examinarla con la propiedad hDbc antes de establecer la conexión. Restablecer las opciones de ODBC después de establecer la conexión puede provocar un comportamiento impredecible.


Ejemplo de la propiedad hDbc

El ejemplo siguiente ilustra el uso de la propiedad hDbc al ejecutar una función de la API de ODBC. En este caso, la aplicación establece una opción de conexión que cambia la forma en que se aíslan las transacciones.

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rc As Integer

' Declare Function SQLSetConnectOption Lib "odbc32.dll" (ByVal hdbc&, ByVal fOption%, ByVal vParam As Any) As Integer
'
' Máscaras de opción de aislamiento de transacciones
'
 Const SQL_TXN_ISOLATION As Long = 108
 Const SQL_TXN_READ_UNCOMMITTED As Long = &H1&
 Const SQL_TXN_READ_COMMITTED As Long = &H2&
 Const SQL_TXN_REPEATABLE_READ As Long = &H4&
 Const SQL_TXN_SERIALIZABLE As Long = &H8&
 Const SQL_TXN_VERSIONING As Long = &H10&

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)

Set cn = en.OpenConnection(dsName:="WorkDB", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=workdb")

rc = SQLSetConnectOption(cn.hDbc, SQL_TXN_ISOLATION, SQL_TXN_READ_UNCOMMITTED)

Debug.Print rc

End Sub


HelpContext, HelpFile (Propiedades, datos remotos)

  • HelpContext: devuelve un identificador de contexto para un tema de un archivo de Ayuda de Microsoft Windows.

  • HelpFile: devuelve una ruta de acceso completa al archivo de Ayuda como una variable.

Sintaxis

objeto.HelpContext

objeto.HelpFile

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad HelpContext devuelve un valor de tipo Long.

La propiedad HelpFile devuelve un valor de tipo String.

Comentarios

Si en HelpFile se especifica un archivo de Ayuda de Microsoft Windows, la propiedad HelpContext se utiliza para mostrar automáticamente el tema de Ayuda que identifica.

Nota En la aplicación debe incluir rutinas para el tratamiento de los errores más habituales. Al programar con un objeto puede usar la Ayuda que proporciona el archivo de Ayuda del objeto para mejorar la calidad del tratamiento de errores o para mostrar al usuario un mensaje significativo cuando el error no sea recuperable.


hEnv (Propiedad, datos remotos)

Devuelve un valor que corresponde al controlador de entorno de ODBC.

Sintaxis

objeto.hEnv

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad hEnv devuelve un valor de tipo Long que contiene el controlador de entorno de ODBC que ha creado el Administrador de controladores ODBC y que corresponde al objeto rdoEnvironment especificado.

Comentarios

Este controlador puede emplearse para ejecutar funciones de ODBC que requieran un controlador de entorno de ODBC hEnv.

Nota Aunque es posible ejecutar funciones de la API de ODBC mediante los controladores hEnv, hDbc y hStmt, se recomienda hacerlo con cuidado. El uso inadecuado de funciones arbitrarias de la API de ODBC con estos controladores puede provocar un comportamiento impredecible. No debe intentar guardar este controlador en una variable con el fin de usarlo posteriormente, pues su valor puede cambiar.


hStmt (Propiedad, datos remotos)

Devuelve un valor que corresponde al controlador de instrucción.ODBC.

Sintaxis

objeto.hStmt

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad hStmt devuelve un valor de tipo Long que contiene el controlador de instrucción ODBC creado por el Administrador de controladores ODBC y que corresponde al objeto rdoResultset especificado.

Comentarios

Este controlador puede emplearse para ejecutar funciones ODBC que requieran un controlador de instrucción ODBC hStmt.

Nota Aunque es posible ejecutar funciones de la API de ODBC mediante los controladores hEnv, hDbc y hStmt, se recomienda hacerlo con cuidado. El uso inadecuado de funciones arbitrarias de la API de ODBC con estos controladores puede provocar un comportamiento impredecible. No debe intentar guardar este controlador en una variable con el fin de usarlo posteriormente, pues su valor puede cambiar.


Ejemplo de la propiedad hStmt

Este ejemplo ilustra el uso de la propiedad hStmt para obtener una opción de configuración de un controlador de instrucción específico. En el ejemplo se utiliza la función SQLGetStmtOption para determinar el tipo de cursor creado por el método OpenResultset. Observe que este valor también puede obtenerse a través de la propiedad Type del objeto rdoResultset.

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rs As rdoResultset
Dim rc As Integer
Dim CursorType As Long
Dim T As String

'Declare Function SQLGetStmtOption Lib "odbc32.dll" (ByVal hstmt&, ByVal fOption%, ByRef pvParam As Any) As Integer

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)

en.CursorDriver = rdUseOdbc

Set cn = en.OpenConnection(dsName:="WorkDB", _
    prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=Pubs")

Set rs = cn.OpenResultset("Select * from Publishers", _
 rdOpenKeyset, rdConcurRowVer)

Select Case rs.Type
    Case rdOpenForwardOnly: T = "Forward-only"
    Case rdOpenStatic: T = "Static"
    Case rdOpenKeyset: T = "Keyset"
    Case rdOpenDynamic: T = "Dynamic"
End Select
MsgBox "RDO indica que se creó " _
   & " un cursor " & T
CursorType = 0
rc = SQLGetStmtOption(rs.hStmt,  _
   SQL_CURSOR_TYPE, CursorType)

Select Case CursorType
    Case SQL_CURSOR_FORWARD_ONLY: T = "Forward-only"
    Case SQL_CURSOR_STATIC: T = "Static"
    Case SQL_CURSOR_KEYSET_DRIVEN: T = "Keyset"
    Case SQL_CURSOR_DYNAMIC: T = "Dynamic"
End Select
MsgBox "ODBC indica que se creó " _
   & " un cursor " & T
End Sub


Item (Propiedad, RDO)

Devuelve un miembro específico de un objeto de una colección de Objetos de datos remotos (RDO, Remote Data Objects) por posición o por clave.

Sintaxis

objeto.Item(índice)

La propiedad Item consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Básicamente, la propiedad Item se usa para elegir un miembro de la colección, ya sea por su número ordinal o por un valor clave.

Si el valor proporcionado como índice no coincide con ningún miembro existente de la colección, se producirá un error.

La propiedad Item es el método predeterminado para una colección y raramente se usa para hacer referencia a miembros de una colección. Por tanto, las siguientes líneas de código son equivalentes:

Print MyCollection(1)
Print MyCollection.Item(1)


KeyColumn (Propiedad)

Devuelve o establece un valor que especifica si la columna forma parte de la clave principal.

Sintaxis

objeto.KeyColumn [= valor]

La sintaxis de la propiedad KeyColumn consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Boolean, según se describe en Valores.

Valores

Los valores admitidos para la propiedad KeyColumn son:

Valor | Descripción
True | La columna forma parte de la clave principal.
False | (Predeterminado) La columna no forma parte de la clave principal.

Comentarios

Esta propiedad indica si la columna forma parte de la clave principal del conjunto de resultados. La propiedad es de lectura y escritura cuando se utiliza la biblioteca de cursores de actualización por lotes en el cliente (cuando la propiedad CursorDriver tiene el valor rdUseClientBatch) y genera un error interceptable cuando se intenta el acceso a la misma empleando cursores en el lado del servidor o la biblioteca de cursores ODBC.

Cuando se usa la biblioteca de cursores por lotes en el lado del cliente, puede establecer un valor en esta propiedad para indicar las columnas que conforman la clave principal del conjunto de resultados. De esta forma, se ayudará a la biblioteca de cursores a generar las cláusulas WHERE de las instrucciones de actualización o eliminación e inserción durante una actualización optimista por lotes.


KeysetSize (Propiedad, datos remotos)

Devuelve o establece un valor que indica el número de filas del búfer de conjunto de claves.

Sintaxis

objeto.KeysetSize [= valor]

La sintaxis de la propiedad KeysetSize consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Long según se describe en Valores.

Valores

Los valores admitidos para valor deben ser mayores o iguales que los de la propiedad RowsetSize.

Comentarios

La propiedad KeysetSize es un valor que especifica el número de filas del conjunto de claves de un cursor de tipo keyset o dynamic de un objeto rdoResultset. Si el tamaño del conjunto de claves es 0 (que es el valor predeterminado), el cursor estará controlado completamente por el conjunto de claves. Si es mayor que cero, el cursor será mixto (controlado por el conjunto de claves dentro de éste y dinámico fuera de él).

Si el valor de KeysetSize es mayor que el de RowsetSize, definirá el número de filas del conjunto de claves que el controlador almacenará en el búfer.

No todos los orígenes de datos ODBC admiten cursores de tipo keyset.

Nota puesto que la versión 2.5 del controlador ODBC Microsoft SQL Server no admite cursores mixtos, si establece un valor, KeysetSize se restablecerá a 0 y el controlador devolverá el error 01S02: "Valor de opción cambiado".

Advertencia Al usar la concurrencia rdConcurLock (pesimista), el valor de KeysetSize determina el número de filas bloqueadas al abrir el cursor por primera vez. El conjunto de claves completo permanecerá bloqueado mientras el cursor esté abierto.


LastModified (Propiedad, datos remotos)

Devuelve un marcador que indica la fila modificada o agregada más recientemente.

Sintaxis

objeto.LastModified

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor que devuelve esta propiedad es de tipo Variant (cadena), según se describe en Comentarios.

Comentarios

Después de usar el método AddNew para agregar una nueva fila o modifica una fila existente mediante el método Update, la propiedad LastModified devuelve un marcador de posición como puntero a la fila modificada más recientemente, siempre y cuando el conjunto de claves admita adiciones. Es decir, si se agregan nuevas filas al conjunto de claves y a las tablas de la base de datos subyacente, la propiedad LastModified señalará a esta nueva fila del conjunto de claves.

Para posicionar el puntero de la fila activa a esta fila, establezca la propiedad Bookmark del objeto rdoResultset (el mismo) a la propiedad LastModified.

Si no ha habido modificaciones en el objeto rdoResultset, la propiedad LastModified devolverá 0.

No todos los tipos de objetos rdoResultset admiten adiciones a sus conjuntos de claves, por lo que la propiedad LastModified puede tener el valor 0 después de agregar una fila. Por ejemplo, aunque un conjunto de claves estático de cursores ODBC puede actualizarse, no es posible agregarle nuevas filas. Las inserciones se realizan en la base de datos, pero no en el conjunto de claves, por lo que la propiedad LastModified en este caso siempre devolverá 0.

Los cursores de tipo keyset del lado del servidor permiten adiciones al conjunto de claves, de forma que el método AddNew establece la propiedad LastModified, al igual que el método Update.

Los cursores de tipo static del lado del cliente no agregan nuevas filas a los miembros del cursor, por lo que el valor de la propiedad LastModified está indefinido cuando se utiliza el método AddNew. Sin embargo, se define después de usar el método Update. Los cursores de tipo static del lado del servidor son de sólo lectura, por lo que la propiedad LastModified no es relevante en este caso.

Los cursores de tipo dynamic y forward-only no aceptan marcadores de posición (como indica la propiedad Bookmarkable que devuelve False), por lo que la propiedad LastModified no es relevante en estos cursores.

La biblioteca de cursores por lotes del cliente también acepta la propiedad LastModified. Para los cursores de tipo static, se agregan nuevas filas al miembro del cursor, de forma que el método AddNew establece la propiedad LastModified, al igual que el método Update.


Ejemplo de las propiedades LastModified, Bookmark

Este ejemplo ilustra el uso de la propiedad LastModified para situar el puntero de fila actual en la fila que RDO ha modificado más recientemente. El código abre una conexión con SQL Server y crea una consulta basada en un cursor de conjunto de claves dirigida a la tabla Authors. La consulta espera que un único parámetro indique el nombre del autor que se va a modificar. Una vez seleccionado, modificado y actualizado, el puntero de fila se sitúa en la última fila modificada, estableciendo para ello la propiedad Bookmark del objeto rdoResultset a la propiedad LastModified.

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub TestLM_Click()
qy(0) = LookFor.Text

rs.Edit
rs!City = NewCity.Text   ' control TextBox
rs.Update

rs.Bookmark = rs.LastModified

' Mostrar los datos en un control de imagen
Pic.Cls   ' Borrar el control de imagen.

For Each col In rs.rdoColumns
    Pic.Print col.Name,
Next
Pic.Print String(80, "-")
For Each col In rs.rdoColumns
    Pic.Print col,
Next

End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection

With qy
    .Name = "ShowWhite"
    .SQL = "Select * from Authors " _
      & " where Au_LName like ?"
    .LockType = rdConcurReadOnly
    .CursorType = rdOpenForwardOnly
    .RowsetSize = 1
    Set .ActiveConnection = cn
End With

qy(0) = LookFor.Text      ' control TextBox
Set rs = qy.OpenResultset(rdOpenKeyset, rdConcurRowver)

Exit Sub
End Sub


LastQueryResults (Propiedad)

Devuelve una referencia al objeto rdoResultset que ha generado la última consulta, si la ha habido.

Sintaxis

objeto.LastQueryResults

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor de la propiedad LastQueryResults es una expresión de objeto que especifica un objeto rdoResultset válido o Nothing si no hay ningún conjunto de resultados disponible.

Comentarios

Esta nueva propiedad contiene una referencia al objeto rdoResultset que ha generado la última consulta ejecutada en la conexión, si ha habido alguna. La necesidad de esta propiedad proviene de la característica "consultas como métodos", que permite al programador invocar sus consultas y procedimientos almacenados como métodos del objeto Connection primario. Como los procedimientos almacenados pueden devolver un valor devuelto y también conjuntos de resultados, el programador necesita esta propiedad para obtener una referencia al conjunto de resultados creado durante la última llamada de consulta como método. El programador usaría esta propiedad de la forma que se indica a continuación:

Dim RetCode As Long
Dim rs as rdoResultset
RetCode = MiConexión.MiConsulta(x,y,z)
Set rs = MiConexión.LastQueryResults

Esta propiedad vuelve a establecerse a Nothing la próxima vez que se ejecuta la consulta en la conexión. La propiedad se actualiza con cualquier consulta que se ejecute en la conexión, incluso cuando el programador utilice los métodos OpenResultset o Execute en lugar de invocar la consulta como un método del objeto Connection.


LockEdits (Propiedad, datos remotos)

Devuelve un valor de tipo Boolean que indica el tipo de bloqueo en vigor.

Sintaxis

objeto.LockEdits

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por LockEdits son los siguientes:

Valor | Descripción
True | Se utiliza bloqueo pesimista.
False | (Predeterminado) Se utiliza bloqueo optimista.

Comentarios

Si una página está bloqueada y el origen de datos utiliza bloqueo de páginas, ningún otro usuario podrá modificar filas contenidas en la misma página. Si se utiliza el bloqueo a nivel de filas, se bloquea la fila que se está modificando y todas las demás del conjunto de filas. El conjunto de filas se define como el número de filas especificado por la propiedad RowsetSize. Si LockEdits es True y otro usuario ya tiene la página bloqueada, se producirá un error al intentar usar el método OpenResultset. En general, los demás usuarios pueden leer datos de las páginas bloqueadas.

Si LockEdits es False (valor predeterminado) y utiliza después Update mientras la página está bloqueada por otro usuario, se producirá un error. Para ver los cambios que otro usuario ha realizado en la fila (y perder sus propios cambios), establezca la propiedad Bookmark del objeto rdoResultset a su propio valor.

Nota El tamaño de la página de datos está determinado por el origen de datos. Microsoft SQL Server utiliza páginas de datos de 2 KB.


LockType (Propiedad, datos remotos)

Devuelve o establece un valor entero de tipo Long que indica el tipo de tratamiento de concurrencia.

Sintaxis

objeto.LockType [= valor]

La sintaxis de la propiedad LockType consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor de tipo Long, según se describe en Valores.

Valores

Los valores admitidos para valor son:

Constante | Valor | Descripción
rdConcurReadOnly | 1 | (Predeterminado) El cursor es de sólo lectura. No se admiten actualizaciones.
rdConcurLock | 2 | Concurrencia pesimista.
rdConcurRowVer | 3 | Concurrencia optimista basada en el identificador de fila.
rdConcurValues | 4 | Concurrencia optimista basada en los valores de las filas.
rdConcurBatch | 5 | Concurrencia optimista con actualizaciones por lotes. Se obtienen valores de estado para cada fila actualizada correctamente.

Comentarios

Para mantener un control adecuado sobre los datos que se van a actualizar, RDO cuenta con distintas opciones de concurrencia que controlan la forma en que se concede o deniega a otros usuarios el acceso a los datos. En muchos casos, al bloquear una fila determinada con alguna de las opciones de LockType, el motor remoto puede bloquear también toda la página que contiene la fila. Si hay demasiadas páginas bloqueadas, el motor remoto puede llegar a bloquear la tabla para mejorar el rendimiento general del sistema.

No todos los orígenes de datos admiten todos los tipos de bloqueos. Por ejemplo, para los servidores SQL Server y Oracle que utilizan la biblioteca de cursores rdUseODBC, los objetos rdoResultset de tipo static sólo admiten rdConcurValues o rdConcurReadOnly.

Si el origen de datos no admite la opción de concurrencia, el controlador la sustituirá en tiempo de ejecución, en caso de que haya otra disponible. Si el controlador no encuentra una alternativa de concurrencia adecuada, se producirá un error interceptable (código SQLState 01S02 "Valor de opción cambiado"). En el caso de rdConcurValues, lo sustituye por rdConcurRowVer y viceversa. Para rdConcurLock, la sustitución es por rdConcurRowVer o rdConcurValues, en ese orden.

Elegir una opción de concurrencia

Nota La concurrencia con RDO no tiene el mismo comportamiento que para los Objetos de acceso a datos (DAO). Asegúrese de leer las secciones siguientes para determinar el tipo de control de concurrencia que mejor se adapte a su aplicación.

  • Concurrencia de sólo lectura: esta opción no impone bloqueos de exclusividad sobre las filas obtenidas. Sin embargo, en la mayoría de los casos implicará recibir un bloqueo compartido para el acceso a las filas. Es decir, los demás usuarios no podrán tener bloqueos exclusivos (para lectura y escritura o intento de escritura) sobre las mismas páginas. Al elegir esta opción, el cursor es de sólo lectura, aunque ello no impide usar consultas de acciones para actualizar los datos independientemente del cursor. Ésta es la opción predeterminada para LockType.

  • Concurrencia pesimista: esta opción solicita un bloqueo exclusivo inmediato sobre las filas del cursor, con lo que se logra el nivel de bloqueo mínimo suficiente para asegurar que la fila puede actualizarse. A diferencia de DAO, que retrasa el bloqueo hasta que se utiliza el método Edit, RDO bloquea las primeras RowsetSize filas del conjunto de resultados la primera vez que se abre el cursor con el método OpenResultset. Es decir, si RowsetSize indica 100 filas, se indica al motor remoto que bloquee cada página que contenga alguna de estas filas seleccionadas. Esto significa que pueden quedar bloqueadas hasta 100 páginas, lo que puede implicar el bloqueo de cientos de filas. Al ir desplazándose el puntero de fila actual por el conjunto de resultados, se irán bloqueando páginas adicionales y aquellas a las que ya no se haga referencia quedarán liberadas. Esta técnica asegura a la aplicación que ningún otro programa recibirá acceso exclusivo (de lectura y escritura) sobre ninguna de las filas que el cursor está procesando.

  • Concurrencia optimista: este tipo de administración de la concurrencia no bloquea filas ni páginas. Simplemente, compara la fila enviada a la base de datos con la que hay en el servidor. Dependiendo del tipo de concurrencia optimista elegido, RDO y las capas de ODBC compararán con los valores existentes el identificador de fila, los valores de datos de la fila, las columnas TimeStamp o las combinaciones de estas opciones para determinar si la fila ha cambiado desde que se la tomó de la base de datos. Si no ha habido cambios, se realiza la actualización. De lo contrario, se producirá un error interceptable.

La propiedad LockType contempla tres tipos de concurrencia optimista, que se describen más adelante. Al usar la opción de concurrencia optimista por lotes (rdConcurBatch), también deberá establecer la propiedad UpdateCriteria para elegir una opción de actualización de concurrencia adecuada.

  • Concurrencia optimista. Versión de fila: comparando el identificador de fila (normalmente una columna TimeStamp), RDO puede determinar si la fila ha cambiado desde que se leyó. Si es así, se produce un error interceptable.

  • Concurrencia optimista. Valores de la fila: comparando columna por columna los valores de la fila, RDO puede determinar si ha cambiado desde que se leyó. Si es así, se produce un error interceptable.

  • Concurrencia optimista por lotes: este tipo de concurrencia utiliza la propiedad UpdateCriteria para determinar la forma de comprobar si las filas han cambiado al emplear el método UpdateBatch.


LoginTimeout (Propiedad, datos remotos)

Devuelve o establece un valor que especifica el número de segundos que el Administrador de controladores ODBC espera antes de que se produzca un error de espera al abrir una conexión.

Sintaxis

objeto.LoginTimeout [= valor]

La sintaxis de la propiedad LoginTimeout consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el número de segundos que el Administrador de controladores espera antes de agotar el intervalo y producir un error.

Comentarios

Si valor es 0, no se excede nunca el tiempo de espera y no se produce ningún error si no se puede establecer una conexión. Si no utiliza conexiones asíncronas, este valor puede hacer que la aplicación se bloquee indefinidamente.

Al intentar conectar con una base de datos ODBC, como por ejemplo SQL Server, pueden producirse retrasos debidos al tráfico de la red o a un uso intensivo del origen de datos ODBC. En lugar de esperar indefinidamente, puede especificar el tiempo de espera antes de que el Administrador de controladores ODBC produzca un error.

El tiempo de espera predeterminado es 15 segundos o un valor especificado por la propiedad rdoDefaultLoginTimeout. Cuando se utiliza con un objeto rdoEnvironment, la propiedad LoginTimeout especifica un valor global para todas las operaciones de conexión asociadas a él. El valor de LoginTimeout para un objeto rdoConnection anula el valor predeterminado.

Si el valor especificado excede el tiempo máximo de espera del origen de datos, o si es inferior al mínimo, el controlador lo sustituirá como corresponda y en la colección rdoErrors se registrará el error siguiente: SQLState 01S02 "Valor de opción cambiado".

Normalmente, una conexión con un servidor remoto situado en una red de área local (LAN) tarda menos de ocho segundos en efectuarse. Las conexiones de Servicio de acceso remoto (RAS) o de Internet pueden tardar mucho más, dependiendo del ancho de banda de la red de área extensa, el tráfico de la red y otros factores.


LogMessages (Propiedad, datos remotos)

Activa el registro de seguimiento de ODBC y devuelve o establece un valor que indica la ruta de acceso del archivo de seguimiento de ODBC que crea el Administrador de controladores ODBC para registrar todas las operaciones de ODBC.

Sintaxis

objeto.LogMessages [= valor]

La sintaxis de la propiedad LogMessages consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo String, según se describe en Valores.

Valores

Valor contiene la ruta de acceso de un archivo ASCII utilizado para registrar las operaciones de ODBC. Si la propiedad LogMessages es una cadena vacía, las operaciones no se registran.

Comentarios

Cuando la propiedad LogMessages es True, todos los comandos de ODBC se envían a un archivo de registro ASCII que puede emplearse para depurar o ajustar las consultas u otras operaciones.

En Windows NT o Windows 95, el seguimiento sólo debe hacerse para una única aplicación, o bien cada aplicación debe especificar un archivo de seguimiento distinto. De lo contrario, es posible que dos o más aplicaciones intenten abrir el mismo archivo de seguimiento al mismo tiempo, provocando un error.

Nota El rendimiento de ODBC se ve afectado negativamente cuando está activado el registro.


MaxRows (Propiedad, datos remotos)

Devuelve o establece un valor que indica el número máximo de filas que puede devolver una consulta o que pueden procesarse en una consulta de acciones.

Sintaxis

objeto.MaxRows [= valor]

La sintaxis de la propiedad MaxRows consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Long, según se describe en Valores.

Valores

Los valores admitidos para valor pueden estar entre 0 y cualquier número. Si valor se establece a 0, no hay ningún límite en cuanto al número de filas devueltas. Ésta es la opción predeterminada. No es válido establecer valor como un número negativo, si lo hace, de forma automática tomará como valor 0.

Comentarios

La propiedad MaxRows limita el número de filas procesadas por el servidor remoto. Cuando en MaxRows se establece un valor mayor que 0, sólo se procesarán 'n' filas. Al ejecutar una consulta que devuelve filas, esto significa que sólo se obtendrán las 'n' primeras filas. Al ejecutar una consulta de acciones, sólo se actualizarán, insertarán o eliminarán las 'n' primeras filas.

Esta propiedad es útil en situaciones en que las limitaciones de los recursos dificultan la administración de grandes números de filas del conjunto de resultados. Si establece 1 en MaxRows para una consulta de acciones, se asegura de que la operación no afectará a más de una fila.


Ejemplo del método MoreResults

El ejemplo siguiente demuestra el uso del método MoreResults. En este ejemplo se ejecuta una consulta SQL que contiene tres consultas SELECT distintas. La primera consulta devuelve simplemente el número de autores de la tabla Publishers. Las dos consultas siguientes devuelven cada una dos columnas que provienen de operaciones de combinación más complejas. Toda esta información se muestra en un control ListBox.

Option Explicit
Dim Cn As New rdoConnection
Dim Rs As rdoResultset
Dim SQL As String

Private Sub Test_Click()
SQL = "Select Count(*) From Publishers" _
   & " Select Pub_Name, Title  " _
   & " From Publishers P, Titles T" _
   & " Where P.Pub_ID = T.Pub_ID" _
   & " Select Au_Lname, Title " _
   & " From Titles T, TitleAuthor Ta, Authors A" _
   & " Where T.title_ID = ta.Title_ID " _
   & " and Ta.Au_ID = A.Au_ID"
Set Rs = Cn.OpenResultset(SQL, rdOpenForwardOnly, _
   rdConcurReadOnly)
' Del primer conjunto de resultados
List1.AddItem "Editores: " & Rs(0)
'
'   Bucle por todo el conjunto de resultados
'
Do While Rs.MoreResults
   List1.AddItem Rs(0).Name & " - " & Rs(1).Name
   Do Until Rs.EOF
      List1.AddItem Rs(0) & "     -    " & Rs(1)
      Rs.MoveNext
   Loop
Loop
End Sub

Private Sub Form_Load()
On Error GoTo CnEh
With Cn
   .Connect = "UID=;PWD=;Database=Pubs; " _
   & "Server=SEQUEL;Driver={SQL Server}" _
   & "DSN=''; "
   .LoginTimeout = 5
   .CursorDriver = rdUseOdbc
   .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub

CnEh:
Dim er As rdoError
Debug.Print Err, Error
For Each er In rdoErrors
   Debug.Print er.Description, er.Number
Next er
Resume Next
End Sub


Ejemplo de métodos Move

Este ejemplo demuestra el uso de la opción rdAsyncEnable junto con el método MoveLast. La tabla Phones es simplemente una tabla con más de 15.000 filas que tarda cierto tiempo en procesarse. Aunque no sea una técnica recomendable, proporciona una forma de ilustrar una consulta que tarda mucho tiempo en ejecutarse y completarse completamente, como sucede cuando ejecuta el método MoveLast. La aplicación usa una barra de estado para indicar el nivel de realización de las operaciones.

Option Explicit
Dim rdoCn As New rdoConnection
Dim rdoRs As rdoResultset
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

Private Sub Command1_Click()
TimeExpected = 5      'Esperamos que tarde unos 5 segundos
SQL = "Select Email, Name From Phones"
Set rdoRs = rdoCn.OpenResultset(Name:=SQL, _
   Type:=rdOpenStatic, _
   LockType:=rdConcurReadOnly, _
   Option:=rdAsyncEnable)
ShowProgress "Query"
    '
'   Consulta terminada... ahora vamos a la última fila
    '
rdoRs.MoveLast rdAsyncEnable
' Esperamos que tarde unos 15 segundos
TimeExpected = 15
ShowProgress "MoveLast"
rdoCn.Close
End Sub

Sub ShowProgress(Operation As String)
Ts = Timer
'  tiempo para ejecutar la consulta
ProgressBar1.Max = TimeExpected
While rdoRs.StillExecuting
   Tn = Int(Timer - Ts)
   If Tn < TimeExpected Then
      ProgressBar1 = Tn
   Else
      ProgressBar1.Max = ProgressBar1.Max + 10
      TimeExpected = ProgressBar1.Max
   End If
   DoEvents
Wend
Status = Operation & "Terminada. Duración: "  _
   & Int(Timer - Ts)
End Sub
Private Sub Form_Load()
With rdoCn
   .Connect = "UID=;PWD=;Database=WorkDB;" _
   & "Server=BETAV486;Driver={SQL Server}" _
   & "DSN='';"
   .LoginTimeout = 5
   .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub
End Sub


Name (Propiedad, datos remotos)

Devuelve el nombre de un objeto RemoteData.

Sintaxis

objeto.Name

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad Name devuelve una expresión de cadena que representa el nombre asignado al objeto. En la tabla siguiente se indica la forma en que se asigna un nombre a cada objeto.

Asignación de la propiedad Name a los objetos de datos remotos

Objeto de datos remotos | La propiedad Name la determina …
rdoEnvironments(0) | rdoEngine — Con el valor "Default_Environment".
rdoEnvironments(1-n) | El argumento nombre de rdoCreateEnvironment.
rdoConnection | El nombre de origen de datos (DSN) utilizado para la conexión.
rdoResultset | Los 256 primeros caracteres de la consulta SQL.
rdoQuery | El argumento nombre del método CreateQuery o se establece directamente para los objetos rdoQuery autónomos.
rdoTable | El nombre de tabla de la base de datos una vez llena la colección rdoTables.
rdoParameter | "Paramn", donde "n" es el número ordinal.
rdoColumn | El nombre de columna de la base de datos.
rdoError | No aplicable. Sólo es posible hacer referencia a los miembros de la colección rdoErrors por su número ordinal.

Comentarios

Los objetos rdoTable y rdoQuery no pueden compartir el mismo nombre. Es decir, no puede crear dos objetos rdoQuery con el mismo nombre.

Utilice la propiedad Name para hacer referencia a miembros de una colección en el código, pero en la mayoría de los casos lo más sencillo es usar simplemente el número ordinal. En general, puede usar la propiedad Name para asignar nombres de tablas y columnas de base de datos.


Ejemplo de la propiedad Name (RDO)

El ejemplo siguiente ilustra el uso de la propiedad Name para exponer los nombres de todas las tablas asociadas a una base de datos determinada, los nombres de cada columna de la tabla seleccionada e información de tipo específica de una columna en particular. Esta aplicación utiliza tres controles ListBox y un control CommandButton.

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rs As rdoResultset
Dim tb As rdoTable
Dim cl As rdoColumn
Dim er As rdoError

Private Sub Command1_Click()
Set en = rdoEngine.rdoEnvironments(0)

Set cn = en.OpenConnection(dsName:="WorkDB", _
    prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=Pubs")

For Each tb In cn.rdoTables
    List1.AddItem tb.Name
Next
List1.ListIndex = 1
End Sub

Private Sub List1_Click()
List3.Enabled = False
List2.Clear
For Each cl In cn.rdoTables((List1)).rdoColumns
    List2.AddItem cl.Name
Next
List3.Enabled = True
End Sub

Private Sub List2_Click()
List3.Clear
With cn.rdoTables((List1)).rdoColumns((List2))
    List3.AddItem "Columna de origen:" & .SourceColumn
    List3.AddItem "Tabla de origen:" & .SourceTable
    List3.AddItem "Tipo:" & .Type
    List3.AddItem "Tamaño:" & .Size
    List3.AddItem "Posición ordinal:"  _
   & .OrdinalPosition
    List3.AddItem "¿Permitir longitud cero?" _
    & .AllowZeroLength
    List3.AddItem "Requerido:" & .Required
    List3.AddItem "¿Se requiere un fragmento?:" & .ChunkRequired
    List3.AddItem "¿Es actualizable?:" & .Updatable
End With
End Sub


Number (Propiedad, datos remotos)

Devuelve un valor numérico que especifica un error nativo.

Sintaxis

objeto.Number

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto es un entero de tipo Long que representa un número de error.

Comentarios

Utilice la propiedad Number para determinar la naturaleza de un error surgido en el servidor remoto o en la interfaz ODBC con el origen de datos. El valor de la propiedad es un número que corresponde de forma única a una condición de error generada por un procedimiento almacenado, la sintaxis u otro error de procedimiento, una infracción de permisos o de reglas, o bien un error de algún otro tipo. Este número nativo también puede provenir de un procedimiento remoto que ejecute una instrucción como RAISERROR de SQL Server.

Nota El controlador ODBC no obtiene el nivel de gravedad de error de SQL Server y por ello este valor no está disponible.


Ejemplo de las propiedades Description, Number

El código siguiente abre un cursor ODBC de sólo lectura en el servidor "SEQUEL" de SQL Server e incluye un controlador de errores sencillo que muestra la descripción del error y su número.

Sub MakeConnection()
Dim rdoCn As New rdoConnection
On Error GoTo CnEh
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .CursorDriver = rdUseODBC
    .EstablishConnection rdDriverNoPrompt, True
End With
AbandonCn:
Exit Sub

CnEh:
Dim er As rdoError
Dim msg as string
    Msg = "Se ha producido un error " _
    & "al abrir la conexión:" _
    & Err & " - " & Error & VbCr
    For Each er In rdoErrors
        Msg = Msg & er.Description  _
         & ":" & er.Number & VbCr
    Next er
    Resume AbandonCn
End Sub


Options (Propiedad, datos remotos)

Devuelve o establece un valor que especifica una o más características operativas del control RemoteData.

Sintaxis

objeto.Options [= valor ]

La sintaxis de la propiedad Options consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor de tipo Integer, según se describe en Valores.

Valores

Para establecer la propiedad Options del control RemoteData puede usar los valores siguientes:

Constante | Valor | Descripción
rdAsyncEnable | 32 | Ejecutar la consulta de forma asíncrona.
rdExecDirect | 64 | Usar la función SQLExecDirect de la API de ODBC para ejecutar la consulta.

Comentarios

Esta propiedad se corresponde con el argumento opciones de los métodos OpenResultset y Execute. Si modifica la propiedad Options en tiempo de ejecución, deberá usar el método Refresh para que el cambio tenga efecto.

Activar operaciones asíncronas

Las operaciones asíncronas permiten a los objetos RemoteData funcionar en segundo plano en operaciones tales como crear conjuntos de resultados o ejecutar procedimientos mientras el código de primer plano continúa ejecutándose.

Siempre que utilice los métodos OpenResultset, Execute, Move o MoreResults con la opción rdAsyncEnable, el control vuelve inmediatamente a la aplicación, aún antes de que RDO complete la operación. Si es necesario, RDO comprobará periódicamente el origen de datos para averiguar si la operación se ha completado. Puede ajustar la frecuencia de esta comprobación si establece la propiedad AsyncCheckInterval. Para ver si la operación se ha completado, compruebe la propiedad StillExecuting, que permanecerá con el valor True hasta que RDO termine la operación. Para cancelar la operación, utilice el método Cancel del objeto rdoResultset. Además, cuando se finalizan las consultas, RDO genera el evento QueryComplete para indicar que el objeto rdoResultset está listo para el acceso.

Activar el uso de SQLExecDirect

Si utiliza la opción rdExecDirect, RDO usará la función SQLExecDirect de la API de ODBC para ejecutar la consulta. En este caso no se crea ningún procedimiento almacenado temporal para ejecutar la consulta. Esta opción puede ahorrar tiempo si la consulta se va a ejecutar pocas veces a lo largo de la aplicación. Además, si se trabaja con consultas que no deban ejecutarse como procedimientos almacenados, sino directamente, esta opción es obligatoria. Por ejemplo, para las consultas que crean tablas temporales para su uso por parte de consultas posteriores es necesario usar la opción rdExecDirect.


OrdinalPosition (Propiedad, datos remotos)

Devuelve la posición relativa de un objeto rdoColumn dentro de la colección rdoColumns.

Sintaxis

objeto.OrdinalPosition

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto de la propiedad OrdinalPosition es una expresión de tipo Integer, según se describe en Comentarios.

Comentarios

Las columnas de datos de un objeto rdoResultset se devuelven en el orden que especifica la consulta y se numeran comenzando por 1. Debido a este método de numeración, la primera columna de un objeto rdoResultset (rdoResultset(0)) tiene un valor de OrdinalPosition 1.


Ejemplo de la propiedad OrdinalPosition

En este ejemplo se ilustra la forma en que se numeran las columnas con la propiedad OrdinalPosition.

Private Sub ShowOrdinals()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim cl As rdoColumn
Dim er As rdoError

On Error GoTo EH
With cn
    .Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
    .CursorDriver = rdUseNone
    .EstablishConnection rdDriverNoPrompt
    Set rs = cn.OpenResultset( _
      "select * from titles where Price < 50")
    For Each cl In rs.rdoColumns
        Debug.Print cl.OrdinalPosition,  _
         cl.Name, cl.Value
    Next
End With
Exit Sub
EH:
    For Each er In rdoErrors
        Debug.Print er.Description
    Next er
    Resume Next
End Sub


OriginalValue (Propiedad)

Devuelve el valor que tenía la columna cuando se obtuvo de la base de datos.

Sintaxis

objeto.OriginalValue

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor de la propiedad OriginalValue es de tipo Variant y su tipo de datos viene determinado por el del objeto rdoColumn especificado.

Comentarios

Al realizar operaciones de actualización optimista por lotes, puede ser necesario resolver conflictos de actualización mediante la comparación de los valores que tenían las columnas cuando las obtuvo RDO con el valor suministrado por el usuario. La propiedad OriginalValue proporciona el valor que se obtuvo de la base de datos.


Password (Propiedad, datos remotos)

Representa la contraseña utilizada durante la creación de un objeto rdoEnvironment.

Sintaxis

objeto.Password

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

La propiedad rdoDefaultPassword del objeto rdoEngine se utiliza como valor predeterminado cuando no se facilita ninguna contraseña. La contraseña predeterminada inicial es "".

El valor de esta propiedad es de sólo escritura: sólo puede facilitarse desde el código y no puede leerse en la propiedad Password.

La contraseña se establece en las siguientes circunstancias:

  • Cuando el control RemoteData crea automáticamente el objeto rdoEnvironment.

  • En la primera referencia a un objeto RemoteData.

  • Cuando se ejecuta el método rdoCreateEnvironment.

  • En la cadena de conexión a través de la propiedad Connect o el argumento Connect del método OpenConnection.


PercentPosition (Propiedad, datos remotos)

Devuelve o establece un valor que indica o modifica la ubicación aproximada de la fila actual en el objeto rdoResultset, basándose en el porcentaje con respecto al total de filas de dicho objeto.

Sintaxis

objeto.PercentPosition [= valor]

La sintaxis de la propiedad PercentPosition consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un número comprendido entre 0,0 y 100,00. (El tipo de datos es Single)

Comentarios

Para indicar o modificar la posición aproximada de la fila actual en un objeto rdoResultset, puede comprobar o establecer la propiedad PercentPosition. Antes de hacerlo, pueble el objeto rdoResultset situándose en la última fila. Si utiliza la propiedad PercentPosition antes de llenar por completo el conjunto de resultados, el movimiento será relativo al número de filas que se hayan obtenido hasta el momento, según indica la propiedad RowCount. Para situarse en la última fila y llenar el objeto rdoResultset puede usar el método MoveLast.

Nota No es recomendable emplear la propiedad PercentPosition para situar el puntero de fila actual en una fila específica de un objeto rdoResultset. Las propiedades Bookmark o AbsolutePosition son más adecuadas para este propósito.

Una vez establecida la propiedad PercentPosition a un valor, la fila situada en la posición que corresponde aproximadamente a tal valor pasa a ser la fila actual y PercentPosition se establece a un valor que refleja la posición aproximada de la fila actual. Por ejemplo, si el objeto rdoResultset sólo contiene cinco filas y se establece el valor 77 en su propiedad PercentPosition, el valor que devolverá PercentPosition podría ser 80, y no 77.

Puede usar la propiedad PercentPosition con una barra de desplazamiento de un control Form o TextBox para indicar la ubicación de la fila actual en un objeto rdoResultset.

No todos los tipos de cursores y combinaciones de controladores admiten el uso de la propiedad PercentPosition. Por ejemplo, esta propiedad sólo se aplica a los objetos rdoResultset de tipo keyset y dynamic. Si no se admite el valor, la propiedad PercentPosition devolverá el valor 50. Si no es posible establecer la posición, no se producirá ningún desplazamiento.


Ejemplo de la propiedad PercentPosition

Este ejemplo ilustra el uso de la propiedad PercentPosition. En él se crea una lista de editores y cuando se elige uno de ellos aparece una lista con los títulos asociados en un control DataGrid. Cuando se utiliza la barra de desplazamiento asociada a la cuadrícula, se determina y se muestra la posición relativa de la fila seleccionada examinando la propiedad PercentPosition. Si desea más información, vea el ejemplo de la propiedad AbsolutePosition.

Dim rs As rdoResultset

Private Sub Form_Load()
Dim Li As Integer
'
'   Rellenar la lista del cuadro combinado Sections.
'
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=BETAV486;database=pubs;")

MsRdc1.Connect = cn.Connect

Set rs = cn.OpenResultset _
    ("Select distinct Pub_Name, Pub_ID from Publishers", rdOpenStatic, rdConcurReadOnly)
Do Until rs.EOF
    If rs(0) = Null Then
    Else
        PubList.AddItem " " & rs!Pub_ID & ":" & rs!Pub_Name
    End If
    rs.MoveNext
Loop
PubList.ListIndex = 1
rs.Close

Publist_Click

End Sub

Private Sub MoveCRow_Change()
MoveCRow_Scroll
End Sub

Private Sub MoveCRow_Scroll()
PercentPoint = MoveCRow.Value & "%"
MsRdc1.Resultset.PercentPosition = MoveCRow.Value
End Sub

Private Sub Publist_Click()
SetSQL
If MsRdc1.Resultset.EOF Then
    MoveCRow.Enabled = False
Else
    MoveCRow.Enabled = True
    MsRdc1.Resultset.MoveFirst
End If
End Sub

Sub SetSQL()
Dim PubWanted As String
PubWanted = Trim(Left(PubList, InStr(PubList, ":") - 1))
Screen.MousePointer = vbHourglass

MsRdc1.SQL = "select * from Titles" _
    & " where Pub_ID = '" _
    & PubWanted & "'" _
    & " order by Title"
MsRdc1.Refresh
Screen.MousePointer = vbDefault
End Sub


Prepared (Propiedad)

Devuelve o establece un valor que determina si la consulta debe prepararse con la función SQLPrepare o SQLExecDirect de la API de ODBC.

Sintaxis

objeto.Prepared [= valor]

La sintaxis de la propiedad Prepared consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de tipo Boolean, según se describe en Valores.

Valores

El valor admitido para a propiedad Prepared es:

Valor | Descripción
True | La instrucción se prepara (predeterminado)
False | La instrucción no se prepara.

Comentarios

De forma predeterminada, la propiedad Prepared es True. Sin embargo, puede establecerla a False para impedir la "preparación" de la consulta. En tal caso, se ejecutará con la función SQLExecDirect de la API.

Cuando la interfaz de ODBC envía una consulta al servidor remoto, puede enviarla directamente al servidor o crear un procedimiento almacenado que realice la operación. La creación de un procedimiento almacenado puede hacer más lenta la operación inicial, pero mejora el rendimiento en las sucesivas referencias a la misma consulta. Sin embargo, algunas consultas no pueden ejecutarse en forma de procedimientos almacenados. En estos casos, deberá establecer la propiedad Prepare a False.


Prompt (Propiedad, datos remotos)

Devuelve o establece un valor que especifica si el Administrador de controladores ODBC debe solicitar los argumentos que falten en la cadena de conexión.

Sintaxis

objeto.Prompt [= valor]

La sintaxis de la propiedad Prompt consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor de tipo Integer, según se describe en Valores.

Valores

Los valores admitidos para la propiedad Prompt son:

Constante | Valor | Descripción
rdDriverPrompt | 0 | El Administrador de controladores muestra el cuadro de diálogo Orígenes de datos ODBC. La cadena utilizada para establecer la conexión se forma con el nombre del origen de datos (DSN) seleccionado, y el usuario la completa a través de cuadros de diálogo. O bien, si no se elige ningún DSN y la propiedad DataSourceName está vacía, se empleará el DSN predeterminado.
RdDriverNoPrompt | 1 | El Administrador de controladores utiliza la cadena de conexión especificada en conexión. Si en ella no se proporciona suficiente información, el método OpenConnection producirá un error interceptable.
RdDriverComplete | 2 | Si la cadena de conexión suministrada incluye la palabra clave DSN, el Administrador de controladores la usará tal y como aparece en conexión. De lo contrario, se comportará como si se hubiera especificado rdDriverPrompt.
rdDriverCompleteRequired | 3 | (Predeterminado) El funcionamiento es igual al de rdDriverComplete, excepto en que el controlador desactiva los controles que correspondan a información innecesaria para establecer la conexión.

Comentarios

Cuando RDO abre una conexión basándose en los parámetros del control RemoteData, se espera que la propiedad Connect contenga suficiente información para establecer la conexión. Si falta información como el nombre del origen de datos, el nombre de usuario o la contraseña, el Administrador de controladores ODBC presentará uno o más cuadros de diálogo para obtenerla del usuario. Si no desea que aparezcan estos cuadros de diálogo, establezca la propiedad Prompt a un valor que desactive esta característica.

Las constantes indicadas más arriba también se utilizan para establecer el comportamiento de solicitud de datos de ODBC para el método EstablishConnection.


QueryTimeout (Propiedad, datos remotos)

Devuelve o establece un valor que especifica el número de segundos que espera el Administrador de controladores ODBC antes de que se produzca un error de tiempo de espera al ejecutarse una consulta.

Sintaxis

objeto.QueryTimeout [= valor]

La sintaxis de la propiedad QueryTimeout consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el número de segundos que espera el Administrador de controladores antes de terminar la espera y producir un error.

Comentarios

El valor predeterminado de la propiedad QueryTimeout es 30 segundos. Cuando el acceso a un origen de datos ODBC se realiza mediante los métodos OpenResultset o Execute, pueden producirse retrasos debidos al tráfico de la red o a un uso intensivo del servidor remoto, quizá provocado por la consulta. En lugar de esperar indefinidamente, utilice la propiedad QueryTimeout para determinar el tiempo que la aplicación debe esperar antes de que se produzca el evento QueryTimeout y la aplicación genere un error interceptable. En este punto tiene la opción de seguir esperando durante otros 'n' segundos, según determine la propiedad QueryTimeout, o cancelar la consulta en proceso mediante el argumento Cancel del procedimiento del evento QueryTimeout.

El valor 0 en esta propiedad desactiva el cronómetro, con lo que la consulta se ejecutará indefinidamente. No se recomienda establecer QueryTimeout a 0 para las operaciones síncronas, ya que la aplicación puede bloquearse mientras dure la consulta.

Cuando se utiliza con un objeto rdoConnection, la propiedad QueryTimeout especifica un valor global para todas las consultas asociadas al origen de datos.

Al usar un objeto rdoQuery, la propiedad QueryTimeout del objeto rdoConnection se usa como valor predeterminado, a menos que especifique otro en la propiedad QueryTimeout del objeto rdoQuery.

Al trabajar con consultas asíncronas, la propiedad StillExecuting permanecerá con el valor True hasta que la consulta termine o se agote su tiempo de espera.

Si el tiempo especificado excede el máximo que permite el origen de datos, o si es menor que el mínimo permitido, el controlador lo sustituirá por el valor correspondiente y registrará en la colección rdoErrors el error siguiente: SQLState 01S02: "Valor de opción cambiado".


Ejemplo de la propiedad QueryTimeout y el evento QueryTimeout

El ejemplo siguiente configura los controladores de eventos de una consulta de forma que se ocupen de los excesos en los tiempos de espera. Observe que el procedimiento de evento QueryTimeout muestra un cuadro de mensajes que permite al usuario decidir si desea dedicar un tiempo de espera adicional a la consulta. El procedimiento ShowRows simplemente muestra las filas obtenidas.

Option Explicit
Dim en As rdoEnvironment
Dim cn As New rdoConnection
Dim rs As rdoResultset
Dim SQL As String
Dim col As rdoColumn
Dim er As rdoError
Public WithEvents Qd As rdoQuery

Private Sub cn_QueryTimeout( _
   ByVal Query As RDO.rdoQuery, Cancel As Boolean)
Dim ans As Integer
ans = MsgBox("Se ha excedido el tiempo de la consulta... Haga clic en Reintentar para seguir esperando", _
    vbRetryCancel + vbCritical, "La consulta tardó demasiado tiempo")
If ans = vbRetry Then
    Cancel = False
Else
    Cancel = True
End If
End Sub

Private Sub RunQuery_Click()

On Error GoTo RunQueryEH

    Qd(0) = Param1
    Qd.QueryTimeout = 5
    Set rs = Qd.OpenResultset(rdOpenKeyset, _
       rdConcurReadOnly)

    If rs Is Nothing Then Else ShowRows

Exit Sub

RunQueryEH:
Debug.Print Err, Error$
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next
    rdoErrors.Clear
    Resume Next

End Sub

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)
With cn
    .Connect = "uid=;pwd=;database=workdb;dsn=WorkDB;"
    .CursorDriver = rdUseClientBatch
    .EstablishConnection Prompt:=rdDriverNoPrompt
End With

Set Qd = cn.CreateQuery("LongQuery", "")
With Qd
    .SQL = "{call VeryLongStoredProcedure (?,?)}"
    .rdoParameters(1).Direction = rdParamOutput
    .rdoParameters(0).Type = rdTypeVARCHAR
End With

End Sub


rdoColumns (Propiedad)

Devuelve un miembro específico de una colección rdoColumns por posición o por clave.

Sintaxis

objeto.rdoColumns(índice)

La sintaxis de la propiedad rdoColumns consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoColumns. Por ejemplo, el objeto rdoQuery tiene una propiedad rdoColumns que es la colección de objetos rdoColumns que afectan al objeto rdoQuery.


rdoConnections (Propiedad)

Devuelve un miembro específico de una colección rdoConnections por posición o por clave.

Sintaxis

objeto.rdoConnections(índice)

La sintaxis de la propiedad rdoConnections consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoConnections. Por ejemplo, el objeto rdoEnvironment tiene una propiedad rdoConnections que es la colección de objetos rdoConnections que afectan al objeto rdoEnvironment.


rdoDefaultCursorDriver (Propiedad)

Devuelve o establece la biblioteca de cursores utilizada por el Administrador de controladores ODBC.

Sintaxis

objeto.rdoDefaultCursorDriver [= valor]

La sintaxis de la propiedad rdoDefaultCursorDriver consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor Integer que especifica un tipo de cursor ODBC como se describe en Valores.

Valores

Los valores admitidos para valor son:

Constante | Valor | Descripción
rdUseIfNeeded | 0 | (Predeterminado) RDO elige el estilo de cursores más apropiado para el controlador. Los cursores del servidor se utilizan si están disponibles.
rdUseODBC | 1 | RDO utiliza la biblioteca de cursores ODBC. Esto proporciona un mejor rendimiento para pequeños conjuntos de resultados pero perjudica considerablemente cuando se trata de conjuntos de resultados grandes.
rdUseServer | 2 | RDO utiliza cursores del servidor. Para la mayoría de las operaciones grandes esto proporcionará mejores resultados, pero puede provocar más tráfico en la red.
rdUseClientBatch | 3 | RDO usa la biblioteca de cursores optimista por lotes que requieren todas las operaciones por lotes y objetos rdoResultset disociados.
rdUseNone | 4 | RDO no crea un cursor desplazable. Básicamente es un conjunto de resultados de sólo lectura de tipo forward-only, con RowsetSize establecida a 1. Este tipo de conjunto de resultados se ejecuta más rápido que los que necesitan la creación de un cursor.

Comentarios

Cuando se utilizan cursores del servidor, el motor de base de datos usa sus propios recursos para almacenar valores del conjunto de claves. Los valores de los datos se siguen transmitiendo por la red como sucede con los cursores del lado del cliente, pero el impacto en la memoria de las estaciones de trabajo locales y el espacio de disco es reducido.

En SQL Server, los cursores del lado del servidor no se utilizan si el cursor es de sólo lectura y de tipo forward-only.


rdoDefaultErrorThreshold (Propiedad)

Devuelve o establece un valor que indica el valor predeterminado de la propiedad ErrorThreshold de objetos rdoQuery.

Nota Esta propiedad se proporciona por compatibilidad con el código de RDO 1.0. Debe sustituirse por código que implemente el evento InfoMessage del objeto rdoEngine, lo que proporciona una funcionalidad equivalente.

Comentarios

En la versión 4.x de Microsoft SQL Server no es posible establecer la gravedad de los errores mediante la instrucción RAISERROR. Como resultado, era necesaria la propiedad ErrorThreshold para permitir al código filtrar los mensajes que superan un determinado umbral de gravedad.

La versión 6.x de Microsoft SQL Server permite la inclusión de niveles de gravedad en la instrucción RAISERROR, por lo que ya no es necesario usar la propiedad ErrorThreshold.

Las capas de ODBC interceptan todos los errores devueltos con un nivel de gravedad menor que 10 y establecen como código de resultado SQL_SUCCESS_WITH_INFO. Esto hace que RDO llame al evento InfoMessage pero no detiene el proceso de consulta.


rdoDefaultLoginTimeout (Propiedad)

Devuelve o establece un valor predeterminado que determina el número de segundos que el controlador ODBC espera antes de abandonar un intento de conectarse a un origen de datos.

Sintaxis

objeto.rdoDefaultLoginTimeout [= valor]

La sintaxis de la propiedad rdoDefaultLoginTimeout consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión Long que especifica el número de segundos como se describe en Valores.

Valores

El valor admitido para valor es el número de segundos que debe esperar para completar una solicitud de inicio de sesión antes de devolver un error interceptable a la aplicación o provocar un evento QueryTimeout. Un valor 0 indica que el tiempo de espera queda desactivado y el intento de conexión esperará indefinidamente o hasta que se complete la conexión.

Comentarios

La propiedad rdoDefaultLoginTimeout se utiliza de forma predeterminada en la aplicación a menos que se utilice la propiedad LoginTimeout del objeto rdoEnvironment para invalidar este valor.

Las peticiones de inicio de sesión se realizan cuando el control RemoteData crea objetos rdoConnection o cuando utiliza los métodos OpenConnection o EstablishConnection del objeto rdoEnvironment. El valor máximo depende del controlador del origen de datos. El controlador ODBC determina el valor máximo permisible para LoginTimeout; cualquier intento de establecer un valor mayor que éste se restablece a este valor máximo dependiente del controlador.

El valor de tiempo de espera predeterminado, si no se especifica, es de 15 segundos.

Cuando se excede el tiempo de espera, se desencadena el evento ConnectionTimeout en el objeto primario rdoEnvironment.

Nota Cuando utiliza Objetos de acceso a datos (DAO, Data Access Objects), el argumento LOGINTIMEOUT utilizado en la propiedad Connect no es un argumento válido para cadenas de conexión ODBC. Utilice en su lugar la propiedad rdoDefaultLoginTimeout.


rdoDefaultUser, rdoDefaultPassword (Propiedades)

  • rdoDefaultUser: devuelve o establece el nombre de usuario predeterminado asignado a cualquier objeto rdoEnvironment nuevo.

  • rdoDefaultPassword: devuelve o establece la contraseña predeterminada asignada a cualquier objeto rdoEnvironment nuevo.

Sintaxis

objeto.rdoDefaultUser [= valor]

objeto.rdoDefaultPassword [= valor]

La sintaxis de las propiedades rdoDefaultUser y rdoDefaultPassword consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de cadena que especifica el nombre de usuario o la contraseña.

Comentarios

A menos que se proporcionen otros valores en el método rdoCreateEnvironment, las propiedades rdoDefaultUser y rdoDefaultPassword determinan el nombre de usuario y la contraseña empleados al crear el objeto rdoEnvironment. Estas propiedades además pueden devolver el nombre utilizado al crear un objeto rdoEnvironment.

De manera predeterminada, el valor de rdoDefaultUser y rdoDefaultPassword es "" (una cadena de longitud cero).


rdoEnvironments (Propiedad)

Devuelve un miembro específico de una colección rdoEnvironments por posición o por clave.

Sintaxis

objeto.rdoEnvironments(índice)

La sintaxis de la propiedad rdoEnvironments consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoEnvironments. Por ejemplo, el objeto rdoEngine tiene una propiedad rdoEnvironments que es la colección de objetos rdoEnvironments que afectan al objeto rdoEngine.


rdoErrors (Propiedad)

Devuelve un miembro específico de una colección rdoErrors por posición o por clave.

Sintaxis

objeto.rdoErrors(índice)

La sintaxis de la propiedad rdoErrors consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoErrors. Por ejemplo, el objeto rdoEngine tiene una propiedad rdoErrors que es la colección de objetos rdoErrors que afectan al objeto rdoEngine.


Ejemplo de eventos RDO

Este ejemplo ilustra algunos controladores de evento de Objetos de datos remotos (RDO, Remote Data Object). El código establece variables y controladores de evento para interceptar los eventos de conexión y de consulta. Para ayudar a ilustrar el uso del evento BeforeConnect, el código concatena el valor de Id. de la estación de trabajo y la hora actual al final de la cadena de conexión. Esto permite la identificación de la conexión específica en el servidor. Tras establecer la conexión, el código ejecuta una consulta que tarda bastante tiempo en ejecutarse (la consulta está diseñada para ejecutarse en un minuto aproximadamente). Puesto que se establece un valor QueryTimeout de 5 segundos, el evento QueryTimeout debe producirse a menos que la consulta vuelva antes de que transcurran 5 segundos. Observe que la propia consulta se ejecuta de forma asíncrona y el código no comprueba la finalización de la consulta. En este caso, el código simplemente espera a que se activen los eventos QueryComplete o QueryTimeout, indicando que ha finalizado la consulta. El código también permite solicitar otro tiempo de espera de 5 segundos.

Tenga en cuenta que para que este ejemplo funcione correctamente, primero debe hacer varias cosas, incluyendo establecer referencias a las bibliotecas Remote Data Objects y Common Dialog, agregar controles CommandButton y Timer a un formulario, y además debe cambiar la cadena de conexión ODBC en el evento Form_Load() para que apunte a un servidor válido.

Option Explicit
Private WithEvents cn As rdoConnection
Private WithEvents EngEv As rdoEngine
Dim er As rdoError
Dim strConnect As String
Dim rs As rdoResultset
Dim TimeStart As Single
Dim clock As Integer
Dim ShowClock As Integer
Dim QueryComplete As Integer
Dim InfoMsg As String
Dim Connected As Boolean
Dim ans As Integer

Private Sub EngEv_InfoMessage()
    InfoMsg = "Para su información..." _
    & " el servidor ha devuelto" _
        & " el siguiente mensaje." & vbCrLf
    For Each er In rdoErrors
        InfoMsg = InfoMsg & er.Number _
    & " - " & er.Description & vbCrLf
    Next

End Sub
Private Sub cn_BeforeConnect( _
    ConnectString As String, Prompt As Variant)
  InfoMsg = "A punto de conectar con:" & ConnectString _
    & " - " & Prompt
  ConnectString = ConnectString & ";WSID="  _
    & "EventTest" & Time$ & ";"
End Sub

Private Sub cn_Connect(ByVal ErrorOccurred As Boolean)
  'Se produce al conectarse.
  Connected = True
End Sub

Private Sub cn_Disconnect() 'Se produce al desconectarse
  Connected = False
End Sub

Private Sub cn_QueryComplete(ByVal Query As _
  RDO.rdoQuery, ByVal ErrorOccurred As Boolean)
  Timer1.Enabled = False
  QueryComplete = vbChecked
  RunButton.Enabled = True
  Beep

  MsgBox "Consulta terminada"
End Sub

Private Sub cn_QueryTimeout(ByVal Query As _
  RDO.rdoQuery, Cancel As Boolean)
    ans = MsgBox("La consulta no se completó en el tiempo asignado " _
    & "Haga clic en Cancelar para abandonar la consulta " _
    & "o en Reintentar para seguir trabajando.", _
        vbRetryCancel + vbQuestion, "Se excedió el tiempo de espera " _
    & "de la consulta")
    If ans = vbRetry Then
        Cancel = False
        QueryComplete = vbGrayed
    Else
        Timer1.Enabled = False
        QueryComplete = vbChecked
    End If
End Sub

Private Sub MenufileExit_Click()
cn.Close
Unload Form1
End Sub

Private Sub RunButton_Click()
    RunButton.Enabled = False
    On Error GoTo C1EH
    QueryComplete = vbGrayed
    Timer1.Enabled = True
    Set rs = cn.OpenResultset( _
             "execute VeryLongProcedure", _
        rdOpenKeyset, rdConcurValues, rdAsyncEnable)
    TimeStart = Timer
QuitRun:
Exit Sub
C1EH:
    Debug.Print Err, Error
        InfoMsg = "Error:.. el servidor ha devuelto" _
        & " el siguiente mensaje de error." & vbCrLf
    For Each er In rdoErrors
        InfoMsg = InfoMsg & er.Number  _
            & " - " & er.Description & vbCrLf
    Next
    MsgBox "La consulta no se pudo ejecutar"
    Timer1.Enabled = False
    Resume QuitRun

End Sub

Private Sub Form_Load()
On Error GoTo FLeh
Set EngEv = rdoEngine
Set cn = New rdoConnection
Show
    With cn
        .Connect = "UID=;PWD=;database=Workdb;" _
            & "Server=SEQUEL;" _
            & "driver={SQL Server};DSN='';"
        .QueryTimeout = 5
        .CursorDriver = rdUseClientBatch
        .EstablishConnection rdDriverNoPrompt
    End With
Exit Sub

FLeh:
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description
    Next
    Stop
    Resume
End Sub

Private Sub Timer1_Timer()
Static ot As Integer
' Mostrar el número de segundos
ShowClock = Int(Timer - TimeStart)
If ShowClock = ot Then Form1.Refresh
End Sub


rdoLocaleID (Propiedad)

Devuelve o establece un valor que indica la configuración regional de la biblioteca RDO.

Sintaxis

objeto.rdoLocaleID [= valor]

La sintaxis de la propiedad rdoLocaleID consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor que especifica la configuración regional como se describe en Valores.

Valores

Los valores admitidos para valor son:

Constante | Valor | Descripción
rdLocaleSystem | 0 | Sistema.
rdLocaleEnglish | 1 | Inglés.
rdLocaleFrench | 2 | Francés.
rdLocaleGerman | 3 | Alemán.
rdLocaleItalian | 4 | Italiano.
rdLocaleJapanese | 5 | Japonés.
rdLocaleSpanish | 6 | Español.
rdLocaleChinese | 7 | Chino.
rdLocaleSimplifiedChinese | 8 | Chino simplificado.
rdLocaleKorean | 9 | Coreano.

Comentarios

La configuración regional determina qué idioma se utiliza cuando se generan mensajes de error de RDO. La propiedad rdoLocaleID toma como valor predeterminado la configuración regional del sistema Windows cuando se inicializa el objeto rdoEngine.

Puede invalidar la configuración regional actual en cualquier momento si asigna cualquier valor permitido a la propiedad rdoLocaleID. Si establece un valor no permitido, se producirá un error interceptable.

Cuando la propiedad rdoLocaleID se establece o se modifica, RDO carga la biblioteca de vínculos dinámicos (DLL, Dynamic-link library) del idioma apropiada para mostrar los mensajes de error en el idioma adecuado.

Si el archivo DLL del idioma especificado no está presente en el equipo del usuario, RDO se establece como rdLocaleEnglish, lo cual no requiere un archivo DLL independiente. Cuando esto ocurre, se coloca un mensaje informativo en la colección rdoErrors para indicar que RDO no pudo cargar el archivo DLL de recursos para la configuración regional especificada.

Cuando distribuya la aplicación, asegúrese de incluir el archivo DLL del lenguaje apropiado.


rdoParameters (Propiedad)

Devuelve un miembro específico de una colección rdoParameters por posición o por clave.

Sintaxis

objeto.rdoParameters(índice)

La sintaxis de la propiedad rdoParameters consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoParameters. Por ejemplo, el objeto rdoQuery tiene una propiedad rdoParameters que es la colección de objetos rdoParameters que afectan al objeto rdoQuery.


rdoQueries (Propiedad)

Devuelve un miembro específico de una colección rdoQueries por posición o por clave.

Sintaxis

objeto.rdoQueries(índice)

La sintaxis de la propiedad rdoQueries consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoQueries. Por ejemplo, el objeto rdoConnection tiene una propiedad rdoQueries que es la colección de objetos rdoQueries que afectan al objeto rdoConnection.


Ejemplo del método rdoRegisterDataSource

El siguiente ejemplo ilustra el uso del método rdoRegisterDataSource para crear una entrada de origen de datos ODBC.

Private Sub RegisterDataSource()
Dim en As rdoEnvironment
Dim cnTest As rdoConnection
Dim strAttribs As String
' Crear cadena de palabras clave.
strAttribs = "Description=" _
        & "SQL Server en servidor SEQUEL" _
  & Chr$(13) & "OemToAnsi=No" _
  & Chr$(13) & "SERVER=SEQUEL" _
  & Chr$(13) & "Network=DBNMPNTW" _
  & Chr$(13) & "Database=WorkDB" _
  & Chr$(13) & "Address=\\SEQUEL\PIPE\SQL\QUERY"

' Crea un nuevo DSN registrado.
rdoEngine.rdoRegisterDataSource "Ejemplo", _
         "SQL Server", True, strAttribs
' Abre la base de datos.
Set en = rdoEngine.rdoEnvironments(0)
Set cnTest = en.OpenConnection( _
  dsname:="Ejemplo", _
  Prompt:=rdDriverNoPrompt, _
  Connect:="UID=;PWD=;")

End Sub


rdoResultSets (Propiedad)

Devuelve un miembro específico de una colección rdoResultSets por posición o por clave.

Sintaxis

objeto.rdoResultSets(índice)

La sintaxis de la propiedad rdoResultSets consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoResultSets. Por ejemplo, el objeto rdoConnection tiene una propiedad rdoResultSets que es la colección de objetos rdoResultSets que afectan al objeto rdoConnection.


rdoTables (Propiedad)

Devuelve un miembro específico de una colección rdoTables por posición o por clave.

Sintaxis

objeto.rdoTables(índice)

La sintaxis de la propiedad rdoTables consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
índice | Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, el índice debe ser un valor entre 1 y el valor de la propiedad Count de la colección. Si es una expresión de tipo String, el índice debe corresponder con el argumento clave especificado cuando el miembro referido se agregó a la colección.

Comentarios

Esta propiedad se usa para tener acceso a colecciones de objetos rdoTables. Por ejemplo, el objeto rdoConnection tiene una propiedad rdoTables que es la colección de objetos rdoTables que afectan al objeto rdoConnection.


rdoVersion (Propiedad, datos remotos)

Devuelve un valor que indica la versión de la biblioteca RDO asociada con el objeto.

Sintaxis

objeto.rdoVersion

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto admitido para la propiedad rdoVersion es una expresión de cadena de 5 caracteres.

Comentarios

Esta propiedad identifica la versión del motor de base de datos que creó la conexión. Esta versión tiene el formato #.#.####, donde los dos primeros dígitos son el número de versión principal y los dos últimos son el número de versión secundaria. Por ejemplo, la versión 2.0 de RDO devuelve 2.0.0000.


ReadOnly (Propiedad, datos remotos)

Devuelve o establece un valor que determina si el objeto rdoConnection del control está abierto para acceso de sólo lectura.

Sintaxis

objeto.ReadOnly [= valor]

La sintaxis de la propiedad ReadOnly consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión booleana que determina el acceso de lectura y escritura, como se describe en Valores.

Valores

Los valores admitidos para valor son:

Valor | Descripción
True | El objeto rdoConnection del control RemoteData está abierto para acceso de sólo lectura. No se permiten modificaciones en los datos.
False | (Predeterminado) El objeto rdoConnection del control RemoteData está abierto para acceso de lectura y escritura a los datos.

Comentarios

Utilice la propiedad ReadOnly con un control RemoteData para especificar si los datos del rdoConnection subyacente se pueden modificar. Por ejemplo, podría crear una aplicación que solamente mostrara datos. Sería más rápido tener acceso a un rdoConnection de sólo lectura.

Aunque la propiedad ReadOnly sea False, un usuario puede no tener acceso de escritura a una base de datos porque no tenga el permiso adecuado o porque el tipo de rdoResultset en uso no admite actualizaciones.

Esta propiedad corresponde al argumento sóloLectura del método OpenConnection.


Ejemplo del método Refresh

El siguiente ejemplo ilustra el uso del método Refresh para volver a generar un rdoResultset en el control RemoteData. El ejemplo restablece la propiedad SQL con una nueva consulta construida mediante la técnica de concatenación. Cuando se ejecuta el método Refresh, la consulta se vuelve a ejecutar. Puesto que no se cambió la propiedad Connect para cada llamada en el procedimiento Search, no se restablece cada vez la conexión; se abre sólo en la primera llamada. Cuando se completa el método Refresh, los controles dependientes reflejan los datos de las columnas devueltas por la consulta.

Option Explicit
Private Sub Search_Click()
On Error GoTo eh
With MSRDC1
   .Connect = "UID=;PWD=;Database=Pubs;"
   .DataSourceName = "WorkDB"
   .SQL = "Select Au_Fname " _
      & " From Authors " _
      & " Where Au_Lname like '%" _
      & AuthorWanted & "%' "
   Debug.Print .SQL
   .Refresh

   If .Resultset.EOF Then
      MsgBox "No hay autores en el archivo con ese nombre"
   End If
End With
Exit Sub

eh:
Dim er As rdoError
For Each er In rdoErrors
Debug.Print er
Next
Resume Next
End Sub


Ejemplo del método Requery

El siguiente ejemplo ilustra el uso del método Requery para volver a ejecutar un rdoQuery. Observe que el rdoResultset se crea sólo al cargar el formulario y sólo se vuelve a ejecutar en cada invocación del método Requery.

Option Explicit
Dim Cn As New rdoConnection
Dim Rs As rdoResultset
Dim Col As rdoColumn
Dim Qy As rdoQuery
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

Private Sub SpWho_Click()
Rs.Cancel
With Rs
   .Requery
   While .StillExecuting
      SpinGlobe
      DoEvents
   Wend
   ShowRS
End With

End Sub
Sub ShowRS()
With Rs
   Form1.Cls
   For Each Col In .rdoColumns
      Print Col.Name,
   Next
   Print
   Do Until .EOF
      For Each Col In .rdoColumns
         Print Col,
      Next
      Print
      .MoveNext
   Loop
End With
End Sub
Sub SpinGlobe()
' Anima un globo para mostrar que la consulta está en progreso.
Print ".";
End Sub

Private Sub Form_Load()
With Cn
   .Connect = "UID=;PWD=;Database=WorkDB; " _
   & "Server=sequel;Driver={SQL Server}" _
   & "DSN='';"
   .LoginTimeout = 5
   .EstablishConnection rdDriverNoPrompt, True
   Set Qy = .CreateQuery("SpWho", _
   "{ call master..sp_who (?) }")
   Qy.RowsetSize = 1
   Set Rs = Qy.OpenResultset(rdOpenForwardOnly, _
   rdConcurReadOnly, rdAsyncEnable)
   Show
   ShowRS
End With
End Sub


Required (Propiedad)

Devuelve un valor que indica si un objeto rdoColumn requiere un valor distinto de Null.

Sintaxis

objeto.Required

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad Required son:

Valor | Descripción
True | No se permite un valor Null.
False | Se permite un valor Null.

Comentarios

Para un objeto rdoColumn, puede usar la propiedad Required junto con la propiedad AllowZeroLength para determinar la validez del valor de la propiedad Value para ese objeto rdoColumn. Si Required es False, la columna puede contener valores Null así como valores que cumplan las condiciones especificadas por el valor de la propiedad AllowZeroLength.


Restartable (Propiedad)

Devuelve un valor que indica si un objeto rdoResultset admite el método Requery, que vuelve a ejecutar la consulta en la que está basado el objeto rdoResultset.

Sintaxis

objeto.Restartable

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad Restartable son:

Valor | Descripción
True | El objeto rdoResultset admite el método Requery.
False | El objeto rdoResultset no admite el método Requery.

Comentarios

Compruebe la propiedad Restartable antes de usar el método Requery en un rdoResultset. Si la propiedad Restartable del objeto es False, utilice el método OpenResultset del objeto rdoQuery subyacente para volver a ejecutar la consulta.

Puede usar el método Requery para actualizar una consulta de parámetros subyacente al objeto rdoResultset después de que se hayan modificado los valores de los parámetros.

Si el objeto rdoQuery no contiene parámetros, la propiedad Restartable es siempre True.


Resultset (Propiedad)

Devuelve o establece un objeto rdoResultset definido por un control RemoteData o devuelto por el método OpenResultset.

Sintaxis

Set objeto.Resultset [= valor]

La sintaxis de la propiedad Resultset consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de objeto que da como resultado un objeto rdoResultset, como se describe en Valores.

Valores

El valor admitido para valor es un objeto rdoResultset.

Comentarios

El control RemoteData se inicializa automáticamente al iniciar la aplicación. Cuando la propiedad SQL es válida, o si establece la propiedad SQL en tiempo de ejecución y utiliza el método Refresh, el control RemoteData intenta crear un nuevo objeto rdoResultset. Este objeto rdoResultset es accesible mediante la propiedad Resultset del control RemoteData.

Si crea un objeto rdoResultset mediante código RDO u otro control RemoteData, puede establecer la propiedad Resultset del control RemoteData a este nuevo objeto rdoResultset. Cualquier rdoResultset existente en el control RemoteData y el objeto rdoConnection asociado con él se liberan al asignar un nuevo rdoResultset a la propiedad Resultset.

También puede crear un objeto rdoResultset con el método OpenResultset y estableciendo la propiedad Resultset al objeto rdoResultset resultante. Sin embargo, los controles enlazados que utilizan el control RemoteData deben especificar correctamente las columnas del nuevo rdoResultset. Para ello, asegúrese de que las propiedades DataField de los controles enlazados conectados al control RemoteData se establecen de manera que coincidan con los nombres de las columnas del nuevo objeto rdoResultset.

Tipo de conjunto de resultados

El tipo de cursor rdoResultset que se desee crear se puede determinar si establece o examina la propiedad ResultsetType del control RemoteData. Si no solicita un tipo específico cuando utiliza un control RemoteData, se crea un rdoResultset de tipo keyset. El tipo de rdoResultset se puede determinar en tiempo de ejecución examinando la propiedad Type del objeto rdoResultset o la propiedad ResultsetType del control RemoteData.

El control RemoteData puede crear objetos rdoResultset de tipo keyset o de tipo static al tener acceso a SQL Server 6.0. Sin embargo, si el controlador ODBC no admite cursores de tipo keyset, no se pueden crear; todos los controladores admiten cursores estáticos. Se produce un error interceptable cuando se establece la propiedad Resultset de un control RemoteData a un tipo de rdoResultset no admitido.

Nota Cuando se establece la propiedad Resultset, el control RemoteData no cierra el objeto rdoResultset o rdoConnection actual, pero sí lo libera. Si no hay otros usuarios, el rdoConnection se cierra automáticamente. Puede que se desee cerrar el rdoResultset y el rdoConnection asociado con el control RemoteData antes de establecer la propiedad Resultset.

Todos los objetos rdoResultset creados por el control RemoteData se incorporan a rdoEnvironments(0). Si necesita usar el control RemoteData para manipular una base de datos en otro rdoEnvironment, utilice la técnica mostrada en el ejemplo anterior para abrir el rdoConnection en el rdoEnvironment deseado, crear un nuevo rdoResultset y establecer la propiedad Resultset del control RemoteData a este nuevo rdoResultset.


ResultsetType (Propiedad)

Devuelve o establece un valor que indica el tipo de cursor rdoResultset creado o que se desea crear.

Sintaxis

objeto.ResultsetType [= valor ]

La sintaxis de la propiedad ResultsetType consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor que especifica un tipo de rdoResultset, como se describe en Valores.

Valores

Los valores admitidos para valor son:

Constante | Valor | Descripción
rdOpenStatic | 3 | Un rdoResultset de tipo static.
rdOpenKeyset | 1 | (Predeterminado) Un rdoResultset de tipo keyset.

Comentarios

No todos los controladores admiten todos los tipos de cursores. Por ejemplo, SQL Server 6.0 admite cursores tanto estáticos como de tipo keyset, pero SQL Server 4.2 sólo admite cursores estáticos. Si el controlador ODBC no admite cursores de tipo keyset, éstos no se pueden crear con RDO ni mediante el control RemoteData. Si el control RemoteData no puede crear el tipo de cursor rdoResultset solicitado, RDO genera uno de los tipos de cursores que se pueden crear y devuelve el tipo de cursor en la propiedad ResultsetType.

Si no especifica un ResultsetType antes de que el control RemoteData cree el rdoResultset, se creará un rdoResultset de tipo keyset.

Si crea un rdoResultset y establece la propiedad Resultset con este nuevo objeto, la propiedad ResultsetType del control RemoteData se establece a la propiedad Type del nuevo rdoResultset.


Ejemplo de la propiedad Resultset

El ejemplo siguiente muestra cómo crear un rdoResultset en el código y pasarlo a un control RemoteData existente:

Option Explicit
Dim qy As rdoQuery
Dim rs As rdoResultset
Dim cn As rdoConnection

Private Sub Form_Load()
Dim SQL As String
Set cn = MSRDC1.Connection

SQL = "{ call ChooseAuthor (?) }"
Set qy = cn.CreateQuery("GetAuthor", SQL)
End Sub

Private Sub Search_Click()
qy(0) = NameWanted.Text
Set MSRDC1.Resultset = qy.OpenResultset( _
   rdOpenStatic, rdConcurReadOnly)

End Sub

A continuación se muestra el procedimiento almacenado que se ejecuta en el ejemplo de consulta:

CREATE PROCEDURE ChooseAuthor (@authorwanted char(20)) as
select t.title from titles t, titleauthor ta, authors a
where t.title_id = ta.title_id
and ta.au_id = a.au_id
and a.au_lname = @authorWanted


RowCount (Propiedad, datos remotos)

Devuelve el número de filas a las que se ha tenido acceso en un objeto rdoResultset.

Sintaxis

objeto.RowCount

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad RowCount es un entero de tipo Long, como se explica en Comentarios.

Comentarios

Utilice la propiedad RowCount para averiguar a cuántas filas de un objeto rdoResultset se ha tenido acceso, o si el rdoResultset ha devuelto alguna fila. La propiedad RowCount no indica cuántas filas se van a devolver con una consulta rdoResultset hasta que se haya tenido acceso a todas las filas. Después de que se haya tenido acceso a todas las filas, la propiedad RowCount refleja el número total de filas del rdoResultset.

Hacer referencia a la propiedad RowCount hace que RDO llene en su totalidad un conjunto de resultados, como si hubiera ejecutado un método MoveLast.

Dependiendo del controlador y del origen de datos, la propiedad RowCount devuelve -1 para indicar que el número de filas no está disponible o 0 para indicar que el rdoResultset no devolvió ninguna fila. Si el controlador puede devolver un contador de filas, la propiedad RowCount devuelve el número de filas del rdoResultset.

Al usar el método Requery en un rdoResultset se restablece la propiedad RowCount, como sucede al ejecutar una consulta por primera vez.


Ejemplo de la propiedad RowCount

Este ejemplo ilustra el uso de la propiedad RowCount para determinar si hay filas resultantes de la consulta, cuántas filas se han procesado después de la ejecución del método MoveNext y cuántas filas hay en el conjunto de resultados una vez que se han procesado todas las filas.

Option Explicit
Dim ps As rdoPreparedStatement
Dim rs As rdoResultset
Dim cn As rdoConnection

Private Sub Form_Load()
Dim SQL As String
Set cn = MSRDC1.Connection

SQL = "{call ChooseAuthor (?)}"
Set ps = cn.CreatePreparedStatement("GetAuthor", SQL)
End Sub

Private Sub Search_Click()
ps(0) = NameWanted.Text
Set MSRDC1.Resultset = ps.OpenResultset( _
   rdOpenKeyset, rdConcurReadOnly)
With MSRDC1.Resultset
  If .RowCount = 0 Then
    MsgBox "No se han encontrado títulos de ese autor."
    NameWanted.SetFocus
  Else
    Do Until .EOF
      .MoveNext
      TitlesFound = .RowCount   ' Cuántas filas hasta ahora
    Loop
    TitlesFound = .RowCount         ' Total de filas encontradas
  End If
  .MoveFirst
End With
End Sub


RowsAffected (Propiedad)

Devuelve el número de filas afectadas por el método Execute invocado más recientemente.

Sintaxis

objeto.RowsAffected

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad RowsAffected es un valor de tipo Long comprendido entre 0 y el número de filas afectadas por el método Execute invocado más recientemente sobre un objeto rdoConnection o rdoQuery.

Comentarios

RowsAffected contiene el número de filas eliminadas, actualizadas o insertadas cuando se ejecuta una consulta de acciones. Al usar el método Execute para ejecutar un objeto rdoQuery, el valor de la propiedad RowsAffected es el número de filas afectadas. Por ejemplo, cuando ejecuta una consulta que elimina 50 filas de una tabla, la propiedad RowsAffected devuelve 50.

Esta propiedad es especialmente útil cuando necesite determinar cuántas filas se han visto afectadas por una consulta de acciones con una cláusula WHERE ambigua. Por ejemplo, en una consulta que elimine todas las filas donde la columna Precio es mayor que 10, la propiedad RowsAffected indicará cuántas filas cumplen la condición y se han eliminado.


Ejemplo de la propiedad RowsAffected

Este ejemplo ilustra el uso de la propiedad RowsAffected para determinar el número de filas modificadas por una instrucción de actualización ambigua. En este caso no sabemos cuántos autores viven en Salt Lake City, pero una vez realizada la actualización, puede determinar cuántas filas se han actualizado si comprueba la propiedad RowsAffected del objeto rdoQuery.

Option Explicit
Dim SQL As String
Dim cn as rdoConnection
Dim qd as rdoQuery

Private Sub Form_Load()
Set cn = rdoEnvironments(0).OpenConnection( _
  dsname:="WorkDB", _
  Prompt:=rdDriverNoPrompt, _
  Connect:="uid=;pwd=;database=pubs")

SQL = "Update Authors Set Zip = ?" _
  & " Where City = ?"
Set qd = cn.CreateQuery("FixZip", SQL)
End Sub

Private Sub UpdateButton_Click()
qd(0) = NewZip      ' Desde un TextBox
qd(1) = CityToFind   ' Desde un TextBox
ps.Execute
NumberChanged = qd.RowsAffected
End Sub


RowsetSize (Propiedad)

Devuelve o establece un valor que determina el número de filas de un cursor rdoResultset.

Sintaxis

objeto.RowsetSize [= valor]

La sintaxis de la propiedad RowsetSize consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un valor que especifica el tamaño del conjunto de filas como se describe en Valores. (El tipo de datos es una expresión de tipo Long.)

Valores

El límite superior de RowsetSize está determinado por el controlador del origen de datos. El límite inferior de valor es 1 y el valor predeterminado es 100.

Comentarios

La propiedad RowsetSize determina la cantidad de filas del conjunto de claves que la aplicación almacena en el búfer. RDO utiliza esta propiedad para determinar cuántas filas se leen en memoria con la función SQLExtendedFetch de ODBC. El ajuste del tamaño de RowsetSize puede afectar al rendimiento y a la cantidad de memoria necesaria para mantener el búfer de conjuntos de claves.

Esta propiedad debe establecerse antes de crear un objeto rdoResultset.

Impacto sobre los cursores pesimistas

Además, la propiedad RowsetSize determina cuántas filas (y páginas de datos) están bloqueadas cuando se utiliza la concurrencia pesimista (rdConcurLock). Por ejemplo, si establece la propiedad RowsetSize a 100 y ejecuta un objeto rdoQuery con la opción rdConcurLock, las 100 primeras filas del conjunto de resultados y cada página asociada con cada fila estarán bloqueadas hasta que se cierre el cursor o se mueva el puntero de la fila actual hacia el final del conjunto de resultados. En este caso, al menos están bloqueadas RowsetSize filas.


Size (Propiedad, datos remotos)

Devuelve un valor que indica el tamaño máximo, en bytes, de los datos subyacentes de un objeto rdoColumn que contiene texto, o el tamaño fijo de un objeto rdoColumn que contiene texto o valores numéricos.

Sintaxis

objeto.Size

El marcador de posición objeto es una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad Size es un valor de tipo Long que depende del valor de la propiedad Type del objeto rdoColumn, como se explica en Comentarios.

Comentarios

Para columnas que devuelven valores de caracteres, la propiedad Size indica el número máximo de caracteres que la columna del origen de datos puede contener. En el caso de columnas numéricas, la propiedad Size indica cuántos bytes de almacenamiento del origen de datos se requieren para los datos de la columna. Este valor depende de la implementación del origen de datos.

Para las columnas del origen de datos que requieren el uso de los métodos GetChunk y AppendChunk, la propiedad Size es siempre 0; puede usar el método ColumnSize para devolver la información correcta de tamaño. El tamaño máximo de una columna de tipo lote está limitado solamente por los recursos del sistema o por el tamaño máximo de la base de datos.


Source (Propiedad, datos remotos)

Devuelve un valor que indica el origen de un error de acceso a datos remotos.

Sintaxis

objeto.Source

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad Source es una expresión de cadena como se describe en Comentarios.

Comentarios

Cuando se produce un error durante una operación ODBC, se anexa un objeto rdoError a la colección rdoErrors. Si el error se produce dentro de RDO, el valor devuelto comienza con "MSRDO20". También es posible anexar al valor de la propiedad Source la clase del objeto que provocó el error.


SourceColumn (Propiedad, datos remotos)

La propiedad SourceColumn devuelve un valor que indica el nombre de la columna que es el origen inicial de los datos de un objeto rdoColumn.

Esta propiedad no está disponible en tiempo de diseño y es de lectura y escritura en tiempo de ejecución.

Sintaxis

objeto.SourceColumn

El marcador de posición objeto es una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad SourceColumn devuelve una expresión de cadena que especifica el nombre de la columna que es el origen de los datos.

Comentarios

Esta propiedad indica el nombre de la columna original asociada con un objeto rdoColumn. Por ejemplo, podría usar esta propiedad para determinar el origen de los datos en una columna de consulta cuyo nombre no está relacionado con el nombre de la columna de la tabla subyacente.

Para las columnas de objetos rdoResultset, las propiedades SourceColumn y SourceTable devuelven el nombre de la columna y de la tabla de la tabla base o las columnas y las tablas utilizadas para definir la consulta.


SourceTable (Propiedad)

La propiedad SourceTable devuelve un valor que indica el nombre de la tabla que es el origen inicial de los datos de un objeto rdoColumn.

Esta propiedad no está disponible en tiempo de diseño y es de sólo lectura en tiempo de ejecución.

Sintaxis

objeto.SourceTable

El marcador de posición objeto es una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad SourceTable devuelve una expresión de cadena que especifica el nombre de la tabla que es el origen de los datos.

Comentarios

Esta propiedad indica el nombre de la tabla original asociada con un objeto rdoColumn. Por ejemplo, podría usar esta propiedad para determinar el origen de los datos en una columna de consulta cuyo nombre no está relacionado con el nombre de la columna de la tabla subyacente.

Para las columnas de objetos rdoResultset, las propiedades SourceColumn y SourceTable devuelven el nombre de la columna y de la tabla de la tabla base o las columnas y tablas utilizadas para definir la consulta.


SQL (Propiedad)

Devuelve o establece la instrucción SQL que define la consulta ejecutada por un objeto objeto rdoQuery o un control RemoteData.

Sintaxis

objeto.SQL [= valor]

La sintaxis de la propiedad SQL consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de cadena que contiene un valor como se describe en Valores. (El tipo de datos es String.)

Valores

Los valores admitidos para valor son:

Valor | Descripción
Una instrucción SQL válida | Una consulta SQL que utiliza la sintaxis apropiada para el origen de datos.
Un procedimiento almacenado | El nombre de un procedimiento almacenado admitido por el origen de datos precedido de la palabra clave "Execute".
Un rdoQuery | El nombre de uno de los objetos rdoQuery de la colección rdoQueries del objeto rdoConnection.
Un rdoResultset | El nombre de uno de los objetos rdoResultset de la colección rdoResultsets del objeto rdoConnection.
Un nombre de tabla | El nombre de uno de los objetos rdoTable definidos en la colección rdoTables del objeto rdoConnection.

Comentarios

La propiedad SQL contiene la instrucción del lenguaje de consulta estructurado que determina cómo se seleccionan, agrupan y ordenan las filas cuando se ejecuta una consulta. Puede usar una consulta para seleccionar filas e incluirlas en un objeto rdoResultset. También puede definir consultas de acciones para modificar datos sin devolver filas.

No puede proporcionar un nombre de tabla en tiempo de diseño para la propiedad SQL. Sin embargo, puede usar una consulta simple como SELECT * FROM <tabla>, o llenar la colección rdoTables en tiempo de ejecución y usar uno de los nombres de tabla devueltos en la colección. La colección rdoTables se llena tan pronto como se asocia con una conexión activa y se hace referencia a ella.

La sintaxis SQL utilizada en una consulta debe ajustarse al dialecto SQL definido por el procesador de consultas del origen de datos. El dialecto SQL admitido por la interfaz de ODBC está definido por el estándar X/Open. Generalmente, un controlador analiza una instrucción SQL en busca de códigos de escape específicos que se utilizan para identificar operandos no estándar como literales y funciones de marca de hora.

Cuando necesite devolver filas de una consulta, normalmente proporcionará una instrucción SELECT en la propiedad SQL. La instrucción SELECT especifica lo siguiente:

  • El nombre de cada columna devuelta o "*" para indicar que se deben devolver todas las columnas de la tabla especificada. Los nombres ambiguos de columnas deben resolverse para incluir el nombre de la tabla. También puede especificar expresiones agregadas para realizar operaciones aritméticas u otras funciones en las columnas seleccionadas.

  • El nombre de cada tabla en la que se va a buscar información. Si especifica más de una tabla, debe proporcionar la cláusula WHERE para indicar qué columnas se utilizan para hacer referencia cruzada a la información de las tablas. Normalmente, estas columnas tienen el mismo nombre y significado. Por ejemplo, puede hacerse referencia a la columna IdCliente en la tabla Clientes y en la tabla Pedidos.

  • (Opcionalmente) Una cláusula WHERE para especificar cómo combinar las tablas especificadas y cómo limitar o filtrar el número y los tipos de filas devueltas. Puede usar parámetros en la cláusula WHERE para especificar diferentes conjuntos de información de una consulta a otra.

  • (Opcionalmente) Otras cláusulas como ORDER BY para establecer un orden en particular para las filas o GROUP BY para estructurar las filas en conjuntos relacionados.

Cada dialecto SQL admite diferentes sintaxis y diferentes cláusulas auxiliares. Vea la documentación proporcionada con el servidor remoto para obtener más detalles al respecto.

Especificar parámetros

Si la instrucción SQL incluye marcadores de parámetros de signo de interrogación (?) para la consulta, debe proporcionar estos parámetros antes de ejecutar la consulta. Hasta que restablezca los parámetros, se aplican los mismos valores de parámetro cada vez que se ejecute la consulta. Para usar la colección rdoParameters y administrar los parámetros de consulta SQL, debe incluir el marcador de parámetro "?" en la instrucción SQL. Todos los parámetros de entrada, salida, entrada y salida, y valor devuelto se deben identificar de esta manera. En algunos casos debe usar la propiedad Direction para indicar cómo se usará el parámetro.

Nota Cuando se ejecuten procedimientos almacenados que no necesiten parámetros, no incluya paréntesis en la instrucción SQL. Por ejemplo, para ejecutar el procedimiento "MiSP" use la siguiente sintaxis: {Call MiSP }.

Nota Cuando se utiliza Microsoft SQL Server 6.0 como origen de datos, el controlador ODBC establece automáticamente la propiedad Direction. No es necesario establecer la propiedad Direction para parámetros de entrada, puesto que es el valor predeterminado.

Si el usuario modifica el valor del parámetro, puede volver a aplicar este valor y ejecutar de nuevo la consulta mediante el método Requery sobre el rdoResultset (MiRs).

Cpw(0) = Text1.Text
MiRs.Requery

También puede especificar los parámetros de cualquier instrucción SQL si los concatena en la cadena de instrucciones SQL. Así, para ejecutar el ejemplo anterior usando esta técnica, puede usar el código siguiente:

QSQL$ = "SELECT * FROM Authors WHERE Au_Lname = '" _
 & Text.Text & "'"
Set CPw = cn.CreateQuery("",QSQL$)
Set MiRs = Cpw.OpenResultSet()

En este caso, la colección rdoParameters no se crea y no se puede hacer referencia a ella. Para modificar el parámetro de la consulta, debe volver a generar la instrucción SQL con el nuevo valor del parámetro cada vez que se ejecute la consulta o antes de usar el método Requery.

La instrucción SQL puede incluir una cláusula ORDER BY para cambiar el orden de las filas devueltas por el rdoResultset o una cláusula WHERE para filtrar las filas.

Nota No puede usar los nombres de objetos rdoTable hasta que se haga referencia a la colección rdoTables. Cuando el código hace referencia a la colección rdoTables enumerando uno o más de sus miembros, RDO consulta los metadatos de la tabla en el origen de datos. Con ello se llena la colección rdoTables. Esto significa que no se puede simplemente proporcionar un nombre de tabla para el argumento valor sin enumerar primero la colección rdoTables.

Control RemoteData

Cuando se utiliza con el control RemoteData, la propiedad SQL especifica el origen de las filas de datos accesibles por medio de controles enlazados en el formulario.

Si establece la propiedad SQL a una instrucción SQL que devuelve filas o el nombre de un objeto rdoQuery existente, todas las columnas devueltas por el rdoResultset son visibles para los controles enlazados asociados con el control RemoteData.

Tras modificar el valor de la propiedad SQL en tiempo de ejecución, debe usar el método Refresh para activar las modificaciones.

Nota Siempre que el objeto rdoQuery o una instrucción SQL devuelva un valor de una expresión, el nombre de columna de la expresión estará determinado por la redacción de la consulta SQL. La mayoría de las veces se definirán expresiones de alias para conocer el nombre de la columna que desea vincular al control enlazado.

Asegúrese de que cada control enlazado tiene un valor válido en su propiedad DataField. Si modifica el valor de la propiedad SQL de un control RemoteData y utiliza el método Refresh, el rdoResultset identifica al nuevo objeto. Esto puede invalidar el valor de DataField de los controles enlazados y provocar un error interceptable.


SQLRetCode (Propiedad, datos remotos)

Devuelve el código de retorno de error ODBC de la operación RDO más reciente.

Sintaxis

objeto.SQLRetCode

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad SQLRetCode es un valor de tipo Long que corresponde a una de las constantes siguientes:

Constante | Valor | Descripción
rdSQLSuccess | 0 | La operación se ha completado con éxito.
rdSQLSuccessWithInfo | 1 | La operación se ha completado con éxito y hay información adicional disponible.
rdSQLNoDataFound | 100 | No hay datos adicionales disponibles.
rdSQLError | -1 | Error al realizar la operación.
rdSQLInvalidHandle | -2 | El controlador proporcionado no es válido.


SQLState (Propiedad, datos remotos)

Devuelve un valor correspondiente al tipo de error como está definido por X/Open y SQL Access Group.

Sintaxis

objeto.SQLState

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por SQLState es una expresión de cadena de cinco caracteres, como se describe en Comentarios.

Comentarios

Cuando una operación RDO devuelve un error o completa una operación, se establece la propiedad SQLState del objeto rdoError. Si el error no está provocado por ODBC o si no está disponible ningún SQLState, la propiedad SQLState devuelve una cadena vacía.

El valor de la cadena de caracteres que devuelve la propiedad SQLState consta de un valor de clase de dos caracteres seguido de un valor de subclase de tres caracteres. Un valor de clase "01" indica una advertencia y está acompañado de un código de retorno de rdSQLSuccessWithInfo.

Los valores de clase distintos de "01", excepto para la clase "IM", indican un error y van acompañados de un código de retorno de rdSQLError. La clase "IM" es específica para advertencias y errores que se derivan de la propia implementación de ODBC. La subclase "000" de cualquier clase es para condiciones definidas por la implementación dentro de la clase dada. La asignación de los valores de clase y subclase está definida por ANSI SQL-92.


Ejemplo de la propiedad SQL

Por ejemplo, para ejecutar un procedimiento que acepte dos parámetros de entrada y un parámetro de salida y devuelva un valor, puede usar el código siguiente. El ejemplo crea un objeto rdoQuery cuya propiedad SQL está establecida a la cadena especificada por QSQL$. Esta consulta llama a un procedimiento almacenado que devuelve un valor y acepta un parámetro de salida y dos parámetros de entrada.

Dim Cqy as new rdoQuery
Dim MyRs as rdoResultset
Cqy.SQL = "{ ? = call sp_MyProc (?, ?, ?) }"
Cqy(0).Direction = rdReturnValue
Cqy(1).Direction = rdParamInput
Cqy(2).Direction = rdParamInput
Cqy(3).Direction = rdParamOutput
Cqy(1) = "Victoria"
Cqy(0) = 21
Set MyRs = Cqy.OpenResultSet(rdOpenForwardOnly)


Status (Propiedad)

Devuelve o establece el estado de la fila o columna actual.

Sintaxis

objeto.Status [= valor]

La sintaxis de la propiedad Status consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el tipo de cursor, según se describe en Valores:

Valores

Los valores admitidos para la propiedad Status son:

Constante | Valor | Valor de la propiedad Prepared
rdRowUnmodified | 0 | (Predeterminado) La fila o la columna no se han modificado o se han actualizado correctamente.
rdRowModified | 1 | La fila o la columna se han modificado y aún no se han actualizado en la base de datos.
rdRowNew | 2 | La fila o la columna se han insertado con el método AddNew, pero aún no se han insertado en la base de datos.
rdRowDeleted | 3 | La fila o la columna se han eliminado, pero aún no se han eliminado de la base de datos.
rdRowDBDeleted | 4 | La fila o la columna se han eliminado localmente y también de la base de datos.

Comentarios

El valor de esta propiedad indica si la fila o la columna estarán implicadas en la próxima actualización optimista por lotes y de qué modo lo estarán.

Al usar la biblioteca de cursores de actualización optimista por lotes y si es necesario especificar las filas que se van a actualizar en la siguiente operación por lotes, puede establecer la propiedad Status del objeto rdoResultset. Por ejemplo, suponga que trabaja con un control Grid no vinculado lleno con las filas de una consulta. El usuario selecciona una de las filas y el programa detecta que se ha realizado un cambio en ella. En ese momento, puede marcar la fila para su actualización estableciendo la propiedad Status a rdRowModified. Del mismo modo, si se agrega o elimina una fila, puede usar el valor correspondiente de la propiedad Status para indicarlo. Al invocar el método BatchUpdate, RDO enviará al servidor remoto la operación adecuada para cada fila, basándose en el valor de su propiedad Status.

Una vez completada la operación BatchUpdate, puede examinar la propiedad Status de cada fila para determinar si la actualización ha tenido éxito. Si el valor de Status no es rdRowUnmodified después de BatchUpdate, la operación de actualización de la fila no habrá podido realizarse. En este caso deberá comprobar la colección rdoErrors y la propiedad BatchCollisionRows de las filas.


StillConnecting (Propiedad)

Devuelve un valor que indica si la conexión se ha establecido.

Sintaxis

objeto.StillConnecting

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

La propiedad StillConnecting devuelve estos valores:

Valor | Descripción
True | La conexión se va a realizar de forma asíncrona pero todavía no se ha establecido.
False | La conexión se ha establecido.

Comentarios

Esta propiedad funciona de manera muy similar a la propiedad StillExecuting, excepto que es True mientras se está realizando una conexión asíncrona con el servidor. Esta propiedad se establece a False una vez que se ha establecido la conexión.

Todos los accesos a métodos y propiedades del objeto conexión (con la excepción de esta propiedad y del método Cancel) producirán un error interceptable mientras se esté produciendo una conexión asíncrona.


Ejemplo de la propiedad StillConnecting

Este ejemplo ilustra el uso de la propiedad StillConnecting cuando se establece una conexión mediante la opción rdAsyncEnable.

Dim rdoCn As New rdoConnection
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

TimeExpected = 15
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=FarAway;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 45
    .EstablishConnection rdDriverNoPrompt, _
       True, rdAsyncEnable
    Ts = Timer
    ProgressBar1.Max = TimeExpected  ' tiempo para realizar la apertura
    While .StillConnecting
        Tn = Int(Timer - Ts)
        If Tn < TimeExpected Then
            ProgressBar1 = Tn
        Else
            ProgressBar1.Max = ProgressBar1.Max + 10
            TimeExpected = ProgressBar1.Max
        End If
        DoEvents
    Wend
    Status = "Duración:" & Int(Timer - Ts)

End With
rdoCn.Close
Exit Sub


StillExecuting (Propiedad, datos remotos)

Devuelve un valor de tipo Boolean que indica si una consulta está aún ejecutándose.

Sintaxis

objeto.StillExecuting

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad StillExecuting son:

Valor | Descripción
True | La consulta está aún ejecutándose.
False | La consulta está lista para devolver el conjunto de resultados.

Comentarios

Utilice la propiedad StillExecuting para determinar si una consulta está preparada para devolver el primer conjunto de resultados. No se puede tener acceso al objeto asociado hasta que la propiedad StillExecuting sea False. Sin embargo, a menos que use la opción rdAsyncEnable, la aplicación se bloqueará hasta que se complete la consulta y esté preparada para procesar el conjunto de resultados.

Una vez que la propiedad StillExecuting devuelve False, el primero o el siguiente conjunto de resultados está listo para su proceso. Cuando utiliza el método MoreResults para completar el proceso de un conjunto de resultados, la propiedad StillExecuting se restablece a True mientras se recuperan los siguientes conjuntos de resultados.

La propiedad StillExecuting también cambia a True cuando ejecuta un método Move. Por ejemplo, si ejecuta MoveLast en un rdoResultset se restablece la propiedad StillExecuting a True siempre y cuando RDO continúe extrayendo filas del servidor remoto.

También puede usar el evento QueryComplete para indicar cuándo se ha completado una consulta y el objeto asociado rdoResultset está preparado para su proceso.

El método Cancel se utiliza para finalizar el procesamiento de una consulta en ejecución, incluyendo todas las instrucciones de una consulta por lotes.


Ejemplo de la propiedad StillExecuting

Este ejemplo muestra el uso de la propiedad StillExecuting para comprobar el progreso de una consulta que se espera que tarde algo más de unos segundos. Al activar el modo asíncrono de RDO, la aplicación vuelve a tomar el control mucho antes de que se complete la consulta. Mientras espera a que la propiedad StillExecuting devuelva False, mostraremos una barra de progreso programada para reflejar el tiempo que esperamos que tarde la consulta. Observe que si se excede el tiempo, la barra de progreso se vuelve a calibrar para reflejar la nueva duración.

Dim rdoCn As New rdoConnection
Dim rdoRs As rdoResultset
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True

    SQL = "Execute VeryLongProcedure"
    TimeExpected = 20 ' Esperamos que tarde 60 o 20 segundos.

    Set rdoRs = .OpenResultset(Name:=SQL, _
        Type:=rdOpenForwardOnly, _
        LockType:=rdConcurReadOnly, _
        Option:=rdAsyncEnable)
    Ts = Timer
    ProgressBar1.Max = TimeExpected
    While rdoRs.StillExecuting
        Tn = Int(Timer - Ts)
        If Tn < TimeExpected Then
            ProgressBar1 = Tn
        Else
            ProgressBar1.Max = ProgressBar1.Max + 10
            TimeExpected = ProgressBar1.Max
        End If
        DoEvents
    Wend
    Status = "Consulta terminada. Duración:" & Int(Timer - Ts)

End With
rdoRs.Close
rdoCn.Close


Transactions (Propiedad, datos remotos)

Devuelve un valor que indica si un objeto permite registrar una serie de modificaciones que posteriormente se puedan deshacer o realizar.

Sintaxis

objeto.Transactions

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad Transactions son:

Valor | Descripción
True | El objeto admite transacciones.
False | El objeto no admite transacciones.

Comentarios

Compruebe la propiedad Transactions antes de usar el método BeginTrans para asegurarse de que se admiten transacciones. Cuando Transactions es False, los métodos BeginTrans, CommitTrans o RollbackTrans no tienen efecto.

La propiedad Transactions llama a la función SQLGetInfo de ODBC para determinar si el controlador ODBC es capaz de permitir transacciones, no si el conjunto de resultados actual es actualizable. Siempre puede llamar al método BeginTrans en el objeto rdoConnection si la propiedad Transactions es True, incluso en objetos rdoResultset de sólo lectura.


Type (Propiedad, datos remotos)

Devuelve o establece un valor que indica el tipo de datos o el tipo de un objeto.

Sintaxis

objeto.Type [=valor]

La sintaxis de la propiedad Type consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una constante o un valor de tipo Integer que especifica un tipo de datos, como se describe en Valores.

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Para un objeto rdoColumn o rdoParameter, la propiedad Type devuelve un tipo Integer. También puede establecer la propiedad Type en el objeto rdoParameter para indicar el tipo de datos de un argumento de un procedimiento específico. Los valores devueltos son los siguientes:

Constante | Valor | Descripción
rdTypeCHAR | 1 | Cadena de caracteres de longitud fija. La longitud la establece la propiedad Size.
rdTypeNUMERIC | 2 | Valor numérico con signo, exacto, con precisión p y escala s (1 ≤ p ≤15; 0 ≤ s ≤ p).
rdTypeDECIMAL | 3 | Valor numérico con signo, exacto, con precisión p y escala s (1 ≤ p ≤15; 0 ≤ s ≤ p).
rdTypeINTEGER | 4 | Valor numérico con signo, exacto, con precisión 10 y escala 0 (con signo: -231 ≤ n ≤ 231-1; sin signo: 0 ≤ n ≤ 232-1).
rdTypeSMALLINT | 5 | Valor numérico con signo, exacto, con precisión 5 y escala 0 (con signo: -32.768 ≤ n ≤ 32.767; sin signo: 0 ≤ n ≤ 65.535).
rdTypeFLOAT | 6 | Valor numérico con signo aproximado, con mantisa de precisión 15 (cero o valor absoluto entre 10-308 y 10308).
rdTypeREAL | 7 | Valor numérico con signo aproximado, con mantisa de precisión 7 (cero o valor absoluto entre 10-38 y 1038).
rdTypeDOUBLE | 8 | Valor numérico con signo, con mantisa de precisión 15 (cero o valor absoluto entre 10-308 y 10308).
rdTypeDATE | 9 | Fecha: dependiente del origen de datos.
rdTypeTIME | 10 | Hora: dependiente del origen de datos.
rdTypeTIMESTAMP | 11 | Marca de hora: dependiente del origen de datos.
rdTypeVARCHAR | 12 | Cadena de caracteres de longitud variable. 255 de longitud máxima.
rdTypeLONGVARCHAR | -1 | Cadena de caracteres de longitud variable. La longitud máxima está determinada por el origen de datos.
rdTypeBINARY | -2 | Datos binarios de longitud fija. 255 de longitud máxima.
rdTypeVARBINARY | -3 | Datos binarios de longitud variable. 255 de longitud máxima.
rdTypeLONGVARBINARY | -4 | Datos binarios de longitud variable. La longitud máxima depende del origen de datos.
rdTypeBIGINT | -5 | Valor numérico con signo, exacto, con precisión 19 (con signo) o 20 (sin signo), escala 0; (con signo: -263 ≤ n ≤ 263-1; sin signo: 0 ≤ n ≤ 264-1).
rdTypeTINYINT | -6 | Valor numérico con signo, exacto, con precisión 3, escala 0; (con signo: -128 ≤ n ≤ 127; sin signo: 0 ≤ n ≤ 255).
rdTypeBIT | -7 | Dígito binario simple.

Para un objeto rdoQuery, la propiedad Type devuelve un tipo Integer. Los valores devueltos son los siguientes:

Constante | Valor | Tipo de consulta
rdQSelect | 0 | Selección
rdQAction | 1 | Acciones
rdQProcedures | 2 | Procedural
rdQCompound | 3 | La consulta contiene instrucciones de acciones y de selección.

Para un objeto rdoResultset, la propiedad Type devuelve un tipo Integer que determina el tipo de rdoResultset. Los valores devueltos son los siguientes:

Constante | Valor | Tipo de rdoResultset
rdOpenForwardOnly | 0 | Conjunto fijo sin desplazamiento.
rdOpenKeyset | 1 | Cursor de conjunto de resultados de la consulta actualizable, fijo y desplazable.
rdOpenDynamic | 2 | Cursor de conjunto de resultados de la consulta actualizable, dinámico y desplazable.
rdOpenStatic | 3 | Conjunto fijo de sólo lectura.

Nota No todos los controladores u orígenes de datos ODBC admiten todos los tipos de cursor de rdoResultset. Si elige un tipo de cursor no admitido, el controlador ODBC intenta volver a un tipo admitido. Si no está disponible ningún tipo admitido se producirá un error interceptable.

Para un objeto rdoTable, la propiedad Type devuelve un valor de tipo String. Los valores admitidos para valor están determinados por el controlador del origen de datos.

Normalmente, el valor de la cadena es "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM" o algún otro identificador de tipo específico de un origen de datos.

Comentarios

Dependiendo del objeto, la propiedad Type indica lo siguiente:

Objeto | Type indica
rdoColumn, rdoParameter | Tipo de datos del objeto.
rdoQuery | Tipo de consulta.
rdoResultset | Tipo de rdoResultset.
rdoTable | Tipo de tabla del origen de datos.

En algunos casos, debe sustituir la asignación de la propiedad Type realizada con RDO al crear algunos tipos de consultas con parámetros. Por ejemplo, si se pasa un parámetro a una expresión dentro de una instrucción SQL, el controlador ODBC quizá no sea capaz de determinar el tipo correcto. En estos casos, puede forzar que un determinado parámetro se trate como correcto simplemente estableciendo la propiedad Type del objeto rdoParameter. Ésta es la única situación en que se permite cambiar la propiedad Type. En todos los demás casos, esta propiedad es de sólo lectura.


Updatable (Propiedad, datos remotos)

Devuelve un valor de tipo Boolean que indica si se pueden efectuar cambios en un objeto de datos remotos.

Sintaxis

objeto.Updatable

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

Los valores devueltos por la propiedad Updatable son:

Valor | Descripción
True | El objeto se puede modificar o actualizar.
False | El objeto no se puede modificar o actualizar. Es el único valor para objetos rdoResultset de tipo static.

Comentarios

Si el valor de la propiedad Updatable es True, el objeto especificado:

  • rdoConnection hace referencia a un origen de datos actualizable.

  • rdoQuery hace referencia a un conjunto de resultados actualizable.

  • rdoResultset contiene filas actualizables.

  • rdoTable hace referencia a una tabla cuyos datos se pueden modificar mediante una consulta.

  • rdoColumn hace referencia a datos que se pueden modificar. Sólo se pueden cambiar objetos rdoColumn que forman parte de un objeto rdoResultset.

Puede usar la propiedad Updatable con todos los tipos de objeto rdoResultset.

Muchos tipos de objetos rdoResultset pueden contener columnas que no se pueden actualizar. Por ejemplo, puede crear un rdoResultset de tipo forward-only que se derive de orígenes no actualizables o que contenga columnas calculadas o derivadas.

Si el objeto sólo contiene columnas no actualizables, el valor de la propiedad Updatable es False. Cuando una o más columnas son actualizables, el valor de la propiedad es True. Sólo puede modificar las columnas actualizables. Se producirá un error interceptable si intenta asignar un nuevo valor a una columna no actualizable.

Puesto que un objeto actualizable puede contener columnas que no se pueden actualizar, compruebe la propiedad Updatable de cada objeto rdoColumn antes de modificar una fila del rdoResultset.

Incluso cuando no puede actualizarse un cursor, todavía es posible actualizar los datos mediante el uso de una consulta de acciones. En algunos casos, las tablas de la base de datos están protegidas y no son actualizables por diseño, ya que están protegidas frente a accesos directos por el administrador del sistema y la combinación de permisos del sistema remoto. En tal caso, consulte con el administrador del sistema acerca de la disponibilidad de procedimientos almacenados o cuentas con inicio de sesión especiales que le permitan realizar los cambios.


UpdateCriteria (Propiedad)

Devuelve o establece un valor que especifica la forma en que se crea la cláusula WHERE para cada fila durante una operación de actualización optimista por lotes.

Sintaxis

objeto.UpdateCriteria [= valor]

La sintaxis de la propiedad UpdateCriteria consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el tipo de cursor, según se describe en Valores

Valores

Los valores admitidos para la propiedad UpdateCriteria son:

Constante | Valor | Tipo de rdoResultset
rdCriteriaKey | 0 | (Predeterminado). Utiliza sólo la columna o columnas clave en la cláusula WHERE.
rdCriteriaAllCols | 1 | Utiliza la columna o columnas clave y todas las actualizadas en la cláusula WHERE.
rdCriteriaUpdCols | 2 | Utiliza la columna o columnas clave y todas las modificadas en la cláusula WHERE.
rdCriteriaTimeStamp | 3 | Utiliza sólo la columna TimeStamp, si está disponible (genera un error en tiempo de ejecución si no hay una columna de ese tipo en el conjunto de resultados).

Comentarios

Cuando se ejecuta una operación por lotes, RDO y la biblioteca de cursores ClientBatch crean una serie de instrucciones UPDATE para realizar los cambios necesarios. En cada instrucción se crea una cláusula WHERE de SQL para cada actualización con el fin de aislar las filas marcadas como modificadas (por la propiedad Status). Puesto que algunos servidores remotos usan desencadenantes u otros métodos para exigir la integridad referencial, a menudo es importante limitar las columnas que se van a actualizar sólo a aquellas afectadas por el cambio. De este modo sólo se ejecutará el mínimo código del desencadenante. Como resultado, la operación de actualización se ejecutará más rápidamente y con menos errores potenciales.

Debe establecer la propiedad UpdateCriteria a rdCriteriaKey cuando se incluyan columnas BLOB en el conjunto de resultados.

Si establece esta propiedad a un valor distinto de los aquí indicados se producirá un error en tiempo de ejecución.


UpdateOperation (Propiedad)

Devuelve o establece un valor que especifica si la actualización optimista por lotes debe usar una instrucción Update o una instrucción Delete seguida de otra instrucción Insert.

Sintaxis

objeto.UpdateOperation [= valor]

La sintaxis de la propiedad UpdateOperation consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Un entero de tipo Long que representa el tipo de cursor, según se describe en Valores:

Valores

Los valores admitidos para la propiedad UpdateOperation son:

Constante | Valor | Tipo de UpdateOperation
rdOperationUpdate | 0 | (Predeterminado) Se utiliza una instrucción Update para cada fila modificada.
rdOperationDelIns | 1 | Se utiliza un par de instrucciones Delete e Insert para cada fila modificada.

Comentarios

Si se establece la propiedad UpdateOperation a un valor distinto de los indicados, se producirá un error en tiempo de ejecución.

Esta propiedad determina si la biblioteca de cursores de actualización optimista por lotes usa una instrucción Update o un par de instrucciones Delete e Insert al enviar las modificaciones al servidor de la base de datos. En el último caso, serán necesarias dos operaciones distintas para actualizar la fila. En algunos casos, especialmente cuando el sistema remoto implementa desencadenantes para Delete, Insert y Update, la elección del valor correcto de la propiedad UpdateOperation puede afectar significativamente al rendimiento.

Las nuevas filas agregadas siempre generarán instrucciones Insert y las eliminadas generarán instrucciones Delete, por lo que esta propiedad sólo se aplica a la forma en que la biblioteca de cursores actualiza las filas modificadas.


UserName (Propiedad, datos remotos)

Devuelve o establece un valor que representa a un usuario de un objeto rdoEnvironment. La propiedad UserName se utiliza con la propiedad Password para conectarse a un origen de datos ODBC.

Sintaxis

objeto.UserName [= valor]

La sintaxis de la propiedad UserName consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión de cadena que contiene un nombre de usuario como se describe en Valores. (El tipo de datos es String.)

Valores

La sintaxis del nombre de usuario depende del origen de datos ODBC.

Valores devueltos

La propiedad UserName representa al usuario de un objeto rdoEnvironment. El nombre de usuario se establece cuando el control RemoteData crea automáticamente el rdoEnvironment, por la primera referencia a un objeto de datos remotos o cuando se ejecuta el método rdoCreateEnvironment.

Puede determinar el nombre de usuario predeterminado mediante la propiedad rdoDefaultUser del objeto rdoEngine. Si no especifica ningún nombre de usuario en UserName, se utiliza el valor de la propiedad rdoDefaultUser.


Value (Propiedad, datos remotos)

Devuelve o establece el valor de un objeto.

Sintaxis

objeto.Value [= valor]

La sintaxis de la propiedad Value consta de las siguientes partes:

Parte | Descripción
objeto | Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
valor | Una expresión que da como resultado un valor apropiado para el tipo de datos, como especifica la propiedad Type de un objeto. (El tipo de datos es Variant.)

Comentarios

La propiedad Value se utiliza para recuperar y modificar datos de objetos rdoResultset. El tipo de datos de los datos devueltos se indica en la propiedad Type del objeto.

La propiedad Value es la predeterminada de los objetos rdoColumn y rdoParameter. Por tanto, las siguientes líneas de código son equivalentes (suponiendo que Column1 está en la primera posición ordinal):

Dim MyResultset As rdoResultset
X = MyResultset!Column1
X = MyResultset!Column1.Value
X = MyResultset(0)
X = MyResultset(0).Value
X = MyResultset("Column1").Value
X = MyResultset("Column1")
X = RemoteData1.Resultset("Column1")
X = RemoteData1.Resultset(0)
F$ = "Column1" : X = MyResultset(F$).Value
X = MyResultset(F$)
Set X = MyResultset(0): X.Value : X


Version (Propiedad, datos remotos)

Devuelve un valor que indica la versión del origen de datos asociado con el objeto.

Sintaxis

objeto.Version

El marcador de posición objeto representa una expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Valores devueltos

El valor devuelto por la propiedad Version es una expresión de cadena de 10 caracteres.

Comentarios

Para un objeto rdoConnection, esta propiedad identifica la versión del origen de datos utilizado cuando se creó la conexión. Este valor es la versión de ODBC a la que se ajusta el administrador de controladores. La versión tiene el formato ##.##.####, donde los dos primeros dígitos son el número principal de versión, los dos siguientes son el número de versión secundaria y los cuatro últimos son el número de revisión.