Пример #1
0
// ////////////////////////////////////////////////////////////////////////////
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()));
}
Пример #2
0
//	////////////////////////////////////////////////////////////////////////////
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));
}