Почему моя база данных Access отклоняет дату вставки и время? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть эта таблица, созданная в базе данных Access.

string sql = $"CREATE TABLE Eventi (" +
  $"id AUTOINCREMENT PRIMARY KEY," +
  $"tipologia varchar(255)," +
  $"denominazione varchar(255)," +
  $"descrizione varchar(255)," +
  $"data date," +
  $"costo decimal," +
  $"prezzo decimal" +
$");";

Я использую этот запрос для вставки новых записей в таблицу, но когда я выполняю c запрос, он возвращает мне 'System. Data.OleDb.OleDbException: 'Несоответствие типа данных в выражении критерия.'.

cmd.CommandText = "INSERT INTO Eventi (tipologia,denominazione,descrizione,data,costo,prezzo) VALUES " +
"(@tipologia, @denominazione, @descrizione, @data, @costo, @prezzo);";

Вот код для добавления параметров запроса ie:

cmd.Parameters.Add("@id", OleDbType.Integer).Value = v.Id;
cmd.Parameters.Add("@tipologia", OleDbType.VarChar, 255).Value = v.Tipologia;
cmd.Parameters.Add("@denominazione", OleDbType.VarChar, 255).Value = v.Denominazione;
cmd.Parameters.Add("@descrizione", OleDbType.VarChar, 255).Value = v.Descrizione;
cmd.Parameters.Add("@data", OleDbType.Date).Value = v.Data.Date;
cmd.Parameters.Add("@costo", OleDbType.Double).Value = v.Costo;
cmd.Parameters.Add("@prezzo", OleDbType.Double).Value = v.Prezzo;

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Настоящая проблема в вашем запросе не в разнице типов между десятичным и двойным. Хотя на самом деле рекомендуется всегда express правильный тип данных, в этом контексте параметры типа double можно легко преобразовать в десятичные , если свойства Costo и Prezzo имеют десятичный тип. Настоящая проблема заключается в наличии первого параметра с именем @ID, когда у вас нет этого поля в именах полей и в заполнителях параметров.

В OleDb параметры не распознаются по имени и назначаются их заполнители, использующие свойство name. (Действительно, документация говорит нам называть все эти заполнители символом?). В OleDb параметры являются позиционными, поэтому первый параметр будет использоваться как значение для первого заполнителя. В вашем коде это приводит к сдвигу каждого параметра на одну позицию, ведущему к параметру @ Descrizione , назначенному полю data , и, конечно, эта строка не является датой.

Просто удалите первый параметр из своей коллекции, и все будет в порядке.

Боковое примечание. В Access, как и в MySql, вы можете присвоить значение полю AUTOINCREMENT / AUTONUMBER, если хотите. Вместо этого SqlServer не допускает эту практику без отключения свойства IDENTITY столбца.

0 голосов
/ 03 августа 2020

Значение идентификатора не требуется, потому что это поле автоинкремента.

Как указывает Лиам в комментариях, вам нужно использовать OleDbType.Decimal вместо OleDbType.Decimal

Или вы также можете не использовать объявить тип (будет решено автоматически c)

cmd.Parameters.Add(new SqlParameter("@CODE", myCode));
...