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, тогда оно должно работать

Читайте также: