SQL Anywhere ODBC ドライバは、拡張された一部の接続属性をサポートしています。
SA_REGISTER_MESSAGE_CALLBACK メッセージは、SQL MESSAGE 文を使用してクライアント・アプリケーションからサーバに送信できます。メッセージ・ハンドラ・ルーチンを作成して、これらのメッセージを捕捉できます。メッセージ・ハンドラのコールバック・プロトタイプを次に示します。
void SQL_CALLBACK message_handler( SQLHDBC sqlany_dbc, unsigned char msg_type, long code, unsigned short length, char * message );
msg_type に指定できる次の値は、sqldef.h で定義されています。
MESSAGE_TYPE_INFO メッセージ・タイプは INFO でした。
MESSAGE_TYPE_WARNING メッセージ・タイプは WARNING でした。
MESSAGE_TYPE_ACTION メッセージ・タイプは ACTION でした。
MESSAGE_TYPE_STATUS メッセージ・タイプは STATUS でした。
メッセージに関連付けられている SQLCODE を code に指定することができます。指定がない場合、code パラメータの値は 0 です。
メッセージの長さは length に記述されています。
メッセージへのポインタは message に記述されています。message が NULL で終了されていないことに注意してください。この問題を処理するようにアプリケーションを設計する必要があります。次はその例です。
memcpy( mybuff, msg, len ); mybuff[ len ] = '\0'; |
メッセージ・ハンドラを ODBC に登録するには、次のようにして SQLSetConnectAttr 関数を呼び出します。
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, (SQLPOINTER) &message_handler, SQL_IS_POINTER ); |
メッセージ・ハンドラの登録を ODBC から解除するには、次のようにして SQLSetConnectAttr 関数を呼び出します。
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, NULL, SQL_IS_POINTER ); |
SA_GET_MESSAGE_CALLBACK_PARM メッセージ・ハンドラのコールバック・ルーチンに渡される SQLHDBC 接続ハンドルの値を取得するには、SA_GET_MESSAGE_CALLBACK_PARM パラメータを指定して SQLGetConnectAttr 関数を呼び出します。
SQLHDBC callback_hdbc = NULL; rc = SQLGetConnectAttr( hdbc, SA_GET_MESSAGE_CALLBACK_PARM, (SQLPOINTER) &callback_hdbc, 0, 0 ); |
戻り値は、メッセージ・ハンドラのコールバック・ルーチンに渡されるパラメータ値と同じです。
SA_REGISTER_VALIDATE_FILE_TRANSFER_CALLBACK これは、ファイル転送の検証コールバック関数を登録するために使用します。転送を許可する前に、ODBC ドライバは検証コールバックが存在する場合は、それを呼び出します。ストアド・プロシージャからなどの間接文の実行中にクライアントのデータ転送が要求された場合、ODBC ドライバはクライアント・アプリケーションで検証コールバックが登録されていないかぎり転送を許可しません。どのような状況で検証の呼び出しが行われるかについては、以下でより詳しく説明します。
コールバック・プロトタイプを次に示します。
int SQL_CALLBACK file_transfer_callback( void * sqlca, char * file_name, int is_write );
file_name パラメータは、読み込みまたは書き込み対象のファイルの名前です。is_write パラメータは、読み込み (クライアントからサーバへの転送) が要求された場合は 0、書き込みが要求された場合は 0 以外の値になります。ファイル転送が許可されない場合、コールバック関数は 0 を返します。それ以外の場合は 0 以外の値を返します。
データのセキュリティ上、サーバはファイル転送を要求している文の実行元を追跡します。サーバは、文がクライアント・アプリケーションから直接受信されたものかどうかを判断します。クライアントからデータ転送を開始する際に、サーバは文の実行元に関する情報をクライアント・ソフトウェアに送信します。クライアント側では、クライアント・アプリケーションから直接送信された文を実行するためにデータ転送が要求されている場合にかぎり、Embedded SQL クライアント・ライブラリはデータの転送を無条件で許可します。それ以外の場合は、上述の検証コールバックがアプリケーションで登録されていることが必要です。登録されていない場合、転送は拒否されて文が失敗し、エラーが発生します。データベース内に既存しているストアド・プロシージャがクライアントの文で呼び出された場合、ストアド・プロシージャそのものの実行はクライアントの文で開始されたものと見なされません。ただし、クライアント・アプリケーションでテンポラリ・ストアド・プロシージャを明示的に作成してストアド・プロシージャを実行した場合、そのプロシージャはクライアントによって開始されたものとしてサーバは処理します。同様に、クライアント・アプリケーションでバッチ文を実行する場合も、バッチ文はクライアント・アプリケーションによって直接実行されるものと見なされます。
SA_SQL_ATTR_TXN_ISOLATION これは、拡張されたトランザクションの独立性レベルを設定するために使用します。次の例は、snapshot 独立性レベルを設定します。
SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); SQLSetConnectAttr( dbc, SQL_ATTR_TXN_ISOLATION, SA_SQL_TXN_SNAPSHOT, SQL_IS_UINTEGER ); |
詳細については、ODBC トランザクションの独立性レベルの選択を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |