mysql_fetch_field nao retorna um field valido. (C++/MySQL)

Iniciado por MaikoID, 31 de Agosto de 2008, 16:01

tópico anterior - próximo tópico

MaikoID

Olá.

Novamente cá estou eu, é que esse meu tcc com c++ e mysql ta me dando umas serias dores de cabeça. Eu procurei por um bom tempo na web e em outros forums, mas não obtive sucesso. Estou tendo o seguinte problema, eu preciso mostrar na tela todos os campos retornados por um select e estou fazendo deste modo.

MYSQL_RES *resultSet = NULL;    MYSQL_ROW linha;    MYSQL_FIELD *field;    baseDados *base = NULL;    base = new baseDados(IP, USUARIO, SENHA, BASE);    cout << "\n\nAbrindo banco de dados: ";    if (base->abreConexao()) {        cout << "OK.\n\n";        resultSet = base->executeQuery("select nome, cargo from funcionarios;");        if (resultSet != NULL) {            for (int i = 0; i < mysql_num_fields(resultSet); i++) {                field = mysql_fetch_field(resultSet);                cout << field->name << std::setw(field->length);            }            cout << "\n\n";            while ((linha = mysql_fetch_row(resultSet)) != NULL) {                for (int j = 0; j < mysql_num_fields(resultSet); j++) {                    cout << linha[j] << std::setw(30);                }//                cout << linha[base->posicaoCampo("nome", resultSet)] << setw(30);//                cout << linha[base->posicaoCampo("cargo", resultSet)] << setw(30);                cout << endl;                                            }            base->freeResultSet(resultSet);        }        else {            cout << "A consulta nao retornou nenhum resultado: " << mysql_error(base->getConexao()) << endl;        }    }    else {        cout << "Fail.\n\n" << mysql_error(base->getConexao());    }?>
Deste modo funciona ele imprime os nome dos campos que foram gerados com a consulta e estao dentro do resultSet e em seguida imprime (meio mal formatado) o conteudo do que foi retornado:


Abrindo banco de dados: OK.

nome                                             cargo                 

Maiko Cezar Rodrigues Costa                   programador
Jose Garibald Rodrigues Costa                  segurança
        Filipe Santos Ferreira                  fotocopiador
   Jonas Cezar Rodrigues Costa                   programador
Chaves Garibald Rodrigues Costa                  segurança
        Rosana Santos Ferreira                  fotocopiador
[Press Enter to close window]
O que esta me preocupando sao as linhas comentadas, que sao apenas modos mais abstratos de fazerem a mesma coisa que estou fazendo, e eu preciso deles na minha classe baseDados. O método posicaoCampo tem essa assinatura.

int baseDados::posicaoCampo(char *nome, MYSQL_RES *resultSet) {    int i;    MYSQL_FIELD *field;    // caso ele encontre um campo que tenha como nome igual o nome passado como    // parametro ele retorna a posicao deste campo.    for (i = 0; i < mysql_num_fields(resultSet); i++) {        field = mysql_fetch_field(resultSet);        if (strcmp(nome, field->name) == 0) {            return i;        }    }        // se ele chegar ate aqui é que ele nao encontrou nada e retorna -1    // sabendo que se eu chamar em linha[-1] vai dar erro. (mas a principio    // o desenvolvedor sabe o nome do campo procurado.    return -1;}?>
e o resultado disto é isso:


Abrindo banco de dados: OK.

nome                                             cargo                 

Segmentation fault (core dumped)
[Press Enter to close window]
realmente nao sei o que esta acontecendo, debugando eu vejo que nesta linha o campo field não é atribuido.

field = mysql_fetch_field(resultSet);?>


eu realmente nao sei como isso acontece, afinal essa funcao mysql_fetch_field te retorna um campo com seus respectivos atributos, mas neste exemplo nada é atribuido ao campo field fica como se fosse nulo (0X0). Tendo absoluta certeza (pelo debug) que o resultSet passado é valido e esta com todos os valores corretamente.


Abraço.!
Linux - Beginner Ç.Ç

fpissarra

Mesmo que o ponteiro resultSet seja válido, ele não está apontando para o final da tabela? mysql_fetch_field() pode retornar NULL nesse caso.