Error de sintaxis en una consulta

02/12/2005 - 22:41 por Ivan Saucedo | Informe spam
Saludos grupo:

-Estoy tratando de recuperar un campo de un registro mediante una consulta
SQL pero tengo problemas porque me manda un error de sintaxis y no se
porque, le pongo la linea en cuestion:

DbCommand.CommandText = "SELECT idHistoria FROM Historial WHERE id = " + id
+ " AND Fecha = #" + tmpFecha + "#";

-Cuando ejecuto esta consulta utilizo OleDbException para mostrar el mensaje
de error y es el siguiente:

Error de sintaxis en la fecha en la expresion de consulta 'id = 28 AND Fecha
= #Dic-02-2005#'

- Y sucede en la linea que les pongo a continuacion

LeeIdHistoria = DbCommand.ExecuteReader();

- LeeIdHistoria es un OleDbDataReader
- La conexion a la base de datos esta abierta
- La base de datos esta en Access
- El campo es Date/Time (Fecha corta)
- El formato de fecha que utilizo es MMM-dd-aaaa (en mi sistema operativo)
- DCommand es un OleDbCommand

* Acaso no se pueden comparar dos tipos de datos distintos en la clausula
WHERE??

Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Ivan Saucedo
03/12/2005 - 02:12 | Informe spam
Saludos grupo:

Un comentario a lo anterior:

Si el mes de la Fecha que estoy comparando es anterior al mes actual, la
consulta se ejecuta con exito... esto me tiene intrigado porque no puedo
realizar la consulta con la fecha actual.

Hasta luego


"Ivan Saucedo" escribió en el mensaje
news:
Saludos grupo:

-Estoy tratando de recuperar un campo de un registro mediante una consulta
SQL pero tengo problemas porque me manda un error de sintaxis y no se
porque, le pongo la linea en cuestion:

DbCommand.CommandText = "SELECT idHistoria FROM Historial WHERE id = " +
id + " AND Fecha = #" + tmpFecha + "#";

-Cuando ejecuto esta consulta utilizo OleDbException para mostrar el
mensaje de error y es el siguiente:

Error de sintaxis en la fecha en la expresion de consulta 'id = 28 AND
Fecha = #Dic-02-2005#'

- Y sucede en la linea que les pongo a continuacion

LeeIdHistoria = DbCommand.ExecuteReader();

- LeeIdHistoria es un OleDbDataReader
- La conexion a la base de datos esta abierta
- La base de datos esta en Access
- El campo es Date/Time (Fecha corta)
- El formato de fecha que utilizo es MMM-dd-aaaa (en mi sistema operativo)
- DCommand es un OleDbCommand

* Acaso no se pueden comparar dos tipos de datos distintos en la clausula
WHERE??

Gracias de antemano

Respuesta Responder a este mensaje
#2 A.Poblacion
03/12/2005 - 09:24 | Informe spam
"Ivan Saucedo" wrote in message
news:
-Estoy tratando de recuperar un campo de un registro mediante una consulta
SQL pero tengo problemas porque me manda un error de sintaxis y no se
porque, le pongo la linea en cuestion:

DbCommand.CommandText = "SELECT idHistoria FROM Historial WHERE id = " +


id
+ " AND Fecha = #" + tmpFecha + "#";

-Cuando ejecuto esta consulta utilizo OleDbException para mostrar el


mensaje
de error y es el siguiente:

Error de sintaxis en la fecha en la expresion de consulta 'id = 28 AND


Fecha
= #Dic-02-2005#'

- Y sucede en la linea que les pongo a continuacion

LeeIdHistoria = DbCommand.ExecuteReader();

- LeeIdHistoria es un OleDbDataReader
- La conexion a la base de datos esta abierta
- La base de datos esta en Access
- El campo es Date/Time (Fecha corta)
- El formato de fecha que utilizo es MMM-dd-aaaa (en mi sistema operativo)
- DCommand es un OleDbCommand

* Acaso no se pueden comparar dos tipos de datos distintos en la clausula
WHERE??



No hay ningún problema en comparar tipos de datos distintos en el
WHERE. El problema de este tipo de consultas suele estar en el formato de la
fecha. Cuando haces el "+ tmpFecha +", asumiendo que tmpFecha sea de tipo
DateTime, el compilador lo interpreta haciendo un tmpFecha.ToString() para
poderla concatenar, y el ToString usa el formato que esté en ese momento
configurado. Por otra parte, el parser de la consulta Sql que utiliza OleDb
espera las fechas en un formato que sigue criterios distintos, por lo que
dependiendo de la configuración es bastante fácil que no concuerden los dos
formatos.
Para no volverse loco pensando en cómo hay que formatear la fecha para
que el programa funcione siempre bajo todas las circunstancias, lo mejor es
parametrizar la consulta y dejar que el formateo se realice automáticamente
de forma interna:

