// //////////////////////////////////////////////////////////////////////////// OdbcDiagRecEx::OdbcDiagRecEx(SQLSMALLINT handle_type, SQLHANDLE handle_value, SQLSMALLINT record_number, bool throw_on_diag_field_error) try :OdbcDiagRec(handle_type, handle_value, record_number) ,class_origin_() ,column_number_(0) ,connection_name_() ,message_text_ex_() ,native_(0) ,row_number_(0) ,server_name_() ,sql_state_ex_() ,subclass_origin_() { if (record_number_ == SQL_NO_DATA) OdbcDiagRecEx().swap(*this); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_CLASS_ORIGIN, class_origin_, throw_on_diag_field_error); if (handle_type == SQL_HANDLE_STMT) GetDiagField_SQLINTEGER(handle_type, handle_value, record_number, SQL_DIAG_COLUMN_NUMBER, column_number_, throw_on_diag_field_error); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_CONNECTION_NAME, connection_name_, throw_on_diag_field_error); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_MESSAGE_TEXT, message_text_ex_, throw_on_diag_field_error); GetDiagField_SQLINTEGER(handle_type, handle_value, record_number, SQL_DIAG_NATIVE, native_, throw_on_diag_field_error); if (handle_type == SQL_HANDLE_STMT) GetDiagField_SQLINTEGER(handle_type, handle_value, record_number, SQL_DIAG_ROW_NUMBER, row_number_, throw_on_diag_field_error); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_SERVER_NAME, server_name_, throw_on_diag_field_error); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_SQLSTATE, sql_state_ex_, throw_on_diag_field_error); GetDiagField_String(handle_type, handle_value, record_number, SQL_DIAG_SUBCLASS_ORIGIN, subclass_origin_, throw_on_diag_field_error); handle_type_ = handle_type; handle_value_ = handle_value; record_number_ = record_number; } catch (const std::exception &except) { MLB::Utility::Rethrow(except, "Attempt to construct an instance of the " "class 'OdbcDiagRecEx(" + MLB::Utility::AnyToString(handle_type) + ", " + MLB::Utility::AnyToString(handle_value) + ", " + MLB::Utility::AnyToString(record_number) + ")' failed: " + std::string(except.what())); }
// //////////////////////////////////////////////////////////////////////////// SQLSMALLINT GetDiagRecordNumberCount(SQLSMALLINT handle_type, SQLHANDLE handle_value) { SQLINTEGER record_number; try { GetDiagField_SQLINTEGER(handle_type, handle_value, 0, SQL_DIAG_NUMBER, record_number); if (record_number < 0) throw OdbcException("Invocation of '::SQLGetDiagField()' with a " "diagnostic identifier of 'SQL_DIAG_NUMBER' resulted in a value " "of 0, which is invalid."); else if (record_number > std::numeric_limits<SQLSMALLINT>::max()) throw OdbcException("Invocation of '::SQLGetDiagField()' with a " "diagnostic identifier of 'SQL_DIAG_NUMBER' resulted in a value " "of " + MLB::Utility::AnyToString(record_number) + ", which is " "greater than the maximum permissible for a value of type '" "SQLSMALLINT' (" + MLB::Utility::AnyToString( std::numeric_limits<SQLSMALLINT>::max()) + ")."); } catch (const std::exception &except) { MLB::Utility::Rethrow(except, "Attempt to retrieve the count of " "diagnostic records for handle type " + MLB::Utility::AnyToString(handle_type) + ", handle value " + MLB::Utility::AnyToString(handle_value) + " failed: " + std::string(except.what())); } return(static_cast<SQLSMALLINT>(record_number)); }