Discussion:
Cómo pasar argumentos a una función
(demasiado antiguo para responder)
Dani
2003-11-25 21:06:21 UTC
Permalink
Muy buenas,

Tengo el siguiente problema:

Se trata de la siguiente función de la biblioteca libpq , de acceso a la
base de datos Postgresql:

PGresult *PQexec(PGconn *conn, const char *query);

Intento pasarle los argumentos siguientes (siendo 'nombre' y 'dni'
strings leídos del teclado):

res = PQexec(conn, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);

Pero al intentar compilar, obtengo el error de exceso de argumentos.

¿Alguien podría echarme una mano?. Está claro que soy novato en C.

Gracias.
César
2003-11-25 22:53:57 UTC
Permalink
No conozco la función, pero require 2 argumentos y tú le estás pasando
4. Lo primero que has de hacer es la sentencia SQL con sprintf. Algo así:

char sentencia [TAM_MAXIMO];
sprintf (sentencia, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);

y luego llamar a la función que comentas:
res = PQexec(conn, sentencia);

La verdad es que esa setencia SQL me parece muy extraña, pero ese es un tema
aparte.

Un saludo, César.
Post by Dani
Muy buenas,
Se trata de la siguiente función de la biblioteca libpq , de acceso a la
PGresult *PQexec(PGconn *conn, const char *query);
Intento pasarle los argumentos siguientes (siendo 'nombre' y 'dni'
res = PQexec(conn, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);
Pero al intentar compilar, obtengo el error de exceso de argumentos.
¿Alguien podría echarme una mano?. Está claro que soy novato en C.
Gracias.
Gamusino
2003-11-27 04:17:02 UTC
Permalink
Post by Dani
Muy buenas,
Se trata de la siguiente función de la biblioteca libpq , de acceso a la
PGresult *PQexec(PGconn *conn, const char *query);
Intento pasarle los argumentos siguientes (siendo 'nombre' y 'dni'
res = PQexec(conn, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);
Pero al intentar compilar, obtengo el error de exceso de argumentos.
¿Alguien podría echarme una mano?. Está claro que soy novato en C.
Gracias.
A ver si acierto que yo tampoco conozco la función pero creo que puede
ser...
Le tienes que pasar solo los dos primeros argumentos, y me imagino que
nombre y dni tienen que ir dentro de la sentencia SQL, que está mal
declarada.
Lo mejor es que saque la sentencia SQL fuera de la llamada a la función.
Mételo en un cadena para poder concatenar facilmente y sin dolores de cabeza
los valores de dni y de nombre.
Mas o menos puede que quede así:

string sentencia="SELECT * FROM cliente WHERE dato1 LIKE '" +nombre+"' AND
dato2=" +dni

Ten cuidado con los espacios en blanco, aparte que no estoy seguro si
necesitas o no las comillas simples de nombre.
Ten en cuenta que detrás de SELECT van los campos de la tabla que quieres
selccionar, * es todos.

Espero que sea esto....
Fernando Arbeiza
2003-11-27 09:23:57 UTC
Permalink
Post by Gamusino
string sentencia="SELECT * FROM cliente WHERE dato1 LIKE '" +nombre+"' AND
dato2=" +dni
Siento decirlo, pero eso no es C. El tipo de dato string no existe (a no
ser que se haya declarado con typedef), y el operador binario + sólo
puede aplicarse entre tipos aritméticos o un puntero y un tipo entero.
No está definido para un literal cadena y una variable.

Como mucho, lo que se puede conseguir es esto:

#define NOMBRE "pepe"
#define DNI "123456789C"

char *sentencia="SELECT * FROM cliente WHERE dato1 LIKE '" NOMBRE
"' AND dato2=" DNI;

Pero no es muy dinámico, que digamos.

Para todo lo demás hay que utilizar las funciones de stdio.h y string.h:

sprintf, snprintf, strcat, strncat

como ya se ha indicado.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
znôrt
2003-11-27 10:03:02 UTC
Permalink
On Thu, 27 Nov 2003 10:23:57 +0100, Fernando Arbeiza
Post by Fernando Arbeiza
Post by Gamusino
string sentencia="SELECT * FROM cliente WHERE dato1 LIKE '" +nombre+"' AND
dato2=" +dni
Siento decirlo, pero eso no es C
Por supuesto. Pero es que el poster original, que intenta usar una
librería C de acceso a base de datos, tenía serias lagunas ya con el
propio concepto de SQL, no digamos la sintaxis. Todo el hilo en sí es
OT, a pesar de ello hay quien intenta, en lo posible, aclararle al
chico algunos conceptos. :-)

Es complicado cuando un aprendiz se mete en este tipo de cosas,
mezclando varias tecnologías sin conocer ninguna de ellas, porque no
sabes por dónde empezar a explicarle. Pues eso, a trocitos :-)

