C + MySQL, traspaso de variables a un query de MySQL en C. [Resuelto]

Iniciado por GisiNA, 6 Febrero 2014, 22:46 PM

0 Miembros y 1 Visitante están viendo este tema.

GisiNA

¡Hola a todas las y los genios del lenguaje de Programación en C!

¿Hay alguien que se maneja bien con C + MySQL y ojalá con GTK?

Estoy escribiendo un pequeño programa en C, con interfaz gráfica en GTK que debe insertar datos a una base de datos en MySQL, pero no logro traspasar un valor desde la interfaz gráfica escrita en GTK a un query de MySQL. Creo que ese problema lo podría solucionar resolviendo lo siguiente:

¿Cómo se traspasa en C una variable a un query de MySQL? El código con el que tengo problema es el siguiente:

float nota;
mysql_query(conn, ("INSERT INTO datos (id, alumno_nombre, nota) VALUES(' ', 'alguien', '%g')"), nota);

Definiticamente la forma con la que estoy tratando hacer el traspaso de la variable al query de MySQL está muy mal  :huh:.
En la web no he hallado respuestas satisfactorias.

Espero que alguien pueda orientarme.

Si necesitan el código completo, me avisan. No lo he querido colocar de inmediato para no saturar la página con más información.
[move]¡Saludos y muchísimas gracias a todas y todos los genios en C![/move]


ME HE RESPONDIDO A MI MISMA. ABAJO MI PROPIA SOLUCIÓN.

eferion

Hay que aprender a leer la documentación de las APIs antes de usarlas.

https://dev.mysql.com/doc/refman/5.0/es/mysql-query.html

"mysql_query" ejecuta una sentencia SQL (que se pasa como argumento en formato texto) y te devuelve un identificador que, mediante otras funciones, te permite acceder al resultado de la consulta.

En lo que a ti te concierne, "mysql_query" requiere como argumento una cadena de texto que contiene la consulta a ejecutar. Lo que tienes que hacer es tratar esa cadena de texto para modificar el "%g" por el valor almacenado en "nota". Una opción puede ser utilizar la función "sprintf" y después pasarle el resultado a "mysql_query".

Aunque espero que no haga falta decirlo... en tu código, la variable "nota" no tiene un valor definido.

GisiNA

¡Amigas y amigos!

Me respondo a mi misma. Acabo de encontrar la solución.
Dejo mi solución por si a alguien llegara a servirle.


//Nombre del archivo: "prog.c" (sin comillas).
#include <stdio.h>                                           
#include <mysql.h>                                           
#include <my_global.h>                                       
#include <string.h>                                           
#include <stdlib.h>                                           
                                                             
int main(){                                                   
                                                             
                                                             
//Declaramos las variables necesarias:                       
    MYSQL *conn;        //Variable para la conexion con MySQL.
    float nota;         //Variable que almacenara la nota ingresada.
    char nombre[15];    //Variable que ingresara el nombre del alumno.
    char q[1024];       //String que almacenara la consulta a MySQL.
                                                             
    printf("Ingrese nombre alumno:\n"); //Solicitamos ingreso del nombre del alumno.
    scanf("%s", nombre);                //Se almacena el nombre del alumno en la variable "nombre".
    printf("Ingrese nota alumno:\n");   //Solicitamos el ingreso de la nota del alumno.
    scanf("%f", &nota);                 //Se almacena la nota del alumno en la variable "nota".
                                                                       
//Conectamos con MySQL                                       
    conn = mysql_init(NULL);    //Almacenamos en la variable "conn" el comando de conexion a MySQL.
    mysql_real_connect(conn, "localhost", "admin_notas", "123456", "Notas", 0, NULL, 0); //Ingresamos los datos necesarios (servidor, usuarios, clave de usuario) para acceder a la base de datos que llamamos "Notas".
                                                           
    sprintf(q,"INSERT INTO datos(id, alumno_nombre, nota) VALUES('', '%s', '%f')", nombre, nota);   //Creamos el string de consulta a la base de datos de MySQL.
                                                           
    mysql_query(conn, q); //Establecemos la conexion y enviamos la consulta a MySQL. q tiene almacenada nuestra consulta.
                                                           
    mysql_close(conn);  //Finalizamos la conexion a MySQL.                                     
                                                             
return 0;                                                 
}       


El programa se compila con el siguiente comando en Linux:

gcc prog.c -o prog -Wall `pkg-config --libs --cflags gtk+-3.0` $(mysql_config --cflags) $(mysql_config --libs)

Y se ejecuta (en Linux. No sé cómo será en otros sistemas operativos... ):
./prog

dato000

Hey nada mal, nunca he usado C/C++ con mysql, no parece diferente de java y C# excepto por esta linea:

   mysql_real_connect(conn, "localhost", "admin_notas", "123456", "Notas", 0, NULL, 0); //Ingresamos los datos necesarios (servidor, usuarios, clave de usuario) para acceder a la base de datos que llamamos "Notas".
No entiendo porque los otros valores, vale puede que sean así por defecto en la función sql para C, pero alguien podria explicarmelo en palabras rapidas?? por favor??  :silbar: :silbar:

Ando corto de tiempo con tanto estudio y trabajo, pero avanzare y profundizare en estos temás.



GisiNA

Cita de: dato000 en  8 Febrero 2014, 18:04 PM
Hey nada mal, nunca he usado C/C++ con mysql, no parece diferente de java y C# excepto por esta linea:

  mysql_real_connect(conn, "localhost", "admin_notas", "123456", "Notas", 0, NULL, 0); //Ingresamos los datos necesarios (servidor, usuarios, clave de usuario) para acceder a la base de datos que llamamos "Notas".
