Попытка вставить 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#);