Sumando tu respuesta y la de Gamusino, ya tiene algo. Yo añadiría que,
para empezar, se leyera un par de manuales.

saludos
znôrt
Dani
2003-11-28 17:23:30 UTC
Permalink
Post by znôrt
Post by Fernando Arbeiza
Siento decirlo, pero eso no es C
Por supuesto. Pero es que el poster original, que intenta usar una
librería C de acceso a base de datos, tenía serias lagunas ya con el
propio concepto de SQL, no digamos la sintaxis. Todo el hilo en sí es
OT, a pesar de ello hay quien intenta, en lo posible, aclararle al
chico algunos conceptos. :-)
Vamos a ver, znôrt, soy el "poster original". Voy a cometer el error
de contestar a tu mensaje, pero creo que me asiste el derecho de
réplica, puesto que me siento aludido.

Si repasas tranquilamente todo el hilo, podrías ver que el único
mensaje OT que hay es el tuyo, que lo único que aporta es falta de
educación y respeto.

Que yo tenga "serias lagunas" con el concepto de SQL, por el simple
hecho de haberme equivocado a la hora de redactar el mensaje, es un
comentario que no dice mucho a favor de su autor.

Como muestra te recomiendo que repases el primer mensaje de
respuesta, enviado por César. Mejor te lo cito aquí:

"...La verdad es que esa setencia SQL me parece muy extraña, pero ese
es un tema aparte.

Un saludo, César."

Te lo cito para que aprendas cuál es, a mi modo de ver, una forma
inteligente y respetuosa de hacer un comentario. Otros ejemplos los
tienes en los mensajes de Fernando y Gamusino.

Además de ayudarme a resolver el problema no entran a hacer juicios
de valor como el tuyo. Se limitan a echar una mano.
Post by znôrt
Es complicado cuando un aprendiz se mete en este tipo de cosas,
mezclando varias tecnologías sin conocer ninguna de ellas, porque no
sabes por dónde empezar a explicarle. Pues eso, a trocitos :-)
En primer lugar, con estas maneras, no creo que tú tengas mucho que
explicarme.

En segundo lugar, si he introducido en mi mensaje una sentencia SQL ha
sido como un mero ejemplo. Podría haber usado una función definida en
cualquier otra librería, pero deberías entender que en ningún momento he
hecho consulta alguna sobre SQL. Repasa el asunto de mi mensaje y quizás
lo comprendas. ¿O es que tengo que explicártelo a "trocitos"?.
Post by znôrt
Sumando tu respuesta y la de Gamusino, ya tiene algo. Yo añadiría que,
para empezar, se leyera un par de manuales.
Por supuesto que ya tengo algo y no gracias a mensajes como el tuyo.
Supongo que tú serás una eminencia en C para expresarte así.

Que yo tenga que leer un par de manuales, está claro. Seguramente más de
dos. De hecho, ya exponía en mi mensaje que era novato en C. Lo que tú
no has hecho es preguntarme el tiempo que he empleado en intentar
resolver el problema (supongo que para ti ridículo) antes de exponerlo
en este grupo.

Así que para terminar, yo también me permitiré darte a ti un consejo:
que seas más humilde y que te leas algún 'manual de la buena edución'.

Ahora tienes dos opciones. La primera, continuar con este hilo que ahora
sí que es "OT". O la segunda, que tú te quedes con tu comentario y yo
con el mío. Yo desde luego, voy a optar por la segunda.

