C# Access OleDb Несоответствие типов данных в выражении критериев
Пожалуйста, проверьте следующий код на наличие ошибок, которые приводят к исключению " Несоответствие типов данных в выражении критерия"? Я просто не могу найти источник проблемы...
*record.Date
обнуляемый DateTime?
тип явно приведен к DateTime
*record.Date
устанавливается как обнуляемый для других применений в программе. Но record.Date
набор для операции INSERT извлекается из DateTimePicker, поэтому record.Date
значение для этого метода никогда не должно быть нулевым.
ГДЕ
И (если вам интересно)
Из моего файла доступа (представление "Дизайн"):
Спасибо!
Вот метод AddRecord. Спасибо!
public static int AddRecord(Record record)
{
OleDbConnection connection = LABMeetingRecordsDB.GetConnection();
string insertStatement = "INSERT INTO DocumentInfo " +
"([FileName], [Date], [Subject], [Type]) " +
"VALUES (?, ?, ?, ?)";
try {
OleDbCommand insertCommand = new OleDbCommand(insertStatement, connection);
insertCommand.Parameters.AddWithValue("@FileName", record.FileName);
insertCommand.Parameters.AddWithValue("@Date", (DateTime)record.Date);
insertCommand.Parameters.AddWithValue("@Subject", record.Subject);
insertCommand.Parameters.AddWithValue("@Type", record.getDBType());
connection.Open();
insertCommand.ExecuteNonQuery();
string selectStatement = "SELECT IDENT_CURRENT('DocumentInfo') FROM DocumentInfo";
OleDbCommand selectCommand = new OleDbCommand(selectStatement, connection);
int recordID = Convert.ToInt32(selectCommand.ExecuteScalar());
AddCategory(connection, recordID, record.Category);
return recordID;
} catch (OleDbException ex) {
throw ex;
} finally {
connection.Close();
}
}
3 ответа
Итак...[ПРОБЛЕМА РЕШЕНА]:D
ЗДЕСЬ я узнал, что
Проблема несоответствия в выражении критериев связана с тем, что OleDbType назначается параметру, используемому для представления значения DateTime.Now при вызове AddWithValue.
OleDbType, выбранный AddWithValue, является DBTimeStamp, но Access хочет OleDbType.Date.
Это означает, что удобно AddWithValue
натянул быстрый на меня...
Спасибо @LarsTech и @DJKraze за помощь, несмотря на путаницу в презентации!
Я думаю, что вы также можете использовать ToString(), чтобы ваши данные даты в правильном формате, который будет принят при доступе
insertCommand.Parameters.AddWithValue("@Date", record.Date.ToString("dd-MM-yy"));
OleDbConnection connection = LABMeetingRecordsDB.GetConnection();
string insertStatement = "INSERT INTO DocumentInfo " + "([FileName], [Date], [Subject], [Type]) " + "VALUES (?, ?, ?, ?)";
OleDbCommand insertCommand = new OleDbCommand(insertStatement, connection);
insertCommand.CommandType = CommandType.Text;
insertCommand.Parameters.AddWithValue("@FileName", record.FileName);
insertCommand.Parameters.AddWithValue("@Date", (DateTime)record.Date ?? (object)DBNull.Value);
insertCommand.Parameters.AddWithValue("@Subject", record.Subject);
insertCommand.Parameters.AddWithValue("@Type", record.getDBType ?? (object)DBNull.Value);
connection.Open();
try
{
insertCommand.ExecuteNonQuery();
}
catch(OleDbException e)
{
LogYourMessage(e.Message);
}
Приведение DBNull.Value в качестве (объекта)DBNull.Value; это правильный способ обработки объекта, попробуйте это, я только что проверил на моем конце и сделал аналогичный тест, который работает..