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 事务隔离级别。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |