Попытка вставить DateTime.Now в поле Date/Time приводит к ошибке "Несоответствие типов данных"

Если я попытаюсь записать дату и время в запись в базе данных MS-Access простым способом, как это

cmd.CommandText = "INSERT INTO [table] ([date]) VALUES (?)";
cmd.Parameters.AddWithValue("?", DateTime.Now);

Я получаю исключение, говорящее "Несоответствие типов данных в выражении критериев".

Кто-нибудь может сказать мне, почему? Что здесь не так?

После небольшого эксперимента я обнаружил, что могу заставить его работать, если я пишу

OleDbParameter parm = new OleDbParameter("?", OleDbType.Date);
parm.Value = DateTime.Now;
cmd.Parameters.Add(parm);

но делать это так кажется менее аккуратным, менее простым. Почему это необходимо? Я пропускаю что-то простое?

2 ответа

Решение

Проблема несоответствия в выражении критериев связана с тем, что OleDbType назначается параметру, используемому для представления значения DateTime.Now при вызове. AddWithValue,

OleDbType, выбранный AddWithValue, DBTimeStamp, но Access хочет OleDbType.Date,

http://support.microsoft.com/kb/320435

При поиске в сети я нашел еще один интересный совет. Основная проблема заключается в OleDbParameter, который не может обработать миллисекундную часть DateTime.Now. Вероятно, для параметра OleDbType установлено значение Date, поэтому миллисекундная часть не указана. Я также обнаружил, что вставка также работает с типом DBTimeStamp, если мы удаляем миллисекунды с даты.

cmd.Parameters.AddWithValue("?", GetDateWithoutMilliseconds(DateTime.Now));

private DateTime GetDateWithoutMilliseconds(DateTime d)
{
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
}

о, хорошо, жду кого-то, кто объяснит это лучше.

Самое простое утверждение просит движок БД использовать его Now() функция для получения текущего значения даты / времени. Или вы могли бы использовать его Date() функция, если вас не интересует время суток; Date() на самом деле даст вам полночь как время суток.

INSERT INTO [table] ([date]) VALUES (Now());

IOW, вам не нужно массировать значение даты / времени в .Net для того, чтобы вставить его в вашу базу данных Access.

Если вы хотите INSERT заявление, которое включает в себя буквальное значение даты, используйте # разделители даты. Итак, чтобы вставить сегодняшнюю дату:

INSERT INTO [table] ([date]) VALUES (#2013-04-25#);
Другие вопросы по тегам