No entiendo porque los otros valores, vale puede que sean así por defecto en la función sql para C, pero alguien podria explicarmelo en palabras rapidas?? por favor??  :silbar: :silbar:

Ando corto de tiempo con tanto estudio y trabajo, pero avanzare y profundizare en estos temás.


Mira, quizás sea ésta la respuesta que buscas.
Si no la es espero la respuesta a mi mensaje anterior que te hice llegar.

Código (sql) [Seleccionar]

mysql_real_connect (
 conn,           //puntero al gesto de conexion.
 hostname,      //host al cual conectar (en mi caso, localhost).
 nombre_usuario, //la tercera posicion es para el nombre del usuario que ingresa a la base de datos.
 password,     //la cuarta posicion es para especificar la clave con la cual el usuario ingresa a la base de datos.
 nombre_BD,   //lugar para especificar el nombre de la base de datos a utilizar por el usuario.
 0,         //puerto utilizado, si cero (0) entonces se usa puerto por defecto.
 NULL,        //para definir el socket, si NULL, entonces se utiliza el por defecto.
 0       // el flags, si cero (o) entonces ninguno se utiliza.
);



dato000

Perfecto muchas gracias, pero en la parte del flag, que diferencia habria para el acceso al motor de base de datos???



GisiNA

Cita de: dato000 en  8 Febrero 2014, 21:03 PM
Perfecto muchas gracias, pero en la parte del flag, que diferencia habria para el acceso al motor de base de datos???

¡Hola!

Casi siempre se usa como valor 0. Pero hay casos muy especiales en que se le puede otorgar a flags otro valor.

Yo lamentablemente no tengo experiencia en eso, así que tampoco puedo hablarte con grandes nociones al respecto.

Ahora bien, los flags permiten otorgar a la consulta un parámetro adicional que permite especificar formas especiales de respuestas, o sea, que permiten personalizar la respuesta que uno obtendrá.

Por ejemplo, lo que acabo de leer en la web de mysql, en vez de obtener el total de filas afectadas, se puede especificar que otorgue como resultado el valor total de filas que coinciden con la consulta. Son varios los  parámetros para personalizar la consulta que pueden agregarse.

Acá te dejo la página de MySQL que explica los flags (ahora bien, en inglés).
https://dev.mysql.com/doc/refman/5.0/es/mysql-real-connect.html

¡Saludos!

dato000

Ummm interesante, buena info!!

Flag Name                              Flag Description

CLIENT_COMPRESS                   Use compression protocol.
CLIENT_FOUND_ROWS               Return the number of found (matched) rows, not the number of affected rows.
CLIENT_IGNORE_SPACE             Allow spaces after function names. Makes all functions names reserved words.
CLIENT_INTERACTIVE              Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. The client's session wait_timeout variable is set to the value of the session interactive_timeout variable.

CLIENT_LOCAL_FILES              Enable LOAD DATA LOCAL handling.
CLIENT_MULTI_STATEMENTS    Tell the server that the client may send multiple statements in a single string (separated by ';'). If this flag is not set, multiple-statement execution is disabled. New in 4.1.

CLIENT_MULTI_RESULTS            Tell the server that the client can handle multiple result sets from multiple-statement executions or stored procedures. This is automatically set if CLIENT_MULTI_STATEMENTS is set. New in 4.1.

CLIENT_NO_SCHEMA            Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs.

CLIENT_ODBC                       The client is an ODBC client. This changes mysqld to be more ODBC-friendly.
CLIENT_SSL                       Use SSL (encrypted protocol). This option should not be set by application programs; it is set internally in the client library.


Justamente estaba pensando en casos en los que se use cifrado o encriptamiento (CLIENT_SSL) o con un driver diferente de conexión (CLIENT_ODBC), también me parecio muy interesante lo de la duración de la sesión del usuario en un caso de inactividad, muy util (CLIENT_INTERACTIVE).

Gracias por el link  ;-) ;-)



GisiNA

Cita de: dato000 en  9 Febrero 2014, 00:49 AM
Ummm interesante, buena info!!

Flag Name                              Flag Description

CLIENT_COMPRESS                   Use compression protocol.
CLIENT_FOUND_ROWS               Return the number of found (matched) rows, not the number of affected rows.
CLIENT_IGNORE_SPACE             Allow spaces after function names. Makes all functions names reserved words.
CLIENT_INTERACTIVE              Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. The client's session wait_timeout variable is set to the value of the session interactive_timeout variable.

CLIENT_LOCAL_FILES              Enable LOAD DATA LOCAL handling.
CLIENT_MULTI_STATEMENTS    Tell the server that the client may send multiple statements in a single string (separated by ';'). If this flag is not set, multiple-statement execution is disabled. New in 4.1.

CLIENT_MULTI_RESULTS            Tell the server that the client can handle multiple result sets from multiple-statement executions or stored procedures. This is automatically set if CLIENT_MULTI_STATEMENTS is set. New in 4.1.

CLIENT_NO_SCHEMA            Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs.

CLIENT_ODBC                       The client is an ODBC client. This changes mysqld to be more ODBC-friendly.
CLIENT_SSL                       Use SSL (encrypted protocol). This option should not be set by application programs; it is set internally in the client library.


Justamente estaba pensando en casos en los que se use cifrado o encriptamiento (CLIENT_SSL) o con un driver diferente de conexión (CLIENT_ODBC), también me parecio muy interesante lo de la duración de la sesión del usuario en un caso de inactividad, muy util (CLIENT_INTERACTIVE).

Gracias por el link  ;-) ;-)

Me alegro que haya servido. :)