Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ プログラミング » ODBC サポート

 

SQLSetConnectAttr 拡張接続属性

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 でした。

    • MESSAGE_TYPE_PROGRESS   メッセージタイプは PROGRESS でした。このタイプのメッセージは、BACKUP DATABASE や LOAD TABLE などの実行時間が長いデータベースサーバ文によって生成されます。

    メッセージに関連付けられている SQLCODE を code に指定することができます。指定がない場合、code パラメータの値は 0 です。

    メッセージの長さは length に記述されています。

    メッセージへのポインタは 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 以外の値を返します。

    データのセキュリティ上、サーバはファイル転送を要求している文の実行元を追跡します。サーバは、文がクライアントアプリケーションから直接受信されたものかどうかを判断します。クライアントからデータ転送を開始する際に、サーバは文の実行元に関する情報をクライアントソフトウェアに送信します。クライアント側では、クライアントアプリケーションから直接送信された文を実行するためにデータ転送が要求されている場合にかぎり、ODBC ドライバはデータの転送を無条件で許可します。それ以外の場合は、上述の検証コールバックがアプリケーションで登録されていることが必要です。登録されていない場合、転送は拒否されて文が失敗し、エラーが発生します。データベース内に既存しているストアドプロシージャがクライアントの文で呼び出された場合、ストアドプロシージャそのものの実行はクライアントの文で開始されたものと見なされません。ただし、クライアントアプリケーションでテンポラリストアドプロシージャを明示的に作成してストアドプロシージャを実行した場合、そのプロシージャはクライアントによって開始されたものとしてサーバは処理します。同様に、クライアントアプリケーションでバッチ文を実行する場合も、バッチ文はクライアントアプリケーションによって直接実行されるものと見なされます。

  • SA_SQL_ATTR_TXN_ISOLATION   これは、拡張されたトランザクションの独立性レベルを設定するために使用します。次の例は、Snapshot 独立性レベルを設定します。
    SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );
    SQLSetConnectAttr( dbc, SA_SQL_ATTR_TXN_ISOLATION,
          SA_SQL_TXN_SNAPSHOT, SQL_IS_UINTEGER );

 参照