Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Im Windows 8 SDK hat ODBC einen Mechanismus zum Benachrichtigen von Anwendungen hinzugefügt, wenn ein asynchroner Vorgang abgeschlossen ist, den wir als "Benachrichtigung beim Abschluss" bezeichnen. (Weitere Informationen finden Sie unter Asynchrone Ausführung (Notification-Methode ).) In diesem Thema werden einige der Probleme für Treiberentwickler erläutert.
Schnittstelle zwischen dem Treiber-Manager und dem Treiber
Der Treiber-Manager bietet intern eine Rückruffunktion namens SQLAsyncNotificationCallback-Funktion an. SQLAsyncNotificationCallback kann nur vom Treiber aufgerufen werden – eine Anwendung kann sie nicht direkt aufrufen. Der Treiber ruft SQLAsyncNotificationCallback immer dann auf, wenn nach dem letzten Zurückgeben von SQL_STILL_EXECUTING neue Daten vom Server empfangen wurden.
Der Treiber-Manager stellt einen Callback-Mechanismus bereit, damit ein Treiber den Treiber-Manager benachrichtigen kann, wenn beim Ausführen eines asynchronen Vorgangs Fortschritte gemacht wurden, nachdem die entsprechende Funktion SQL_STILL_EXECUTING zurückgibt.
Der Treiber-Manager legt das Attribut SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK auf einem Treiberverbindungshandle mit einem Nicht-NULL-Funktionszeiger fest, der vom Typ SQL_ASYNC_NOTIFICATION_CALLBACK ist, um den Treiber im Benachrichtigungsmodus für alle asynchronen Vorgänge auf diesem Handle arbeiten zu lassen. Ebenso legt der Treiber-Manager das Attribut SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK auf einem Treiber-Anweisungshandle mit einem Nicht-NULL-Funktionszeiger fest, der ebenfalls vom Typ SQL_ASYNC_NOTIFICATION_CALLBACK ist, damit der Treiber für alle asynchronen Vorgänge auf diesem Handle im Benachrichtigungsmodus arbeiten kann.
Wenn ein asynchroner Vorgang für ein Treiberhandle ausgeführt wird, sollten die asynchronen Treiberfunktionen in einem nicht blockierenden Stil funktionieren. Wenn der Vorgang nicht sofort abgeschlossen werden kann, sollte die Treiberfunktion SQL_STILL_EXECUTING zurückgeben. Diese Anforderung gilt sowohl für den Abrufmodus als auch für den Benachrichtigungsmodus.
Wenn sich ein Handle im asynchronen Benachrichtigungsmodus befindet, muss der Treiber die Benachrichtigungsrückruffunktion aufrufen, deren Adresse dem Wert für das Attribut SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK oder SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK entspricht, einmal, nachdem SQL_STILL_EXECUTING zurückgegeben wurde. Mit anderen Worten, eine zurückgegebene SQL_STILL_EXECUTING muss mit einem Aufruf der Benachrichtigungsrückruffunktion gekoppelt werden. Der Treiber sollte den aktuellen Wert des SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT oder SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT Handle-Attributs als Wert für den Rückruffunktionsparameter pContext verwenden.
Der Treiber darf nicht im Thread zurückgerufen werden, der die Treiberfunktion aufruft; Es gibt keinen Grund, den Fortschritt zu benachrichtigen, bevor die Funktion zurückgegeben wird. Der Treiber sollte einen eigenen Thread zum Rückruf verwenden. Der Treiber-Manager verwendet nicht den Rückrufthread des Treibers für die Ausführung umfangreicher Verarbeitungslogik.
Der Manager ruft die ursprüngliche Funktion erneut auf, nachdem der Treiber einen Rückruf ausführt. Der Treiber-Manager kann einen Thread verwenden, der weder ein Anwendungsthread noch ein Treiberthread ist. Wenn der Treiber einige Informationen verwendet, die dem Thread zugeordnet sind (z. B. Sicherheitstoken oder Benutzerbezeichner), sollte der Treiber die erforderlichen Informationen im anfänglichen asynchronen Aufruf speichern und den gespeicherten Wert verwenden, bevor der gesamte asynchrone Vorgang abgeschlossen ist. In der Regel müssen nur SQLDriverConnect, SQLConnect oder SQLBrowseConnect diese Art von Informationen verwenden.