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.