2009-10-16 18 views
5

Leo/actualizo datos de MS Access usando C#. Mi código es:Falta de coincidencia de tipo de datos en la expresión de criterios | Access, OleDb, C#

public static void UpdateLastLogin(int userid, DateTime logintime) ///logintime = DateTime.Now 
{ 
    string sql = @"UPDATE [Customers] SET [LastLogin]=?"; 
    OleDbParameter[] prms = new OleDbParameter[] { 
    new OleDbParameter("@LastLogin",logintime) 
    }; 
    using (DAL dal = new DAL()) 
    { 
     dal.UpdateRow(sql, false, prms); 
    } 
} 

Cuando se trata de fechas, que teniendo problemas. Esto arroja un "No coinciden los tipos de datos en la expresión de criterios". error. (He eliminado la cláusula WHERE para mantenerlo más simple) ¿Se supone que adjuntaré [LastLogin] =? signo de interrogación con comillas simples, # signos ... no ayuda. Cualquier pista sobre cómo manejar objetos DateTime con Access y el proveedor OleDb será muy apreciada.

Gracias de antemano.

+0

El bit de código sería más fácil de leer. si lo formateas como código sangrándolo 4 espacios –

Respuesta

0

En primer lugar, hay la instrucción SQL debe ser:

"UPDATE Customers SET [email protected]" 

En segundo lugar, la razón por la que está recibiendo el error de falta de coincidencia fecha será probablemente su paso '?' como el tiempo de su fecha en el campo LastLogin en lugar del parámetro logintime real.

+0

Pero esto es acceso ... He pensado que oleDb no admite el parámetro nombrado :( – emre

+0

La afirmación anterior debería estar bien asumiendo que estás usando un OleDbCommand – James

0

quizás tratar

DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString() 

lugar, pasarlo como String (y tal vez adjuntar a continuación, #)

+1

que hice ... Pero luego muestran solo la Fecha no es la hora :) – emre

+0

Tal vez una cadena de formato pasada a ToString() de DateTime ayudará a – emre

+0

editar mi publicación ... debería funcionar. Quizás haya formas más elegantes de hacerlo, ya que esto podría depender de tus opciones de localización ... –

0

caso de no ser

"UPDATE Customers SET LastLogin='@LastLogin'" 

Y @LastLogin debe ser

logintime.ToString("yyyy-MM-dd hh:mm:ss") 

editar ¿No podría simplemente incluir todo el asunto?

"UPDATE Customers SET LastLogin='" + logintime.ToString("yyyy-MM-dd hh:mm:ss") + "'" 
+0

Puedes ponerlo todo en línea, sí, pero crear sql dinámico es un mal hábito para entrar. El uso de un parámetro es mejor diseño e igual de fácil de leer. –

0

Trate de establecer la propiedad "DBTYPE" del parámetro para identificarlo como una fecha, fecha y hora, o en su caso datetime2 ...

prms[0].DbType = DbType.DateTime; 

Hay 7 firmas de la nueva OleDbParameter() llamada , por lo tanto, puede cambiar la instancia de la firma, o simplemente hacer explícitamente como muestreé anteriormente ya que solo tenía 1 parámetro en este caso.

4

Existe un problema conocido con OleDb y fechas. Trate de hacer algo como:

OleDbParameter p = parameter as OleDbParameter; 
if (null == p) 
    parameter.DbType = DbType.DateTime; 
else 
    p.OleDbType = OleDbType.Date; 

O utilice cadena de formato explícito:

value.ToString("yyyy-MM-dd hh:mm:ss") 
1

que resolvieron este usando el siguiente código

OleDbCommand cmd = new OleDbCommand(qry, cnn); 
cmd.Parameters.Add("datenow", OleDbType.Date); 
cmd.Parameters["datenow"].Value = DateTime.Now; 
Cuestiones relacionadas