insertar valor de la variable en mysql desde una aplicacion en c

Iniciado por txenfsm, 22 Enero 2012, 12:12 PM

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

txenfsm

Hola amigos, estoy relizando una aplicacion en c que debe insertar valores de una variable en c, lo que realizo para ello es :
sprintf(consulta, "INSERT INTO mitabla (campo1,campo2,campo3) VALUES('%s','%s','%s')",vble_cadena1, vble_caracter2, vble_enterolargo3);
mysql_query(conn,consulta);

bien pues al relizar estas lineas me da error y no se si es porque las variables no son del mismo tipo que lo son en la base de datos. ¿tiene algo que ver?
Lo pregunto porque si en vez esas linea pongo:

sprintf(consulta, "INSERT INTO mitabla (campo1,campo2,campo3) VALUES('hola1','hola2','hola3')");
mysql_query(conn,consulta);

si que funciona.
Espero que me podais ayudar porque no se donde tengo el fallo. gracias de antemano.
Saludos

fabianjsm

Hola txenfsm.

Si los tipos de variable son los que el nombre sugiere deberías cambiar tus especificadores de formato.
En vez de VALUES('%s','%s','%s') debería ser VALUES('%s','%c','%d'), así sprintf se leerá una cadena, un carácter y un entero:



sprintf(consulta, "INSERT INTO mitabla (campo1,campo2,campo3) VALUES('%s','%c','%d')",vble_cadena1, vble_caracter2, vble_enterolargo3);

txenfsm

Hola fabianjsm , gracias por contestar.
si bueno eso fue una errata xD.
A lo que me refiero es que por ejemplo yo, la base de datos con la que trabajo tiene un campo fecha de tipo date, y en la aplicacion existe una variable fecha de tipo char, entonces al poner:
sprintf(consulta, "INSERT INTO mitabla (nombre,dni,fecha) VALUES('%s','%s','%s')",nomb, id, fecha);
y ejecutar la aplicacion me salta un error, por lo que no se si la sentenca esta bien?
De nuevo gracias de antemano. Un saludo

fabianjsm

Hola txenfsm, estuve ausente del foro por unos cuantos meses!
A esta altura espero que hayas solucionado tu problema, de no ser así, la expresión como la escribes sólo funcionara si las tres variables (nomb, id y fecha) son del tipo "const char *". Si fecha es del tipo "char" y la demás variables son "const char *" debería ser así:

sprintf(consulta, "INSERT INTO mitabla (nombre,dni,fecha) VALUES('%s','%s','%c')",nomb, id, fecha);

Fire544

#4
Hola txenfsm. Mira he posteado tu solucion en un post ya hace algunas semanas, no es recomendable formatear una entrada en sprintf() con %c si fecha es tipo date en MySQL, tendrias que utilizar %s, porque C puede manejar automaticamente los tipos date de MySQL como strings o cadenas, lo que no puede hacer es manejar datos muy largos de MySQL con %c es algo logicamente absurdo.

Tu error puede ser por el paso incorrectos de argumentos a sprintf(), mira fijate:

Puedes hacer lo siguiente mira:

char fecha[10];

sprintf(consulta, "INSERT INTO nametable VALUES(%s)", fecha);


trata de fijarte en el post que publique mira:

http://foro.elhacker.net/programacion_cc/base_de_datos_con_mysql_desde_c_excelente-t366557.0.html

Suerte !!  :laugh:
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

fabianjsm

Estimado, lo escribo con ánimo de disipar la confusion.

No comprendo a que se refiere con manejar datos muy largos de MySQL con %c. El especificador de formato "%c" indica que el parámetro debe ser tratado como char, y la biblia del C (K&R 2.2, tipos y tamaños de datos) dice que el char tiene el tamaño de byte, por ende eso es lo máximo que podrás menejar con %c, o ¿Puedes citar alguna arquitectura para la cual se implementó un compilador C con tipos de datos char de más de 8 bits?

Por otra parte, C no puede manejar automaticamente los tipos datos DATE de MySQL. C trabaja con tipos de datos básicos. Demás esta esta aclaración, pero puede ser utilidad: En Unix y demás sistemas POSIX (probablemente en muchos otros sitemas no POSIX), time_t (tiene el mismo nombre en la libreria estándar del C) es un entero que representa la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970 sin contar los segundos itercalares (http://es.wikipedia.org/wiki/Segundo_intercalar). Por ejemplo, el viernes 13 de febrero de 2009, exactamente a las 23:31:30 (UTC), el tiempo Unix se igualó a '1234567890' (Google celebró este momento con el doodle: "date +%s"). El formato de fecha y hora de MySQL es una cadena que sigue cualquiera de estos esquemas: YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, o YYMMDD. Puedes utilizar las funciones UNIX_TIMESTAMP() y FROM_UNIXTIME() para convertir entre valores TIMESTAMP de MySQL y los de Unix.

Utilizando tu ejemplo:

char fecha[20];
time_t now = time(NULL);
strftime(fecha, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
sprintf(consulta, "INSERT INTO nametable VALUES(%s)", fecha);

Fire544

#6
Cita de: fabianjsm en 26 Agosto 2012, 23:16 PM
Estimado, lo escribo con ánimo de disipar la confusion.

No comprendo a que se refiere con manejar datos muy largos de MySQL con %c. El especificador de formato "%c" indica que el parámetro debe ser tratado como char, y la biblia del C (K&R 2.2, tipos y tamaños de datos) dice que el char tiene el tamaño de byte, por ende eso es lo máximo que podrás menejar con %c, o ¿Puedes citar alguna arquitectura para la cual se implementó un compilador C con tipos de datos char de más de 8 bits?

Por otra parte, C no puede manejar automaticamente los tipos datos DATE de MySQL. C trabaja con tipos de datos básicos. Demás esta esta aclaración, pero puede ser utilidad: En Unix y demás sistemas POSIX (probablemente en muchos otros sitemas no POSIX), time_t (tiene el mismo nombre en la libreria estándar del C) es un entero que representa la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970 sin contar los segundos itercalares (http://es.wikipedia.org/wiki/Segundo_intercalar). Por ejemplo, el viernes 13 de febrero de 2009, exactamente a las 23:31:30 (UTC), el tiempo Unix se igualó a '1234567890' (Google celebró este momento con el doodle: "date +%s"). El formato de fecha y hora de MySQL es una cadena que sigue cualquiera de estos esquemas: YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, o YYMMDD. Puedes utilizar las funciones UNIX_TIMESTAMP() y FROM_UNIXTIME() para convertir entre valores TIMESTAMP de MySQL y los de Unix.

Utilizando tu ejemplo:

char fecha[20];
time_t now = time(NULL);
strftime(fecha, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
sprintf(consulta, "INSERT INTO nametable VALUES(%s)", fecha);

No no mira creo que estas erratico, tienes que poner mas atencion a tu lectura, en ningun momento hable de chars larrgo en un sentido de que soporte mas bytes, solamente que no puedes hacer que un vector de 50 o 20 bytes se pueda concatenar con un char de 8 bytes, que es lo que pasa en el caso de txenfsm. Solo eso quiero dejar claro, sino preguntale a txenfsm que si que le funciono ...
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".