2009-10-16 5 views
5

Ich lese/aktualisiere Daten von MS Access mit C#. Mein Code ist:Datentyp stimmt nicht mit Kriterienausdruck | überein 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); 
    } 
} 

Wenn es um Daten geht, ich Probleme. Dies löst einen "Datentyp nicht übereinstimmend in Kriterienausdruck". Error. (Ich habe die WHERE-Klausel entfernt, um sie einfacher zu halten) Bin ich der Meinung, dass [LastLogin] =? Fragezeichen mit einfachen Anführungszeichen, # Zeichen .. hilft nicht. Alle Hinweise zum Umgang mit DateTime-Objekten mit Access- und OleDb-Provider werden sehr geschätzt.

Vielen Dank im Voraus.

+0

Der Code-Bit wäre einfacher zu lesen. Wenn Sie es als Code formatieren, indem Sie es 4 Leerzeichen einrücken –

Antwort

0

Erstens sollte keine SQL-Anweisung sein:

"UPDATE Customers SET [email protected]" 

Zweitens ist der Grund, warum Sie das Datum Mismatch Fehler empfangen wird wahrscheinlich Ihre Weitergabe sein ‚?‘ als Datum in das LastLogin-Feld anstelle des eigentlichen Logintime-Parameters.

+0

Aber das ist Zugriff .. Ich habe gelehrt OleDb unterstützt keine benannten Parameter :( – emre

+0

Die obige Aussage sollte in Ordnung sein, vorausgesetzt, Sie verwenden einen OleDbCommand – James

0

versuchen vielleicht

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

stattdessen es als String übergeben (und vielleicht auch mit # umschließen dann)

+1

Ich tat .. Aber sie dann zeigen nur das Datum nicht die Zeit :) – emre

+0

Vielleicht eine Formatzeichenfolge, die an ToString() von DateTime übergeben wird, hilft – emre

+0

mein Beitrag bearbeiten ... sollte funktionieren. Es gibt vielleicht elegantere Möglichkeiten, dies zu tun, da dies möglicherweise von Ihren Lokalisierungsoptionen abhängen könnte ... –

0

Sollte es nicht

"UPDATE Customers SET LastLogin='@LastLogin'" 

Und @LastLogin sollte sein

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

bearbeiten Könnten Sie nicht einfach die ganze Sache inline?

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

Sie könnten die ganze Sache inline, ja, aber dynamische sql erstellen ist eine schlechte Angewohnheit, in zu bekommen. Die Verwendung eines Parameters ist besser gestaltet und genauso einfach zu lesen. –

0

Versuchen Sie, die „DBTYPE“ Eigenschaft des Parametrierauftrags es als ein Datum, Datumzeit zu identifizieren oder datetime2 entsprechend ...

prms[0].DbType = DbType.DateTime; 

Es gibt 7 Unterschriften an den neuen OleDbParameter() -Aufruf , so können Sie die Signaturinstanz ändern, oder tun Sie das explizit, wie ich oben gesampelt habe, da Sie in diesem Fall nur 1 Parameter hatten.

4

Es gibt ein bekanntes Problem mit OleDb und Daten. Versuchen Sie, etwas zu tun wie:

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

Oder verwenden explizites Formatstring:

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

Ich löste dies mit dem folgenden Code

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