System invalidcastexception сообщение specified cast is not valid
Обновлено: 02.07.2024
На хостинге переодически выпадает ошибка "Specified cast is not valid." где-то 1 раз на 10 запросов. Выпадает всегда в разных местах кода.
[ InvalidCastException : Specified cast is not valid. ]
System. Data . Linq . SqlClient . SqlProvider . Execute ( Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object [ ] parentArgs, Object [ ] userArgs, ICompiledSubQuery [ ] subQueries, Object lastResult ) + 847
System. Data . Linq . SqlClient . SqlProvider . ExecuteAll ( Expression query, QueryInfo [ ] queryInfos, IObjectReaderFactory factory, Object [ ] userArguments, ICompiledSubQuery [ ] subQueries ) + 113
System. Data . Linq . SqlClient . SqlProvider . System. Data . Linq . Provider . IProvider . Execute ( Expression query ) + 344
System. Data . Linq . Table `1. System . Linq . IQueryProvider . Execute ( Expression expression ) + 49
System . Linq . Queryable . SingleOrDefault ( IQueryable` 1 source, Expression` 1 predicate ) + 301
KobeAdmin. Models . UsersRepository . Get ( String UserName ) + 399
Встречался ли кто-нибудь с подобной ерундой? Что можно предпринять?
Как показала практика проблемы такого типа достаточно сложно решать. Поэтому постараюсь описать как её решили мы, и какие способы решения бывают.
1. Для каждого request свой datacontext. Более подробно здесь. В нашем случае правда это не помогло, но народ пишет что в каких-то случаях лечит.
2. Не писать на view linq выражения которые предполагают обращения в базу. Нам повезло, у нас такое выражение было всего в одном месте. После того как перенесли эти вычисления в контроллер и нагрузили проект, ошибка чудесным образом испарилась.
3. Потом мы решили подвергнуть кэшу все что только возможно, и ошибка опять полезла при малейших нагрузках, и нам было очень плохо. Поэтому никогда не кешируте linq последовательности с отложенным выполнением. Иными словами вот так делать нельзя
var catalog = _cache. Get IEnumerable e_Catalog >> ( "category_all" , ( ) => _dataContext. e_Catalog . AsEnumerable ( ) ) ;
а вот так можно
var catalog = _cache. Get IEnumerable e_Catalog >> ( "category_all" , ( ) => _dataContext. e_Catalog . ToList ( ) ) ;
То при запуске появляется ошибка, подскажите что можно сделать?
1 ответ 1
Метод возвращает SaveDataRaw , а вы пытаетесь его скастовать в SaveDataItems .
То есть вы пытаетесь привести тип родителя SaveDataRaw data к наследнику.
Такой каст невозможен. Можно только наследника к родителю, либо наследника, ранее поднятого к родителю опустить обратно к себе.
И вот так можно
А вот так нельзя
То есть здесь важен не тип ссылки на объект, и тип самого объекта под ссылкой, который создан с помощью new .
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Исключение, которое выдается в случае недопустимого приведения или явного преобразования.
Комментарии
InvalidCastExceptionИсключение возникает, если преобразование экземпляра одного типа в другой тип не поддерживается. Например, попытка преобразовать Char значение в DateTime значение приводит к InvalidCastException возникновению исключения. Он отличается от OverflowException исключения, которое создается, если преобразование одного типа в другой поддерживается, но значение исходного типа находится вне диапазона целевого типа. InvalidCastExceptionИсключение вызвано ошибкой разработчика и не должно обрабатываться в try/catch блоке. Вместо этого необходимо устранить причину исключения.
Сведения о преобразованиях, поддерживаемых системой, см. в разделе Convert класс. Сведения об ошибках, возникающих, когда конечный тип может хранить значения исходного типа, но недостаточно велик для хранения определенного исходного значения, см OverflowException . исключение.
Во многих случаях языковой компилятор обнаруживает, что между исходным типом и целевым типом не существует преобразования и выдает ошибку компилятора.
Некоторые условия, при которых предпринимается преобразование, InvalidCastException выдают исключение, описанное в следующих разделах:
Чтобы явное преобразование ссылки было успешным, исходное значение должно быть null , или тип объекта, на который ссылается исходный аргумент, должен быть преобразован в целевой тип с помощью неявного преобразования ссылки.
Следующие инструкции промежуточного языка (IL) вызовут InvalidCastException исключение:
InvalidCastException использует COR_E_INVALIDCAST HRESULT, имеющий значение 0x80004002.
Список начальных значений свойств для экземпляра InvalidCastException, см. в разделе InvalidCastException конструкторы.
Типы-примитивы и IConvertible
Вы напрямую или косвенно вызываете реализацию примитивного типа IConvertible , который не поддерживает определенное преобразование. Например, попытка преобразовать значение в Boolean Char или DateTime значение в Int32 создает InvalidCastException исключение. В следующем примере вызываются Boolean.IConvertible.ToChar методы и Convert.ToChar(Boolean) для преобразования Boolean значения в Char . В обоих случаях вызов метода вызывает InvalidCastException исключение.
Поскольку преобразование не поддерживается, обходной путь не существует.
Метод Convert. ChangeType
В большинстве случаев, поскольку преобразование не поддерживается, обходной путь не существует. В некоторых случаях возможный обходной путь состоит в том, чтобы вручную назначить значения свойств из типа источника аналогично свойствам целевого типа.
Сужающие преобразования и реализации IConvertible
Однако если ни исходный тип, ни тип целевого объекта не определяют явное или понижающие преобразование между двумя типами, а IConvertible Реализация одного или обоих типов не поддерживает преобразование из исходного типа в целевой тип, InvalidCastException создается исключение.
В большинстве случаев, поскольку преобразование не поддерживается, обходной путь не существует.
Опуститься
Выполняется наследование, то есть попытка преобразовать экземпляр базового типа в один из его производных типов. В следующем примере попытка преобразовать Person объект в PersonWithID объект завершается ошибкой.
Как показано в примере, произведение происходит успешно, только если Person объект был создан с помощью приведения из PersonWithId объекта в Person объект или если Person объект имеет значение null .
Преобразование из объекта интерфейса
Предпринимается попытка преобразовать объект интерфейса в тип, реализующий этот интерфейс, но тип целевого объекта не совпадает с типом или базовым классом типа, от которого был изначально получен объект интерфейса. В следующем примере создается InvalidCastException исключение при попытке преобразовать IFormatProvider объект в DateTimeFormatInfo объект. Преобразование завершается неудачей DateTimeFormatInfo , поскольку хотя класс реализует IFormatProvider интерфейс, DateTimeFormatInfo объект не связан с CultureInfo классом, от которого был получен объект интерфейса.
Преобразование строк
использование оператора Visual Basic CStr для преобразования значения типа-примитива в строку завершилось с ошибкой. Операция не создает InvalidCastException исключение.
Чтобы успешно преобразовать экземпляр любого типа в строковое представление, вызовите его ToString метод, как показано в следующем примере. ToString Метод всегда представлен, так как ToString метод определяется Object классом и, следовательно, либо наследуется, либо переопределен всеми управляемыми типами.
Visual Basic миграция 6,0
и замените его следующей строкой кода:
Конструкторы
Инициализирует новый экземпляр класса InvalidCastException.
Инициализирует новый экземпляр класса InvalidCastException с сериализованными данными.
Свойства
Получает или задает ссылку на файл справки, связанный с этим исключением.
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.
Возвращает экземпляр класса Exception, который вызвал текущее исключение.
Возвращает или задает имя приложения или объекта, вызывавшего ошибку.
Получает строковое представление непосредственных кадров в стеке вызова.
Возвращает метод, создавший текущее исключение.
Методы
Определяет, равен ли указанный объект текущему объекту.
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений.
Служит хэш-функцией по умолчанию.
При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.
Возвращает тип среды выполнения текущего экземпляра.
Создает неполную копию текущего объекта Object.
Создает и возвращает строковое представление текущего исключения.
События
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.
То, что я пытаюсь сделать в этом коде, я получаю данные из таблицы и сохраняю ее в другой таблице. Я передаю эту таблицу в качестве аргумента в классификатор для дальнейшей работы. Пожалуйста, сообщите мне об ошибке. Datatypes высоты, uname – varchar… другие – int…
Вероятно, это происходит на одной из следующих строк:
Вы получите это исключение, если базовый тип поля не может быть напрямую передан в двойную. Из документации для Field InvalidCastException вызывается, когда:
Тип значения базового столбца не может быть отнесен к типу, указанному общим параметром T.
Учитывая трассировку стека, кажется, что ваш столбец “высота” в базовой таблице не является фактически числовым и не может быть добавлен к двойному. Например, если он хранится в виде строки во входном наборе данных, вам придется извлечь строку и преобразовать ее в двойную.
Теперь понятно. Вы не можете распаковать коробчатый int для double или любого другого типа. Разрешены только допустимые типы: int и Nullable .
Получите поле как int и преобразуйте его в double, тогда оно должно работать
Читайте также: