Article View: es.comp.os.linux.programacion
Article #195Problema con inserción de BLOB MySQL desde C++ con libmysql
From: LucasBols
Date: Wed, 30 May 2012 19:54
Date: Wed, 30 May 2012 19:54
141 lines
5725 bytes
5725 bytes
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;
}
}
Technical Details
Message-ID:
<aebcf199-d093-4aad-8418-97673526ccb2@e18g2000yqc.googlegroups.com>Path:
arc1-ca.pugleaf.net!l9ni1008pbj.0!nntp.google.com!news1.google.com!postnews.google.com!e18g2000yqc.googlegroups.com!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Thread: 646d03421f,c23927b3b3d73ece,start
X-Google-Attributes: gid646d03421f,public,usenet
X-Google-NewGroupId: yes
X-Google-Language: SPANISH,ASCII
Received: by 10.68.220.230 with SMTP id pz6mr13874830pbc.3.1338407692885;
Wed, 30 May 2012 12:54:52 -0700 (PDT)
Path: arc1-ca.pugleaf.net!l9ni1008pbj.0!nntp.google.com!news1.google.com!postnews.google.com!e18g2000yqc.googlegroups.com!not-for-mail
From: LucasBols <dnasta@gmail.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Problema con inserción de BLOB MySQL desde C++ con libmysql
Date: Wed, 30 May 2012 12:54:52 -0700 (PDT)
Organization: http://groups.google.com
Lines: 141
Message-ID: <aebcf199-d093-4aad-8418-97673526ccb2@e18g2000yqc.googlegroups.com>
NNTP-Posting-Host: 200.122.67.212
Mime-Version: 1.0
X-Trace: posting.google.com 1338407692 7902 127.0.0.1 (30 May 2012 19:54:52 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Wed, 30 May 2012 19:54:52 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: e18g2000yqc.googlegroups.com; posting-host=200.122.67.212; posting-account=LYkAiAoAAACJqd9QviWQhL1sG70WXkIg
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0,gzip(gfe)
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable