"Несоответствие типа данных в выражении критериев" при сохранении записи для доступа с C#
Я получаю "несоответствие типов данных в выражении условия отбора" ошибка при вставке новой записи в базу данных Access. Приложение работает нормально на Британских компьютерах, но на южноафриканских компьютерах он выдает эту ошибку. Это заставляет меня думать, что это как-то связано с форматом даты. Однако, если я изменю свои собственные региональные настройки на южноафриканские, я не смогу воспроизвести ошибку.
код выглядит следующим образом:
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "INSERT INTO tblOrders "
+ "( UserID, AccountNumber, EmailAddress, InvoiceAddressID, DeliveryAddressID, PurchaseOrderReference, Comments, TotalPrice, [Date] )"
+ "VALUES (?,?,?,?,?,?,?,?,?);";
cmd.Parameters.Add(new OleDbParameter("@UserID", OleDbType.Integer)).Value = userID;
cmd.Parameters.Add(new OleDbParameter("@AccountNumber", OleDbType.VarChar)).Value = accountNumber;
cmd.Parameters.Add(new OleDbParameter("@EmailAddress", OleDbType.VarChar)).Value = emailAddress;
cmd.Parameters.Add(new OleDbParameter("@InvoiceAddressID", OleDbType.Integer)).Value = invoiceAddressID;
cmd.Parameters.Add(new OleDbParameter("@DeliveryAddressID", OleDbType.Integer)).Value = deliveryAddressID;
cmd.Parameters.Add(new OleDbParameter("@PurchaseOrderReference", OleDbType.VarChar)).Value = purchaseOrderReference;
cmd.Parameters.Add(new OleDbParameter("@Comments", OleDbType.VarChar)).Value = comments;
cmd.Parameters.Add(new OleDbParameter("@TotalPrice", OleDbType.Decimal)).Value = totalPrice;
cmd.Parameters.Add(new OleDbParameter("@Date", OleDbType.Date)).Value = date;
cmd.Parameters.Add(new OleDbParameter("@ID",OleDbType.Integer)).Value = orderID;
ExecuteNonQuery(cmd); // this line errors
есть много подобных вопросов в стеке, но все они, похоже, строят строки SQL вручную или в противном случае это кажется другой причиной. Я дважды проверил, что порядок параметров такой же, как в запросе InsertOrder (и код работает для 99.9% пользователей в любом случае).
обновление 8/8/2014
Это на самом деле вроде бы цена параметр, который вызывает проблему-не дата. Если я жестко закодирую цену до 0, то она работает нормально. Однако как в Великобритании, так и на юге Африканские компьютеры, totalPrice.ToString () производит "350.6" теперь, когда я принудительно ввел приложение в en-GB в интернете.конфиг. Таким образом, это должно быть так, что на южноафриканских ПК доступ по-прежнему отключается от десятичного значения. Как я могу заставить одно и то же приложение работать как на Британских, так и на южноафриканских ПК? Я не понимаю, как он может неправильно интерпретировать десятичное значение при использовании параметров.
цена-это тип данных "валюта" в базе данных Access.
2 ответов
вы пытались использовать OleDbType.Currency
вместо OleDbType.Decimal
? Может быть, эти типы intepreted по-разному, хотя обе карты для десятичного типа по документация. И, как вы сказали, это также тип, который используется для вашей базы данных Access.
Это больше похоже на критерии, поэтому liekly это не ваш SP, который виноват. попробуйте это:
убедитесь, что критерии для столбца соответствуют типу данных базового поля столбца. Если вы укажете текстовый критерий для числового поля или поля даты/времени, вы получите эту ошибку. Например, поле ReorderLevel имеет тип данных Number. Таким образом при вводе критерия "50" будет возвращено сообщение об ошибке, так как Microsoft Office Access 2003 интерпретирует значения в кавычках как текст, а не цифры. Другие ситуации, вызывающие конфликт типов данных, включают:
вы задаете критерии для поля поиска, и критерии используют значения, отображаемые в списке поиска, вместо связанных значений внешнего ключа. Поскольку значения внешнего ключа являются значениями, фактически хранящимися в базовой таблице, их следует использовать при указании критериев для поля. Вы ввели знак доллара ( $ ) в критерии, которые вы указали для валютное поле. Удалить знак доллара, а затем просмотрите результаты. Убедитесь, что тип данных каждой пары Объединенных полей в запросе одинаков. Если нет, измените тип данных одного из Объединенных полей в соответствии с типом данных другого.