2009-10-16 6 views
5

Je lis/met à jour les données de MS Access en utilisant C#. Mon code est:Incompatibilité de type de données dans l'expression de critère | 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); 
    } 
} 

En ce qui concerne les dates, je ne parviens. Cela génère une "incompatibilité de type de données dans l'expression de critère". Erreur. (J'ai supprimé la clause WHERE pour la simplifier) ​​ Suis-je sujette à joindre [LastLogin] =? point d'interrogation avec des guillemets simples, # signes .. n'aide pas. Les pistes sur la façon de gérer les objets DateTime avec Access et OleDb seront grandement appréciées.

Merci d'avance.

+0

Le bit de code serait plus facile à lire. si vous le formatez comme code en le mettant en retrait 4 espaces –

Répondre

0

Tout d'abord, pas votre instruction SQL doit être:

"UPDATE Customers SET [email protected]" 

En second lieu, la raison pour laquelle vous recevez l'erreur de décalage de date sera probablement votre passage »? comme votre date dans le champ LastLogin au lieu du paramètre logintime.

+0

Mais ceci est l'accès .. Je pensais oleDb ne supporte pas paramètre nommé :( – emre

+0

La déclaration ci-dessus devrait être ok en supposant que vous utilisez un OleDbCommand – James

0

peut-être essayer

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

à la place, passer sous forme de chaîne (et peut-être joindre à # puis) ​​

+1

je l'ai fait .. Mais ils montrent ensuite seulement la date n'est pas l'heure :) – emre

+0

Peut-être qu'une chaîne de format passée à ToString() de DateTime aidera – emre

+0

édité mon message ... devrait fonctionner. Il y a peut-être des façons plus élégantes de le faire, car cela pourrait éventuellement dépendre de vos options de localisation ... –

0

devrait-il pas être

"UPDATE Customers SET LastLogin='@LastLogin'" 

Et @LastLogin devrait être

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

edit Pourriez-vous simplement mettre en ligne le contenu?

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

Vous pourriez intégrer le tout, oui, mais la création de SQL dynamique est une mauvaise habitude à prendre. L'utilisation d'un paramètre est une meilleure conception et tout aussi facile à lire. –

0

Définissez la propriété "DBTYPE" du paramètre pour l'identifier comme une date, datetime ou datetime2 selon le cas ...

prms[0].DbType = DbType.DateTime; 

Il y a 7 signatures au nouveau OleDbParameter() appel , donc vous pouvez changer l'instance de signature, ou simplement faire explicitement comme j'ai échantillonné ci-dessus puisque vous n'aviez qu'un seul paramètre dans ce cas.

4

Il existe un problème connu avec OleDb et les dates. Essayez de faire quelque chose comme:

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

Ou utiliser la chaîne de format explicite:

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

Je résolu cela en utilisant le code suivant

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