LucasBols
unread,May 30, 2012, 3:54:52 PM5/30/12You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Hola, buenas tardes,
Tengo una aplicación en C++Builder con cuatro módulos ejecutables, de
los cuales, 3 insertan imagenes en campos BLOB
Los primeros errores fueron en máquinas XP, el error fue este:
"can't send long data for non-string/non-binary data types"
Después de verificar que el procedimiento no tuviera errores,
actualicé la libmysql.dll a la 5.5.24, a partir de ese momento, el
error cambió a:
"No se pudo insertar el parámetro: Lost connection to MySQL server
during query"
Después de leer mucha documentación, en my.ini, en la sección [mysqld]
agregué esto:
max_allowed_packet=32M
wait_timeout=288000
skip-name-resolve
y el mensaje de error cambió, ahora dice:
"Argumentos errados para mysqld_stmt_execute"
DATOS EXTRA:
Los 3 módulos utilizan la misma clase para inserción, 2 de los módulos
nunca han generado ningún mensaje de error, pero el tercero, genera
mensajes diversos en cientas condiciones que no puedo determinar ni
reproducir.
De los 3 módulos. 2 están compilados con BCB2006 y libmysql.dll v5.0
en XP, el que da error, con C++Builder XE en W7 y la librería,
inicialmente era la 5.0, y la actualicé a la 5.5.24.
En este laboratorio tengo 3 máquinas (XP, Windows 7 y Windows 8) donde
he probado este tercer módulo y no genera ningún error, sin embargo,
en algunas de las máquinas de mis clientes, ese tercer módulo genera
errores.
Verifiqué las clases que realizan la inserción, las puse a prueba en
mis 3 máquinas y en ningún momento saltó el error.
Los motores MySQL de mis clientes están en Linux y en Windows, en
ambos ocasionalmente salta el error.
Hasta ahora, el error solamente salta en XP.
¿Alguien tiene alguna solución o alguna sugerencia de por donde
encarar el problema? Estoy completamente perdido, y lo peor es que no
puedo reproducir el fallo.
Saludos y gracias por anticipado.
P.D.: Les copio el procedimiento de inserción de BLOBs:
bool TBaseDeDatos::AlmacenarBLOB(AnsiString cons, const char *param,
unsigned long lngParam) {
lcl_MySQL_Error = "";
lcl_NumFilas = 0;
lcl_CodError = 0;
mysql = mysql_init(NULL);
my_bool reconnect = 1;
if (!mysql) {
lcl_MySQL_Error = "No se pudo inicializar la base de datos: " +
(AnsiString) mysql_error(mysql);
return false;
}
else {
mysql_options(mysql, MYSQL_OPT_COMPRESS, 0);
mysql_options(mysql, MYSQL_OPT_RECONNECT, &reconnect);
mysql->reconnect = 1;
if (!mysql_real_connect(mysql, prihost.c_str(), priusr.c_str(),
pripass.c_str(), prinombd.c_str(), PuertoMYSQL, NULL, 0)) {
lcl_MySQL_Error = "No se pudo conectar a la base de datos: " +
(AnsiString) mysql_error(mysql);
return false;
}
else {
if (mysql_select_db(mysql, prinombd.c_str())) {
lcl_MySQL_Error = "No se pudo abrir la base de datos: " +
(AnsiString) mysql_error(mysql);
return false;
}
else {
MYSQL_BIND bind[1];
unsigned long length;
st_mysql_stmt *stmt = mysql_stmt_init(mysql);
if (!stmt) {
lcl_MySQL_Error = "No hay memoria suficiente: " +
(AnsiString) mysql_error(mysql);
return false;
}
if (mysql_stmt_prepare(stmt, cons.c_str(),
StrLen(cons.c_str()))) {
lcl_MySQL_Error = "No se pudo preparar la consulta: " +
AnsiString(mysql_stmt_error(stmt));
return false;
}
memset(bind, 0, sizeof(bind));
bind[0].buffer_type = MYSQL_TYPE_BLOB;
bind[0].buffer = (char*)param;
bind[0].length = &length;
bind[0].is_null = 0;
mysql_ping(mysql);
if (mysql_stmt_bind_param(stmt, bind)) {
lcl_MySQL_Error = "No se pudo enlazar el parámetro: " +
AnsiString(mysql_stmt_error(stmt));
return false;
}
if (mysql_stmt_send_long_data(stmt, 0, (const char *)param,
lngParam)) {
lcl_MySQL_Error = "No se pudo insertar el parámetro: " +
AnsiString(mysql_stmt_error(stmt));
return false;
}
if (mysql_stmt_execute(stmt)) {
lcl_MySQL_Error = "No se pudo ejecutar la consulta: " +
AnsiString(mysql_stmt_error(stmt));
return false;
}
ultimoID = mysql_insert_id(mysql);
}
}
return true;
}
}