Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2012
LucasBols LucasBols is offline
Miembro
 
Registrado: Nov 2011
Posts: 10
Poder: 0
LucasBols Va por buen camino
Problema con inserción de BLOB MySQL desde C++ con libmysql

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:

Código:
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;
    }
}
Responder Con Cita
  #2  
Antiguo 31-05-2012
LucasBols LucasBols is offline
Miembro
 
Registrado: Nov 2011
Posts: 10
Poder: 0
LucasBols Va por buen camino
Corrijo

El mensaje no se presenta solamente en Windows XP, sino que se presenta cuando intento acceder a MySQL ubicado en un servidor de la red o remoto.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema para guardar datos desde campo Blob al disco duro phirum1984 Conexión con bases de datos 5 16-10-2013 18:39:35
insercion jpg mysql problema:= tamaño jpg vroa74 Gráficos 5 24-11-2011 21:07:02
migrar blob de firebird a blob mysql mavirroco Varios 1 02-02-2011 14:40:58
Ayuda con insercion de imágenes en campo blob aojeda Gráficos 0 29-01-2009 18:23:46
Inserción y recuperación de campos BLOB Ismael Campos PHP 4 16-08-2007 07:12:43


La franja horaria es GMT +2. Ahora son las 14:24:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi