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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere ODBC API

 

SQL Anywhere 连接属性

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 不是以空值终止的。必须设计您的应用程序以处理这一问题。以下是一个示例。

    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 连接句柄的值,请将 SQLGetConnectAttr 与 SA_GET_MESSAGE_CALLBACK_PARM 参数配合使用。
    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,否则返回非零值。

    为确保数据安全,服务器会跟踪请求文件传输的语句的源。服务器会确定语句是否是从客户端应用程序直接接收的。从客户端启动数据传输时,服务器会将语句源的相关信息发送到客户端软件。对于嵌入式 SQL 客户端库而言,仅当是由于执行客户端应用程序直接发送的语句而请求数据传输时,它才会允许无条件传输数据。否则,应用程序必须注册上文所述的校验回调函数,如果未注册该函数,则传输会被拒绝,而且语句失败并出现一个错误。请注意,如果客户端语句调用的某个存储过程在数据库中已经存在,则对该存储过程本身的执行不被视为是客户端启动的语句所完成的。但是,如果客户端应用程序显式地创建一个临时存储过程,则服务器会将对该存储过程的执行视为是由客户端启动的。同样,如果客户端应用程序执行一个批处理语句,则该批处理语句的执行被视为是直接由客户端应用程序完成的。

  • SA_SQL_ATTR_TXN_ISOLATION   该属性用于设置扩展的事务隔离级别。以下示例设置一个快照隔离级别:
    SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );
    SQLSetConnectAttr( dbc, SQL_ATTR_TXN_ISOLATION,
          SA_SQL_TXN_SNAPSHOT, SQL_IS_UINTEGER );

    有关详细信息,请参见选择 ODBC 事务隔离级别