2009-10-16 13 views
5

Ho letto/aggiornato i dati da MS Access utilizzando C#. Il mio codice è:Mancata corrispondenza del tipo di dati nell'espressione di criterio | 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); 
    } 
} 

Quando si tratta di date, io avendo difficoltà. Ciò genera "Mancata corrispondenza del tipo di dati nell'espressione di criteri". errore. (Ho rimosso la clausola WHERE per mantenerla più semplice) Sono sopraffuso per racchiudere [LastLogin] =? punto interrogativo con virgolette singole, # segni .. non aiuta. Tutti i lead su come gestire gli oggetti DateTime con Access e il provider OleDb saranno molto apprezzati.

Grazie in anticipo.

+0

Il bit di codice sarebbe stato più facile da leggere. se lo si formatta come codice indentandolo 4 spazi –

risposta

0

In primo luogo, non l'istruzione SQL dovrebbe essere:

"UPDATE Customers SET [email protected]" 

In secondo luogo, il motivo per cui stanno ricevendo l'errore di mancata corrispondenza della data sarà probabilmente vostro passaggio '?' come ora della data nel campo LastLogin invece del parametro logintime effettivo.

+0

Ma questo è l'accesso .. Ho pensato oleDb non supporta il parametro named :( – emre

+0

L'affermazione sopra dovrebbe essere ok presumendo che tu stia usando un OleDbCommand – James

0

magari provare

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

invece, passarlo come String (e forse allegare # allora)

+1

che ho fatto .. Ma poi mostrano solo la data non è il momento :) – emre

+0

Forse una stringa di formato passata a ToString() di DateTime aiuterà – emre

+0

modificato il mio post ... dovrebbe funzionare. Ci sono forse modi più eleganti per farlo, dal momento che questo potrebbe dipendere dalle opzioni di localizzazione anche se ... –

0

Nel caso non sia

"UPDATE Customers SET LastLogin='@LastLogin'" 

E @LastLogin dovrebbe essere

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

modifica Non potresti semplicemente mettere in riga tutto?

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

È possibile allineare il tutto, sì, ma la creazione di SQL dinamico è una cattiva abitudine. L'utilizzo di un parametro è un design migliore e altrettanto facile da leggere. –

0

Prova a impostare la proprietà "DBTYPE" del parametro per identificarlo come una data, datetime o datetime2 a seconda dei casi ...

prms[0].DbType = DbType.DateTime; 

Ci sono 7 firme al nuovo OleDbParameter() chiamata , quindi puoi cambiare l'istanza della firma, o semplicemente fare esplicitamente come ho campionato sopra poiché in questo caso avevi solo 1 parametro.

4

C'è un problema noto con OleDb e le date. Prova a fare qualcosa di simile:

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

Oppure utilizzare esplicito formato stringa:

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

Ho risolto questo utilizzando il seguente codice

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