PDA

Ver la Versión Completa : Inesperado resultado en una consulta SQL en una tabla MySQL


MON___
08-07-2008, 19:53:51
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:

#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