DbCommand.CommandText "SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?";
DbCommand.Parameters.Add("id", id);
DbCommand.Parameters.Add("fecha", tmpFecha);

LeeIdHistoria = DbCommand.ExecuteReader();
Respuesta Responder a este mensaje
#3 Ivan Saucedo
03/12/2005 - 20:32 | Informe spam
Hola que tal:

Segui tu consejo y utice el codigo que me pusiste:

DbCommand.CommandText "SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?";
DbCommand.Parameters.Add("id", id);
DbCommand.Parameters.Add("fecha", tmpFecha);


pero ahora cuando ejecuto la consulta me dice:

SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?
No coinciden los tipos de datos en la expresión de criterios





"A.Poblacion" escribió en
el mensaje news:ulgnFM%
"Ivan Saucedo" wrote in message
news:
-Estoy tratando de recuperar un campo de un registro mediante una
consulta
SQL pero tengo problemas porque me manda un error de sintaxis y no se
porque, le pongo la linea en cuestion:

DbCommand.CommandText = "SELECT idHistoria FROM Historial WHERE id = " +


id
+ " AND Fecha = #" + tmpFecha + "#";

-Cuando ejecuto esta consulta utilizo OleDbException para mostrar el


mensaje
de error y es el siguiente:

Error de sintaxis en la fecha en la expresion de consulta 'id = 28 AND


Fecha
= #Dic-02-2005#'

- Y sucede en la linea que les pongo a continuacion

LeeIdHistoria = DbCommand.ExecuteReader();

- LeeIdHistoria es un OleDbDataReader
- La conexion a la base de datos esta abierta
- La base de datos esta en Access
- El campo es Date/Time (Fecha corta)
- El formato de fecha que utilizo es MMM-dd-aaaa (en mi sistema
operativo)
- DCommand es un OleDbCommand

* Acaso no se pueden comparar dos tipos de datos distintos en la clausula
WHERE??



No hay ningún problema en comparar tipos de datos distintos en el
WHERE. El problema de este tipo de consultas suele estar en el formato de
la
fecha. Cuando haces el "+ tmpFecha +", asumiendo que tmpFecha sea de tipo
DateTime, el compilador lo interpreta haciendo un tmpFecha.ToString() para
poderla concatenar, y el ToString usa el formato que esté en ese momento
configurado. Por otra parte, el parser de la consulta Sql que utiliza
OleDb
espera las fechas en un formato que sigue criterios distintos, por lo que
dependiendo de la configuración es bastante fácil que no concuerden los
dos
formatos.
Para no volverse loco pensando en cómo hay que formatear la fecha para
que el programa funcione siempre bajo todas las circunstancias, lo mejor
es
parametrizar la consulta y dejar que el formateo se realice
automáticamente
de forma interna:

DbCommand.CommandText > "SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?";
DbCommand.Parameters.Add("id", id);
DbCommand.Parameters.Add("fecha", tmpFecha);

LeeIdHistoria = DbCommand.ExecuteReader();





Respuesta Responder a este mensaje
#4 A.Poblacion
04/12/2005 - 10:18 | Informe spam
"Ivan Saucedo" wrote in message
news:ulUgSBE%
Hola que tal:

Segui tu consejo y utice el codigo que me pusiste:

DbCommand.CommandText > "SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?";
DbCommand.Parameters.Add("id", id);
DbCommand.Parameters.Add("fecha", tmpFecha);


pero ahora cuando ejecuto la consulta me dice:

SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?
No coinciden los tipos de datos en la expresión de criterios



Para que funcione la sintaxis "simple" del Parameters.Add (pasándole
sólo (nombre, valor)), hace falta que el valor sea del mismo tipo que espera
la sentencia SQL. En tu caso, si el "id" de la tabla Historial es de tipo
INT, es necesario que la variable id del Parameters.Add sea de tipo int. Y
si el Fecha de Historial es de tipo DATETIME, es necesario que el tmpFecha
sea de tipo DateTime.

Si quieres, puedes usar la sintaxis más completa, que especifica el tipo
de argumento que pasas en el parámetro:

DbCommand.CommandText "SELECT idHistoria FROM Historial WHERE id=? AND Fecha=?";
OleDbParameter param1 = new OleDbParameter("id", OleDbType.Integer);
param1.Value = id;
DbCommand.Parameters.Add(param1);
OleDbParameter param2 = new OleDbParameter("fecha", OleDbType.Date); //Si
no funciona con .Date, prueba .DBDate
param2.Value = tmpFecha;
DbCommand.Parameters.Add(param2);
Respuesta Responder a este mensaje
#5 Hadi Hariri
04/12/2005 - 21:58 | Informe spam
Además, utilizar parámetros es recomendable para evitar lo que se
conoce por "SQL injections", que es un riesgo de seguridad



Hadi Hariri
¿Eres un desarrollador y te encuentras en Andalucía? Escríbeme a lists
arroba hadihariri punto com
http://www.hadihariri.com
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida