2009-10-16 3 views
5

Я читаю/обновляю данные из MS Access с помощью C#. Мой код:Несоответствие типа данных в выражении критериев | 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); 
    } 
} 

Когда дело доходит до дат, я возникают проблемы. Это порождает «несоответствие типов данных в выражении критериев». ошибка. (я удалил предложение WHERE для упрощения его использования) Я приговорен к заключению [LastLogin] =? вопросительный знак с одинарными кавычками, # знаков .. не помогает. Любые выводы о том, как обращаться с объектами DateTime с помощью Access и OleDb, получат высокую оценку.

Заранее спасибо.

+0

бит код будет легче читать. если вы отформатируете его как код, отложив его 4 пробела –

ответ

0

Во-первых, не ваш SQL заявление должно быть:

"UPDATE Customers SET [email protected]" 

Во-вторых, причина вы получаете ошибки даты несоответствие, вероятно, будет ваш переход "? как ваше время в поле LastLogin вместо фактического параметра logintime.

+0

Но это доступ .. I hardt oleDb не поддерживает именованный параметр :( – emre

+0

Вышеприведенный оператор должен быть в порядке, если вы используете OleDbCommand – James

0

возможно попробовать

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

вместо этого, передать его в качестве строки (и, возможно, заключить с # тогда)

+1

Я .. Но потом они показывают только дата не время :) – emre

+0

Может быть, строка формата, переданная ToString() DateTime, поможет – emre

+0

отредактировал мое сообщение ... должно работать. Там могут быть более элегантные способы сделать это, поскольку это может зависеть от ваших параметров локализации, хотя ... –

0

Если это не будет

"UPDATE Customers SET LastLogin='@LastLogin'" 

И @LastLogin должны быть

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

Редактировать Не могли бы вы просто встроить все это?

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

Вы можете встроить все это, да, но создание динамического sql - это плохая привычка. Использование параметра - лучший дизайн и простота чтения. –

0

Попробуйте установить свойство «DBTYPE» параметр, чтобы идентифицировать его как дату, DateTime или datetime2 в зависимости от обстоятельств ...

prms[0].DbType = DbType.DateTime; 

Есть 7 подписей к новому OleDbParameter() вызов , поэтому вы можете изменить экземпляр подписи или просто сделать явно, как я пробовал выше, так как в этом случае у вас только 1 параметр.

4

Существует известная проблема с OleDb и датами. Попробуйте сделать что-то вроде:

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

Или использовать явный формат строки:

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

Я решил эту проблему, используя следующий код

OleDbCommand cmd = new OleDbCommand(qry, cnn); 
cmd.Parameters.Add("datenow", OleDbType.Date); 
cmd.Parameters["datenow"].Value = DateTime.Now; 
Смежные вопросы