Der SQL Anywhere ODBC-Treiber unterstützt einige erweiterte Verbindungsattribute.
SA_REGISTER_MESSAGE_CALLBACK Nachrichten können unter Verwendung der SQL MESSAGE-Anweisung vom Datenbankserver an die Clientanwendung gesendet werden. Außerdem können Nachrichten aufgrund von lang laufenden Datenbankserver-Anweisungen generiert werden. Weitere Hinweise finden Sie unter MESSAGE-Anweisung.
Es kann eine Message-Handler-Routine erstellt werden, um diese Nachrichten abzufangen. Der Message-Handler Callback-Prototyp sieht wie folgt aus:
void SQL_CALLBACK Message_Handler( SQLHDBC sqlany_dbc, unsigned char Nachrichtentyp, long Code, unsigned short Länge, char * Nachricht );
Die folgenden zulässigen Werte für Nachrichtentyp sind in sqldef.h festgelegt.
MESSAGE_TYPE_INFO Der Nachrichtentyp war INFO.
MESSAGE_TYPE_WARNING Der Nachrichtentyp war WARNING.
MESSAGE_TYPE_ACTION Der Nachrichtentyp war ACTION.
MESSAGE_TYPE_STATUS Der Nachrichtentyp war STATUS.
MESSAGE_TYPE_PROGRESS Der Nachrichtentyp war PROGRESS. Dieser Nachrichtentyp wird aufgrund von lang laufenden Datenbankserver-Anweisungen wie BACKUP DATABASE und LOAD TABLE generiert. Siehe progress_messages-Option.
Ein SQLCODE, der der Nachricht zugeordnet ist, kann in Code übermittelt werden. Wenn keiner verfügbar ist, ist der Code-Parameterwert 0.
Die Länge der Nachricht ist in Länge enthalten.
Ein Zeiger auf die Nachricht ist in Nachricht enthalten. Beachten Sie, dass Nachricht nicht null-terminiert ist. Ihre Anwendung muss in der Lage sein, dies zu verarbeiten. Im Folgenden finden Sie ein Beispiel.
memcpy( mybuff, msg, len ); mybuff[ len ] = '\0'; |
Um den Message-Handler in ODBC zu registrieren, rufen Sie die Funktion SQLSetConnectAttr folgendermaßen auf:
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, (SQLPOINTER) &message_handler, SQL_IS_POINTER ); |
Um die Registrierung des Message-Handlers in ODBC aufzuheben, rufen Sie die Funktion SQLSetConnectAttr folgendermaßen auf:
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, NULL, SQL_IS_POINTER ); |
SA_GET_MESSAGE_CALLBACK_PARM Um den Wert des SQLHDBC-Verbindungshandles abzufragen, der an die Message-Handler Callback-Routine übergeben wird, verwenden Sie SQLGetConnectAttr mit dem Parameter SA_GET_MESSAGE_CALLBACK_PARM.
SQLHDBC callback_hdbc = NULL; rc = SQLGetConnectAttr( hdbc, SA_GET_MESSAGE_CALLBACK_PARM, (SQLPOINTER) &callback_hdbc, 0, 0 ); |
Der Rückgabewert ist derselbe wie der Parameterwert, der an die Message-Handler Callback-Routine übergeben wird.
SA_REGISTER_VALIDATE_FILE_TRANSFER_CALLBACK Dies wird verwendet, um eine Callback-Funktion zur Dateiübertragungsvalidierung zu registrieren. Bevor er eine Übertragung zulässt, ruft der Treiber die Validierungs-Callback-Funktion auf, falls vorhanden. Falls die Client-Datenübertragung während der Ausführung von indirekten Anweisungen angefordert wird, lässt der ODBC-Treiber die Übertragung nur zu, wenn die Clientanwendung einen Validierungs-Callback registriert hat. Die Bedingungen, unter denen ein Validierungsaufruf durchgeführt wird, werden unten ausführlich beschrieben.
Der Callback-Prototyp sieht wie folgt aus:
int SQL_CALLBACK file_transfer_callback( void * sqlca, char * file_name, int is_write );
Der Parameter file_name ist der Name der zu lesenden oder zu schreibenden Datei. Der Parameter is_write ist 0, wenn ein Lesevorgang (Übertragung vom Client zum Datenbankserver) angefordert wird, und Nicht-Null bei einem Schreibvorgang. Die Callback-Funktion sollte 0 zurückgeben, wenn die Übertragung nicht zulässig ist, ansonsten Nicht-Null.
Aus Gründen der Datensicherheit protokolliert der Datenbankserver den Ursprung von Anweisungen, die eine Dateiübertragung anfordern. Der Datenbankserver ermittelt, ob die Anweisung direkt von der Clientanwendung empfangen wurde. Wenn er die Datenübertragung vom Client initiiert, sendet der Datenbankserver die Informationen über den Ursprung der Anweisung an die Clientsoftware. Ihrerseits erlaubt der ODBC-Treiber nur dann eine bedingungslose Datenübertragung, wenn diese aufgrund der Ausführung einer Anweisung angefordert wird, die direkt von der Clientanwendung gesendet wurde. Ansonsten muss die Anwendung den oben beschriebenen Validierungs-Callback registriert haben. Wenn dieser fehlt, wird die Übertragung verweigert und die Anweisung schlägt mit einem Fehler fehl. Beachten Sie: Wenn die Clientanweisung eine bereits in der Datenbank vorhandene gespeicherte Prozedur aufruft, wird die Ausführung der gespeicherten Prozedur selbst nicht als eine vom Client initiierte Anweisung angesehen. Wenn die Clientanwendung allerdings explizit eine temporäre gespeicherte Prozedur erstellt, führt die Ausführung der gespeicherten Prozedur dazu, dass der Datenbankserver die Prozedur als eine vom Client initiierte behandelt. Wenn die Clientanwendung eine Batchanweisung ausführt, wird auf gleiche Weise die Ausführung der Batchanweisung als eine angesehen, die direkt von der Clientanwendung durchgeführt wird.
SA_SQL_ATTR_TXN_ISOLATION Dies wird verwendet, um eine erweiterte Transaktionsisolationsstufe zu setzen. Im folgenden Beispiel wird eine Snapshot-Isolationsstufe gesetzt:
SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); SQLSetConnectAttr( dbc, SA_SQL_ATTR_TXN_ISOLATION, SA_SQL_TXN_SNAPSHOT, SQL_IS_UINTEGER ); |
Weitere Hinweise finden Sie unter Isolationsstufen für ODBC-Transaktionen wählen.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |