Benachrichtigung der Asynchronen Funktionsvollendung

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. (Siehe Asynchrone Ausführung (Notification-Methode) für weitere Informationen.) In diesem Thema werden einige der Probleme für Treiberentwickler erläutert.

Schnittstelle zwischen Treiber-Manager und Treiber

Der Treiber-Manager stellt intern eine Rückruffunktion SQLAsyncNotificationCallback-Funktion bereit. SQLAsyncNotificationCallback kann nur vom Treiber aufgerufen werden – eine Anwendung kann sie nicht direkt aufrufen. Der Treiber ruft SQLAsyncNotificationCallback immer dann auf, wenn neue Daten, die nach dem letzten Zurückgeben von SQL_STILL_EXECUTING vom Server empfangen wurden.

Der Treiber-Manager stellt einen Rückrufmechanismus 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

Der Treiber-Manager legt das attribut SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK für ein Treiberverbindungshandle mit einem Nicht-NULL-Funktionszeiger fest, der vom Typ SQL_ASYNC_NOTIFICATION_CALLBACK ist, damit der Treiber im Benachrichtigungsmodus für alle asynchronen Vorgänge auf diesem Handle funktioniert. Ebenso legt der Treiber-Manager das attribut SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK für ein Treiber-Anweisungshandle mit einem Nicht-NULL-Funktionszeiger fest, der auch vom Typ SQL_ASYNC_NOTIFICATION_CALLBACK ist, damit der Treiber im Benachrichtigungsmodus für alle asynchronen Vorgänge in diesem Handle funktioniert.

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 der Wert für das attribut SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK oder SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK ist, 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 Parameter der Rückruffunktion 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 Treiber-Manager ruft die ursprüngliche Funktion erneut auf, nachdem der Treiber wieder aufgerufen wurde. 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 SQLDriver Verbinden, SQL Verbinden oder SQLBrowse Verbinden diese Art von Informationen verwenden.

Weitere Informationen

Developing an ODBC Driver (Entwickeln eines ODBC-Treibers)