Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ayuda con error en conexión a MySQL remota (https://www.clubdelphi.com/foros/showthread.php?t=78990)

LucasBols 31-05-2012 21:33:42

Ayuda con error en conexión a MySQL remota
 
Hola,
Tengo una aplicación desarrollada en C++Builder XE y uso la libmysql.dll

Cuando inserto una imagen en un campo BLOB en la base de datos local (en la misma máquina que la aplicación) la inserción se realiza correctamente, pero cuando inserto en una base de datos remota (dentro de la LAN) mysql_stmt_execute me genera este error:

"Argumentos errados para mysql_stmt_execute"

¿Qué estoy haciendo mal?

Muchas gracias por cualquier ayuda,

Este es el código del procedimiento para insertar 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);
                RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                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);
                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                        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);
                                RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                return false;
                        }
                        else
                        {
                                mysql_autocommit(mysql, TRUE);
                                MYSQL_BIND                bind[1];
                                MYSQL_STMT                *stmt = mysql_stmt_init(mysql);


                                if(!stmt)
                                {
                                        lcl_MySQL_Error = "No hay memoria suficiente: " + (AnsiString) mysql_error(mysql);
                                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                        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));
                                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                        return false;
                                }


                                memset(bind, 0, sizeof(bind));
                                bind[0].buffer_type        = MYSQL_TYPE_BLOB;
                                bind[0].buffer                = (void*)param;
                                bind[0].length                = &lngParam;
                                bind[0].is_null                = 0;


                                /* Bind the buffers */
                                if(mysql_stmt_bind_param(stmt, bind))
                                {
                                        lcl_MySQL_Error = "No se pudo enlazar el parámetro: " + AnsiString(mysql_stmt_error(stmt));
                                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                        return false;
                                }


                                /* Supply the next piece of data */
                                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));
                                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                        return false;
                                }


                                //###########################//
                                //##                      ##//
                                //##  ACA ESTA EL ERROR  ##//
                                //##                      ##//
                                //###########################//
                                /* Now, execute the query */
                                if (mysql_stmt_execute(stmt))
                                {
                                        lcl_MySQL_Error = "No se pudo ejecutar la consulta : " + AnsiString(mysql_stmt_error(stmt));
                                        RegError = "** " + lcl_MySQL_Error + " // " + AnsiString(__FILE__) + " // " + AnsiString(__FUNC__) + " Ln: " + IntToStr(__LINE__) + "\n";
                                        return false;
                                }
                                ultimoID = mysql_insert_id(mysql);
                                mysql_stmt_close(stmt);
                        }
                }
                return true;
        }
}




Casimiro Notevi 31-05-2012 22:03:01

No conozco bien mysql, pero cuando hablas de insertar en una BD local o remota, se supone que son distintas bases de datos, no?
Supongo que tendrás alguna configuración para elegir la base de datos o algo así?

LucasBols 31-05-2012 22:12:14

No, la estructura de la base de datos local es identica a la remota, ambos motores son MySQL
Una en 127.0.0.1:3306 y la otra en 192.168.1.100:3306
Ambas con la misma configuración (my.ini copiado a Linux, la remota)
Tengo una tecer base de datos remota idéntica a las anteriores en Win 2008, genera el mismo error.

Cuando desarrolle esta aplicación, lo hice con el motor local, las pruebas las comencé en la local, y ahora la pase a la remota.

Casimiro Notevi 31-05-2012 22:24:10

Cita:

Empezado por LucasBols (Mensaje 434013)
Cuando desarrolle esta aplicación, lo hice con el motor local, las pruebas las comencé en la local, y ahora la pase a la remota.

A ver si las bases de datos son distintas, se ha quedado olvidado algo por ahí :)

LucasBols 04-06-2012 14:30:54

No creo,

La migración de la base de datos local a la remota lo hice con un dump y un restore

esta es la tabla (verificado, en las dos bd está igual):

Código SQL [-]
CREATE TABLE IF NOT EXISTS `imagen` (
  `idx_imagen` bigint(20) NOT NULL AUTO_INCREMENT,
  `idx_documento` bigint(20) NOT NULL,
  `imagen` longblob NOT NULL,
  `identificador` text NOT NULL,
  `nombre` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`idx_imagen`,`idx_documento`),
  UNIQUE KEY `idx_imagen_UNIQUE` (`idx_imagen`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Esta es la consulta de inseción:

Código SQL [-]
Insert Into imagen (idx_documento, imagen, identificador, nombre) Values (0, ?, "idarch_xxx", "imagen_XXX.jpg");

Gracioas por tu respuesta,

Saludos,

ecfisa 04-06-2012 14:37:27

Hola LucasBols.

Por favor cuando incluyas código en tus mensaje utiliza TAG's para darle más legibilidad. Esta imágen explica el uso:



Saludos y gracias por tu colaboración. :)

AzidRain 04-06-2012 18:23:50

No mencionas si en todos los casos la versión del motor es la misma, ya que aunque las estructuras sean idénticas las dll no son iguales en todas las versiones. Es decir, en todas funcionará si usas una dll "nueva" en versiones anteriores (a menos que descontinúen alguna función) pero no a la inversa.

LucasBols 04-06-2012 18:40:19

Hola,

Los motores son:
Linux 5.1.49
Windows 7 x86_64 5.5.8 (XAMPP)
Windows 2008 5.5.25

La libmysql.lib la generé con implib desde la dll

Las librerías con las que estoy probando van desde la 4.x.x hasta la 6.0.2

Estoy completamente desorientado, a tal punto que estoy probando de mandar las imagenes con una consulta estandard y la imagen en hexa

Gracias por la respuesta,
Saludos.

LucasBols 04-06-2012 19:42:35

Noto que el mensaje de error comienza con mysqld y la función es mysql_stmt_execute

Cita:

Argumentos errados para mysqld_stmt_execute


La franja horaria es GMT +2. Ahora son las 20:48:58.

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