Cómo funcionan conjuntamente los controladores de eventosHow Event Handlers Work Together

A menos que esté programando en Visual Basic, se deben implementar todos los controladores de eventos para los eventos Connection y Recordset , independientemente de si realmente procesa todos los eventos.Unless you are programming in Visual Basic, all event handlers for Connection and Recordset events must be implemented, regardless of whether you actually process all of the events. La cantidad de trabajo de implementación que tiene que hacer depende del lenguaje de programación.The amount of implementation work you have to do depends on your programming language. Para obtener más información, vea creación de instancias de eventos de ADO por lenguaje.For more information, see ADO Event Instantiation by Language.

Controladores de eventos emparejadosPaired Event Handlers

Cada controlador de eventos tiene asociado un controlador de eventos completo .Each Will event handler has an associated Complete event handler. Por ejemplo, cuando la aplicación cambia el valor de un campo, se llama al controlador de eventos WillChangeField .For example, when your application changes the value of a field, the WillChangeField event handler is called. Si el cambio es aceptable, la aplicación deja el parámetro adStatus sin modificar y se realiza la operación.If the change is acceptable, your application leaves the adStatus parameter unchanged and the operation is performed. Una vez finalizada la operación, un evento FieldChangeComplete notifica a la aplicación que la operación ha finalizado.When the operation completes, a FieldChangeComplete event notifies your application that the operation has finished. Si se completó correctamente, adStatus contiene adStatusOK; de lo contrario, adStatus contiene adStatusErrorsOccurred y debe comprobar el objeto de error para determinar la causa del error.If it completed successfully, adStatus contains adStatusOK; otherwise, adStatus contains adStatusErrorsOccurred and you must check the Error object to determine the cause of the error.

Cuando se llama a WillChangeField , puede determinar que no se debe realizar el cambio.When WillChangeField is called, you might determine that the change should not be made. En ese caso, establezca adStatus en adStatusCancel.In that case, set adStatus to adStatusCancel. La operación se cancela y el evento FieldChangeComplete recibe un valor de adStatus de adStatusErrorsOccurred.The operation is canceled and the FieldChangeComplete event receives an adStatus value of adStatusErrorsOccurred. El objeto error contiene adErrOperationCancelled para que el controlador FieldChangeComplete sepa que se canceló la operación.The Error object contains adErrOperationCancelled so that your FieldChangeComplete handler knows that the operation was canceled. No obstante, debe comprobar el valor del parámetro adStatus antes de cambiarlo, ya que el valor de adStatus en adStatusCancel no tiene ningún efecto si el parámetro se estableció en adStatusCantDeny en la entrada al procedimiento.However, you need to check the value of the adStatus parameter before changing it, because setting adStatus to adStatusCancel has no effect if the parameter was set to adStatusCantDeny on entry to the procedure.

A veces, una operación puede producir más de un evento.Sometimes an operation can raise more than one event. Por ejemplo, el objeto de conjunto de registros tiene eventos emparejados para cambios de campo y cambios de registro .For example, the Recordset object has paired events for Field changes and Record changes. Cuando la aplicación cambia el valor de un campo, se llama al controlador de eventos WillChangeField .When your application changes the value of a Field, the WillChangeField event handler is called. Si determina que la operación puede continuar, también se genera el controlador de eventos WillChangeRecord .If it determines that the operation can continue, the WillChangeRecord event handler is also raised. Si este controlador también permite que el evento continúe, se realiza el cambio y se llama a los controladores de eventos FieldChangeComplete y RecordChangeComplete .If this handler also allows the event to continue, the change is made and the FieldChangeComplete and RecordChangeComplete event handlers are called. El orden en el que se llama a los controladores de eventos para una operación determinada no está definido, por lo que debe evitar escribir código que dependa de llamar a los controladores en una secuencia determinada.The order in which the Will event handlers for a particular operation are called is not defined, so you should avoid writing code that depends on calling handlers in a particular sequence.

En las instancias de cuando se producen varios eventos, uno de los eventos podría cancelar la operación pendiente.In instances when multiple Will events are raised, one of the events might cancel the pending operation. Por ejemplo, cuando la aplicación cambia el valor de un campo, normalmente se llamaría a los controladores de eventos WillChangeField y WillChangeRecord .For example, when your application changes the value of a Field, both WillChangeField and WillChangeRecord event handlers would normally be called. Sin embargo, si la operación se cancela en el primer controlador de eventos, se llama inmediatamente a su controlador completo asociado con adStatusOperationCancelled.However, if the operation is canceled in the first event handler, its associated Complete handler is immediately called with adStatusOperationCancelled. Nunca se llama al segundo controlador.The second handler is never called. Sin embargo, si el primer controlador de eventos permite que continúe el evento, se llamará al otro controlador de eventos.If, however, the first event handler allows the event to proceed, the other event handler will be called. Si después cancela la operación, se llamará a ambos eventos Complete como en los ejemplos anteriores.If it then cancels the operation, both Complete events will be called as in the earlier examples.