Hasta la próxima.
Post by znôrt
saludos
znôrt
znôrt
2003-11-28 22:49:49 UTC
Permalink
Post by Dani
Vamos a ver, znôrt, soy el "poster original". Voy a cometer el error
de contestar a tu mensaje, pero creo que me asiste el derecho de
réplica, puesto que me siento aludido.
Oyes, Dani. Revisa tu pregunta. Estás preguntando cómo se puede llamar
una función de 2 parámteros con 4? Y eso lo aderezas con una profusa
explicación de lo que quieres conseguir y algo de SQL sin pies ni
cabeza. Pero en realidad, estás preguntando cómo se invoca una
función.

Me extrañaría que alguien que está intentando hacer eso, y no sepa
llamar una función ni escribir una sentencia SQL sepa lo que está
haciendo, mucho menos preguntando.

Cuánto tiempo dices que habías dedicado a resolver el problema?

Eso es lo que hay :-) Ahora, si quieres, dime que no te gusta mi tono
sarcástico. Bueno, seguramente a mi tampoco me gustaría. Pero es lo
que hay, cada uno tiene sus días. Tampoco tenías porqué ofenderte.

saludos
znôrt

Dani
2003-11-27 08:37:15 UTC
Permalink
Post by Gamusino
Post by Dani
PGresult *PQexec(PGconn *conn, const char *query);
Intento pasarle los argumentos siguientes (siendo 'nombre' y 'dni'
res = PQexec(conn, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);
Le tienes que pasar solo los dos primeros argumentos, y me imagino que
nombre y dni tienen que ir dentro de la sentencia SQL, que está mal
declarada.
Lo mejor es que saque la sentencia SQL fuera de la llamada a la función.
Mételo en un cadena para poder concatenar facilmente y sin dolores de cabeza
Muchas gracias, la cosa finalmente queda así:

************
PGresult *res;
char sentencia[150];

sprintf(sentencia,"INSERT INTO cliente VALUES('%s','%s')",nombre,dni);

res = PQexec(conn,sentencia);
*************

En cuanto a la sentencia SQL: un error al teclear en el mensaje
original.

Saludos y gracias.
Post by Gamusino
los valores de dni y de nombre.
string sentencia="SELECT * FROM cliente WHERE dato1 LIKE '" +nombre+"' AND
dato2=" +dni
Espero que sea esto....
Fernando Arbeiza
2003-11-27 22:19:24 UTC
Permalink
Post by Dani
PGresult *res;
char sentencia[150];
sprintf(sentencia,"INSERT INTO cliente VALUES('%s','%s')",nombre,dni);
res = PQexec(conn,sentencia);
Sólo una cosita, te recuerdo que debes asegurarte de que sentencia no
tenga más de 149 caracteres. C no comprueba si excedes los límites de
las áreas de memoria.

Bastantes implementaciones de C tienen la función snprintf. La única
diferencia con sprintf es que se puede especificar el número máximo de
caracteres a escribir en sentencia.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Dani
2003-11-27 08:25:12 UTC
Permalink
Post by César
No conozco la función, pero require 2 argumentos y tú le estás pasando
char sentencia [TAM_MAXIMO];
sprintf (sentencia, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);
res = PQexec(conn, sentencia);
La verdad es que esa setencia SQL me parece muy extraña, pero ese es un tema
Muchas gracias César, la solución que me has dado funciona
perfectamente.

La cosa quedaría así:

char sentencia[150];
sprintf(sentencia,"INSERT INTO cliente VALUES('%s','%s')",nombre,dni);

pero al redactar el mensaje me centré en el problema de los argumentos a
la función y descuidé la redacción de la sentencia SQL, que era un
simple ejemplo. El problema realmente lo tenía con los argumentos.

Saludos.
Post by César
Post by Dani
Se trata de la siguiente función de la biblioteca libpq , de acceso a la
PGresult *PQexec(PGconn *conn, const char *query);
Intento pasarle los argumentos siguientes (siendo 'nombre' y 'dni'
res = PQexec(conn, "SELECT FROM cliente VALUES(%s,%s)",nombre,dni);
Loading...