2009-10-16 15 views
5

Czytam/aktualizuję dane z MS Access przy użyciu C#. Mój kod to:Niedopasowanie typu danych w wyrażeniu kryteriów | 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); 
    } 
} 

Jeśli chodzi o daty, mam kłopoty. Powoduje to niedopasowanie typu danych w wyrażeniu kryteriów. błąd. (Usunąłem klauzulę WHERE dla uproszczenia) Czy jestem załączony, aby zamknąć [LastLogin] =? znak zapytania z pojedynczymi cytatami, # znaki .. nie pomaga. Wszelkie wskazówki dotyczące obchodzenia się z obiektami DateTime z dostawcami Access i OleDb będą bardzo mile widziane.

Z góry dziękuję.

+0

Bit kod byłoby łatwiejsze do odczytania. jeśli sformatujesz go jako kod wciskając go 4 spacje –

Odpowiedz

0

Po pierwsze, nie ma instrukcji SQL powinny być:

"UPDATE Customers SET [email protected]" 

Po drugie, powód otrzymujesz błąd data niedopasowanie będzie prawdopodobnie twoje odejście „?” jako datę w polu LastLogin zamiast rzeczywistego parametru logintime.

+0

Ale to jest dostęp .. Pomyślałem, że oleDb nie obsługuje nazwanego parametru :( – emre

+0

Powyższe stwierdzenie powinno być w porządku przy założeniu, że używasz OleDbCommand – James

0

może spróbować

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

zamiast przekazać ją jako ciąg (a może załączyć # wtedy)

+1

Zrobiłem .. Ale oni następnie pokazują tylko data nie jest godzina :) – emre

+0

Być może ciąg formatu przekazany do ToString() z DateTime pomoże – emre

+0

edytować mój post ... powinien działać. Być może są to bardziej eleganckie sposoby, ponieważ może to zależeć od opcji lokalizacji ... –

0

Gdyby nie być

"UPDATE Customers SET LastLogin='@LastLogin'" 

I @LastLogin powinny być

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

edytuj Czy możesz nie tylko wstawić całość?

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

Można wstawić całość, tak, ale tworzenie dynamicznego sql jest złym nawykiem. Użycie parametru jest lepszym projektem i równie łatwym do odczytania. –

0

Spróbuj ustawić „dbtype” właściwość parametru, aby zidentyfikować go jako data, DateTime lub datetime2 odpowiednio ...

prms[0].DbType = DbType.DateTime; 

Istnieje 7 podpisów do nowego OleDbParameter() połączenia , więc możesz zmienić instancję podpisu lub po prostu zrobić jawnie, tak jak próbowałem powyżej, ponieważ w tym przypadku miałeś tylko jeden parametr.

4

Znany jest problem z OleDb i datami. Spróbuj zrobić coś takiego:

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

Albo użyć wyraźny ciąg formatu:

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

I rozwiązać to za pomocą następującego kodu

OleDbCommand cmd = new OleDbCommand(qry, cnn); 
cmd.Parameters.Add("datenow", OleDbType.Date); 
cmd.Parameters["datenow"].Value = DateTime.Now; 
Powiązane problemy