Controladores de eventos no emparejadosUnpaired Event Handlers

Siempre que el estado que se pasa al evento no sea adStatusCantDeny, se pueden desactivar las notificaciones de eventos para cualquier evento devolviendo adStatusUnwantedEvent en el parámetro status .As long as the status passed to the event is not adStatusCantDeny, you can turn off event notifications for any event by returning adStatusUnwantedEvent in the Status parameter. Por ejemplo, cuando se llama por primera vez a un controlador de eventos completo , puede devolver adStatusUnwantedEvent.For example, when your Complete event handler is called the first time, you can return adStatusUnwantedEvent. Recibirá posteriormente solo eventos .You will subsequently receive only Will events. Sin embargo, algunos eventos se pueden desencadenar por más de una razón.However, some events can be triggered for more than one reason. En ese caso, el evento tendrá un parámetro Reason .In that case, the event will have a Reason parameter. Cuando devuelva adStatusUnwantedEvent, dejará de recibir notificaciones para ese evento solo cuando se produzcan por ese motivo concreto.When you return adStatusUnwantedEvent, you will stop receiving notifications for that event only when they occur for that particular reason. Dicho de otro modo, recibirá una notificación por cada posible motivo por el que se puede desencadenar el evento.In other words, you will potentially receive notification for each possible reason that the event could be triggered.

Los controladores de eventos únicos pueden ser útiles si desea examinar los parámetros que se utilizarán en una operación.Single Will event handlers can be useful when you want to examine the parameters that will be used in an operation. Puede modificar los parámetros de la operación o cancelar la operación.You can modify those operation parameters or cancel the operation.

O bien, deje habilitada la notificación de eventos completa .Alternatively, leave Complete event notification enabled. La primera vez que se llama al controlador de eventos, devuelve adStatusUnwantedEvent.When your first Will event handler is called, return adStatusUnwantedEvent. Posteriormente, solo recibirá eventos completos .You will subsequently receive only Complete events.

Los controladores de eventos completos pueden ser útiles para administrar operaciones asincrónicas.Single Complete event handlers can be useful for managing asynchronous operations. Cada operación asincrónica tiene un evento completo adecuado.Each asynchronous operation has an appropriate Complete event.

Por ejemplo, puede tardar mucho tiempo en rellenar un objeto de conjunto de registros grande.For example, it can take a long time to populate a large Recordset object. Si la aplicación se ha escrito correctamente, puede iniciar una Recordset.Open(...,adAsyncExecute) operación y continuar con otro procesamiento.If your application is appropriately written, you can start a Recordset.Open(...,adAsyncExecute) operation and continue with other processing. Finalmente recibirá una notificación cuando el conjunto de registros se rellene con un evento ExecuteComplete .You will eventually be notified when the Recordset is populated by an ExecuteComplete event.

Controladores de eventos únicos y varios objetosSingle Event Handlers and Multiple Objects

La flexibilidad de un lenguaje de programación como Microsoft Visual C++® permite que un controlador de eventos procese eventos de varios objetos.The flexibility of a programming language like Microsoft Visual C++® enables you to have one event handler process events from multiple objects. Por ejemplo, podría tener un controlador de eventos de desconexión que procese eventos de varios objetos de conexión .For example, you could have one Disconnect event handler process events from several Connection objects. Si una de las conexiones ha finalizado, se llamará al controlador de eventos Disconnect .If one of the connections ended, the Disconnect event handler would be called. Podría indicar qué conexión causó el evento porque el parámetro de objeto de controlador de eventos se establecería en el objeto de conexión correspondiente.You could tell which connection caused the event because the event-handler object parameter would be set to the corresponding Connection object.

Nota

Esta técnica no se puede usar en Visual Basic porque ese lenguaje solo puede correlacionar un objeto con un controlador de eventos.This technique cannot be used in Visual Basic because that language can correlate only one object to an event handler.

Consulte tambiénSee Also

Resumen del controlador de eventos de ADO ADO Event Handler Summary
Creación de instancias de eventos de ADO por lenguaje ADO Event Instantiation by Language
Parámetros de evento Event Parameters
Tipos de eventosTypes of Events