Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GisiNA en 6 Abril 2014, 21:31 pm



Título: ¿Consulta sobre C + MySQL, traspaso del resultado de una consulta MySQL a C?
Publicado por: GisiNA en 6 Abril 2014, 21:31 pm
¡Hola todas y todos!

En el siguiente programa realizo dos consultas MySQL desde C. Como podrán apreciar hago una de ellas muy mal.. A saberl, la primera.

Me gustaría saber de qué modo lograr que la primera consulta sea pasada a la segunda pero no como sentencia misma, sino el resultado de mi consulta. La primera pretende estimar mis horas trabajadas en un determinado mes para devolver un valor numérico de tipo float. Pero en vez de devolver un valor numérico, traspasa toda la gigante e inacabable sentencia.

Obtengo el error:

Código
  1. You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'xxxx', '', 'xxxxxxxx', 'xxx', 'xxx')' at line n

La impresión en pantalla de
Código
  1. printf("Suma horas: %s", sum_horas_mensual);
(sentencia que tengo incluida en mi programa...) resulta ser:

Código
  1. Suma horas: SET @shm := (SELECT SUM(hras_trab) FROM Horas_trabajadas Total WHERE mes='Februar';)

Vale decir, mi error consiste en que no toma el resultado de la suma que debería arrojar SUM (por ejemplo 63) sino el query MySQL completo en toda su gloria y majestad... pero que no me sirve en absoluto.

¿Qué estoy haciendo mal? :huh: :huh: :huh:

Acá el código completo (sin acentos en los comentarios porque aparecen garabatos y alguien puede llegar a sentirse ofendido... sin mi más mínima intensión):

Código
  1. #include "finish_with_error.h"
  2.  
  3. #define n (10) // n = 3. Three decimal points.
  4.  
  5. //Valores que vienen traspasados de otra funcion.                                        
  6. void conectar(char array_fecha_fact[11], char array_fase_trabajada[257], char array_hrs_totales[4], float float_std_lohn, int int_id_empresas){
  7.  
  8.    MYSQL   *conn;            
  9.    char    q[1024],          
  10.            sum_horas_mensual[4];
  11.  
  12.    conn = mysql_init(NULL);  
  13.    mysql_real_connect(conn, "localhost", "fact", "mi_clave_supersecreta_y_supersegura", "facturas", 0, NULL, 0);
  14.  
  15.  //Aca la consulta a MySQL de la que quiero capturar el resultado y en la que hago algo mal.            
  16.    sprintf(sum_horas_mensual, "SET @shm := (SELECT SUM(hras_trab) FROM Horas_trabajadas Total WHERE mes='Februar';)\n");
  17.    printf("Suma horas: %s", sum_horas_mensual);
  18.  
  19.    sprintf(q,"INSERT INTO Facturas(id_fact, fecha, cant_horas, horario, hora_salario, id_empresas) VALUES('', '%s', '%s', 'algo_muy_importante_dice_aca', '%g', '%i')\n", array_fecha_fact, sum_horas_mensual, float_a, int_id_empresas);                              
  20.    mysql_query(conn, q);    
  21.    finish_with_error(conn);    
  22.    mysql_close(conn);        
  23. }  

Bueno, espero que puedan ayudarme...!

Saludos a todas y todos y muy agradecida por sus respuestas.

Gisi

 \m/


Título: Re: ¿Consulta sobre C + MySQL, traspaso del resultado de una consulta MySQL a C?
Publicado por: eferion en 6 Abril 2014, 23:59 pm
tienes que enviar la consulta SQL a la base de datos... con mysql_query.

Después tienes que llamar a mysql_store_result( ) para que te devuelva el resultado de la query. Para moverte por los diferentes resultados, tienes que usar mysql_fetch_row( ).

En la web de mysql tienes toda la documentación al respecto sobre estas funciones.

Código
  1. if ( mysql_query(con, "SELECT ...") )
  2.  error( );
  3.  
  4. MYSQL_RES *result = mysql_store_result(con);
  5.  
  6. if (result == NULL)
  7.  error( );
  8.  
  9. int num_fields = mysql_num_fields(result);
  10.  
  11. MYSQL_ROW row;
  12.  
  13. while ((row = mysql_fetch_row(result)))
  14. {
  15.  campo0 ? row[ 0 ];
  16.  campo1 = row[ 1 ];
  17.  ...
  18. }


Título: Re: ¿Consulta sobre C + MySQL, traspaso del resultado de una consulta MySQL a C?
Publicado por: GisiNA en 8 Abril 2014, 16:00 pm
Oh! Gracias por la orientación. Le daré un intento. Si logro el resultado buscado colocaré acá la solución completa, para quién pueda servirle!
Saludos!



¡Hola amigas y amigos!

Lamentablemente no he podido avanzar en mi problema. Soy novata en C API y por mucho que he buscado en internet, no logro llegar a la solución. La respuesta que se me entregó acá fue demasiado genérica que sinceramente agradezco mucho pero que lamentablemente no me sirvió los suficiente.

A lo q

Código
  1.  
  2.  



¡Hola amigas y amigos!

Estoy haciendo un ejercicio personal, con el fin de ensayar C API (C+MySQL y GTK).

Lamentablemente no he podido avanzar en mi problema. Soy novata en C API y por mucho que haya buscado en internet (también en la página oficial de MySQL), no logro llegar a la solución. La respuesta que se me entregó acá que sinceramente agradezco mucho fue lamentablemente muy genérica y no me sirvió lo suficiente.

A lo que he llegado es lo siguiente.

Código
  1. //Archivo que incluyo para establecer si hubo error al establecer conexión con la base de datos.
  2. #include "finish_with_error.h"
  3.  
  4. //Valores que vienen traspasados desde otra funcion.                                        
  5. void conectar(char array_fecha_fact[11], char array_fase_trabajada[257], char array_hrs_totales[4], float float_std_lohn, int int_id_empresas){
  6.  
  7. //Declaracion de variables que usare
  8. MYSQL   *conn;            
  9. char    q[1024],          
  10. sum_horas_mensual[4];
  11.  
  12. //Se establece la conexion con la Base de Datos
  13. conn = mysql_init(NULL);  
  14. mysql_real_connect(conn, "localhost", "fact", "mi_clave_supersecreta_y_supersegura", "facturas", 0, NULL, 0);
  15.  
  16. //Aca intento realizar la consulta a la Base de Datos, de la que quiero capturar el resultado            
  17. cant_horas_resultado = mysql_query(conn, "SELECT SUM(hras_trab) FROM Horas_trabajad as WHERE mes='Februar'");
  18. MYSQL_RES *result = mysql_store_result(cant_horas_resultado);
  19.  
  20. //Aca intento traspasar el valor (un valor entero o decimal) a la Base de Datos por medio de la siguiente secuencia:
  21. sprintf(q,"INSERT INTO Facturas(id_fact, fecha, cant_horas, horario, hora_salario, id_empresas) VALUES('', '%s', '%s', 'algo_muy_importante_dice_aca', '%g', '%i')\n", array_fecha_fact, sum_horas_mensual, float_a, int_id_empresas);                              
  22.  
  23.       mysql_query(conn, q);    
  24.       finish_with_error(conn);    
  25.  
  26.  
  27.       mysql_close(conn);        
  28.    }

No sé si realizo mal la consulta para obtener el valor, o si lo que hago mal es el traspaso del valor a la base de datos o si ambos.

Espero que algún genio puedo orientarme.
Saludos a todos,
Gisi