Исключение при использовании DateTime в параметризованном OleDbCommand - PullRequest
2 голосов
/ 28 сентября 2010

Я пытаюсь вставить System.DateTime в базу данных Access, используя параметризованный OleDbCommand в C #.Тем не менее, он выдает исключение Data type mismatch in criteria expression.

Вот мой код:

string statement = "INSERT INTO Log (SCTID, LogDateTime, Type, Message, Visible)" +
    "VALUES (?, ?, ?, ?, ?);";

OleDbCommand insertCommand = new OleDbCommand(statement, connection);

// Add parameters to the command            
insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
insertCommand.Parameters.AddWithValue("@LogDateTime", OleDbType.DBTime).Value = dateTime;
insertCommand.Parameters.AddWithValue("@Type", OleDbType.Integer).Value = (int)logType;
insertCommand.Parameters.AddWithValue("@Message", OleDbType.BSTR).Value = message;
insertCommand.Parameters.AddWithValue("@Visible", OleDbType.Boolean).Value = visible;

insertCommand.ExecuteNonQuery();

Когда я закомментирую строку LogDateTime, остальное работает.Моя проблема в том, что независимо от того, что я использую для типа DateTime, он не работает.Я пробовал:

OleDbType.Date, OleDbType.DBDate, OleDBType.DBTimeStamp, DbType.Date, DbType.DateTime, DbType.DateTime2

Я также пробовал:

insertCommand.Parameters.AddWithValue("@LogDateTime", dateTime);

Это тоже не работает.Ничто из того, что я прочитал через Google или ТАК, не работает.Кроме того, обратите внимание, что мне нужны и дата, и время, а не только одна дата.

1 Ответ

3 голосов
/ 28 сентября 2010
insertCommand.Parameters.AddWithValue("@SCTID", OleDbType.Integer).Value = SCTID;
...

Это очень странный способ использования AddWithValue. Второй параметр - это не тип, а значение, которое вы хотите получить. В данном случае вы просто используете целочисленное значение члена перечисления OleDbType.Integer, а затем сразу же перезаписываете его, присваивая свойству Value. Должно быть либо:

insertCommand.Parameters.AddWithValue("@SCTID", SCTID);

или

insertCommand.Parameters.Add("@SCTID", OleDbType.Integer).Value = SCTID;

Относительно самого оператора - почему вы используете ? для заполнителей в тексте команды, но затем используете имена при добавлении параметров в коллекцию?

Относительно фактической проблемы - похоже, это известная ошибка , и обходной путь состоит в том, чтобы обрезать миллисекунды в вашем DateTime значении перед назначением и использовать OleDbType.Date.

...