Intentar insertar DateTime.Now en el campo de fecha / hora da el error “No coinciden los tipos de datos”

Si trato de escribir una fecha y hora en un registro en una base de datos MS-Access de la manera más fácil, como esta

cmd.CommandText = "INSERT INTO [table] ([date]) VALUES (?)"; cmd.Parameters.AddWithValue("?", DateTime.Now); 

Recibo una excepción que dice “No coincide el tipo de datos en la expresión de criterios”.

¿Puede alguien decirme por qué? ¿Qué sale mal aquí?

Después de un poco de experimentación, descubrí que puedo hacerlo funcionar si escribo

 OleDbParameter parm = new OleDbParameter("?", OleDbType.Date); parm.Value = DateTime.Now; cmd.Parameters.Add(parm); 

pero hacerlo así parece menos ordenado, menos directo. ¿Por qué es esto necesario? ¿Estoy pasando por alto algo simple?

El problema de la falta de coincidencia en la expresión de criterios se debe al OleDbType asignado al parámetro utilizado para representar el valor DateTime.Now cuando se llama AddWithValue .

El OleDbType elegido por AddWithValue es DBTimeStamp , pero Access quiere un OleDbType.Date .

http://support.microsoft.com/kb/320435

Buscando en la red He encontrado otro consejo interesante. El problema principal está en OleDbParameter que no puede manejar la parte de milisegundos de DateTime.Now. Probablemente obligando a OleDbType a ser Fecha en que se omite la parte de los milisegundos. También encontré que la inserción funciona también con el tipo DBTimeStamp si eliminamos los milisegundos de la fecha.

 cmd.Parameters.AddWithValue("?", GetDateWithoutMilliseconds(DateTime.Now)); private DateTime GetDateWithoutMilliseconds(DateTime d) { return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); } 

oh, bueno, esperando a alguien que explique esto mejor.

La statement más simple le pide al motor de base de datos que use su función Now() para obtener el valor de fecha / hora actual. O puede usar su función Date() si no está interesado en la hora del día; Date() realmente le dará la medianoche como hora del día.

 INSERT INTO [table] ([date]) VALUES (Now()); 

IOW, no necesita molestarse en dar masajes a un valor de Fecha / Hora en .Net para insertarlo en su Access db.

Si desea una INSERT que incluya un valor de fecha literal, use los # delimitadores de fecha. Para insertar la fecha de hoy:

 INSERT INTO [table] ([date]) VALUES (#2013-04-25#);