Ver Mensaje Individual
  #1  
Antiguo 08-07-2008
MON___ MON___ is offline
Miembro
 
Registrado: abr 2007
Ubicación: Salamanca (España)
Posts: 84
Reputación: 18
MON___ Va por buen camino
Inesperado resultado en una consulta SQL en una tabla MySQL

Estoy escribiendo una función en C++ Builder para obtener un valor incrementable. La estoy probando sobre una tabla muy sencilla, con tan sólo dos campos: Campo1 varchar(26), Campo2 smallint(6).
La función requiere el nombre de la tabla y del campo numérico.
Éste es el código de la función:

Código:
#include <winsock.h>
#include <mysql\mysql.h>
#include <vcl.h>

int IncrementarCampo(char * tabla, char *campo)
{
 MYSQL * MySQL;
  MYSQL_RES * RES;
  MYSQL_ROW ROW;
  int x;

  // iniciar MySQL
  MySQL = mysql_init(NULL);
  if(!MySQL)
  {
   MessageBox(NULL, "No se ha podido establecer una conexión con MySQL", "ERROR", MB_ICONINFORMATION +
         MB_OK + MB_APPLMODAL);
   return 0;
  }

  // establecer conexión con el servidor
  if(!mysql_real_connect(MySQL, "localhost", "root", "mi clave", NULL, MYSQL_PORT, NULL, 0))
  {
      MessageBox(NULL, "No se ha podido establecer una conexión con el servidor MySQL", "ERROR", MB_ICONINFORMATION +
         MB_OK + MB_APPLMODAL);
      mysql_close(MySQL);
      return 0;
  }

  // conectar con la base de datos
  if(mysql_select_db("MI_DB"))
   {
      MessageBox(NULL, Format("No se ha conectado con la base de datos. Se ha producido el error: %s",
          ARRAYOFCONST((mysql_error(MySQL)))).c_str(), "Error", MB_ICONINFORMATION + MB_OK + MB_APPLMODAL);
      mysql_close(MySQL);
      return 0;
   }

   // ejecutar la consulta
   AnsiString SQL = Format("SELECT MAX(%S) FROM %S",
      ARRAYOFCONST((campo, tabla)));
   if(mysql_query(MySQL, SQL.c_str()))
   {
      MessageBox(NULL, Format("No se ha ejecutado la consulta. Se ha producido el error: %s",
          ARRAYOFCONST((mysql_error(MySQL)))).c_str(), "Error", MB_ICONINFORMATION + MB_OK + MB_APPLMODAL);
      mysql_close(MySQL);
      return 0;
   }

   // obtener el número de filas
   RES = mysql_store_result(MySQL);
   if(!RES)
   {
      MessageBox(NULL, Format("No se ha podido acceder a los datos de la consulta. Se ha producido el error: %s",
          ARRAYOFCONST((mysql_error(MySQL)))).c_str(), "Error", MB_ICONINFORMATION + MB_OK + MB_APPLMODAL);
      mysql_close(MySQL);
      return 0;
   }

   // Comprobar número de filas y si es 0 (no hay registros)
   x = mysql_num_rows(RES);
   if( x == 0)
   {
      x++;
      mysql_free_result(RES);
      mysql_close(MySQL);
      return x;
   }
      // si es uno, obtener el valor máximo e incrementar
   if(x == 1)
   {
      ROW = mysql_fetch_row(RES);
      x = (int)ROW[0];         // ¿está aquí el error????????
      x++;
      mysql_free_result(RES);
      mysql_close(MySQL);
      return x;
   }   
}
¿Cuál es mi problema? Pues que el valor que obtengo (MAX) es 9.461.800 en lugar de 20, que es el valor MÁXIMO asignado a uno de los registros.
¿Dónde está el error?
Saludos a todos
Responder Con Cita