API MySQL

トップ ページ

このメッセージに返信
著者: ML Guilde
日付:  
To: ML Guilde
題目: API MySQL
Bonjour,

J'ai fait un petit wrapper C++ pour l'API C de MySQL, et j'ai un petit
soucis. Je n'arrive pas a recuperer le nom des champs d'une base si
celle-ci est vide. Du coup, impossible d'ajouter la moindre fiche. Si
quelqu'un a une idee...

Voici ci-dessous les methodes utilisees pour une requete et la recuperation
des champs. LA premiere chose que je fais est une requete genre

SELECT * from <base>

Ce qui doit en principe appeler FillFields() pour recuperer le nom des
champs et les remplir avec la premiere fiche. Mais comme dans Query() le
resultat de mysql_num_rows() est nul, je ne peut pas appeler
mysql_fetch_row(), ni mysql_fetch_fields().

Auriez-vous une idee ?

Merci.

-----------------------------------------------------------------------

void MySQLpp::Query(const string& query)
{
  m_row = 0;
  if (m_rowResult != 0) {
    mysql_free_result(m_rowResult);
  }
  m_rowResult = 0;
  if (mysql_real_query(&m_mysql, query.c_str(), query.size())) {
    ExcMySQLpp excMysql(2, mysql_error(&m_mysql), 1);
    throw excMysql;
  }
  if ((m_rowResult = mysql_store_result(&m_mysql)) == 0) {
    if (mysql_field_count(&m_mysql) != 0) {
      ExcMySQLpp excMysql(3, mysql_error(&m_mysql), 1);
      throw excMysql;
    }
  }
   else {
    m_nbFields = mysql_field_count(&m_mysql);
    if ((m_nbRows = mysql_num_rows(m_rowResult)) == 0) {
      ExcMySQLpp excMysql(4, "Le resultat de la requete est vide", 0);
      throw excMysql;
    }
    FillFields();
  }
}


void MySQLpp::SetField(const int numField, const string& value)
{
  if ((numField < 0) || (numField >= m_nbFields)) {
    ExcMySQLpp excMysql(7, "Champ invalide", 0);
    throw excMysql;
  }
  field[numField].value = value;
}


void MySQLpp::FillFields()
{
  mysql_data_seek(m_rowResult, m_row);
  if ((m_rowRow = mysql_fetch_row(m_rowResult)) == 0) {
    ExcMySQLpp excMysql(5, mysql_error(&m_mysql), 1);
    throw excMysql;
  }
  m_rowField = mysql_fetch_fields(m_rowResult);
  m_nbFields = mysql_num_fields(m_rowResult);
  for (long iField = 0; iField < m_nbFields; iField++) {
    field[iField].name = m_rowField[iField].name;
    if (m_nbRows == 0) {
      field[iField].value = "";
    }
    else {
      if (m_rowRow[iField]) {
        field[iField].value = m_rowRow[iField];
      }
      else {
        field[iField].value = "";
      }
    }
    field[iField].length = m_rowField[iField].length;
  }
 }



--
Frederic