Невозможно привести объект типа «System.Int32» к типу «System.String». - PullRequest
8 голосов
/ 21 марта 2012

Я получаю спорадический 'Невозможно привести объект типа' System.Int32 'к типу' System.String 'Исключения в .SingleorDefault () в приведенном ниже коде.Это работает 9/10 раз, но случайно выдает исключение.Я удостоверился, что у SettingID, который я передаю, нет нулевых значений, и данные в таблице всегда существуют для settingID, и я всегда передаю SettingID как целое число.

Любые идеи о том, что не так с этим кодом.

Вот информация об исключении:

System.InvalidCastException: Невозможно привести объект типа 'System.Int32'для ввода' System.String '.
в System.Data.SqlClient.SqlBuffer.get_String ()
в Read_CPT_Setting (ObjectMaterializer`1)
в System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader2.MoveNext ()
в System.Linq.Enumerable.SingleOrDefault [TSource] (источник IEnumerable`1)
в System.Linq.Queryable.SingleOrDefault [TSource] (источник IQueryable`1)
в CPT.Service.SettingLinqProvider.GetSettingFromDBById (Int32 SettingId)

CODE:

Public Function GetSettingFromDBById(ByVal SettingId As Integer) As ReturnObject(Of Model.ISettingBase) 

    Dim retObj As New ReturnObject(Of Model.ISettingBase)
    Dim dbSetting As CPT_Setting

    Try
        Dim _cptDB As New CPT.Data.CPTLinqRepository.DB(_connString)
        Using _cptDB

             dbSetting = (From s In context.CPT_Settings _
                                  Where s.SettingId = settingId _
                                  Select s).SingleOrDefault

            If dbSetting IsNot Nothing Then
                retObj.ReturnValue = Mapping.Setting.MapDBToModel(dbSetting)
            End If

        End Using
    Catch ex As Exception
        retObj.ReturnValue = Nothing
        retObj.AddErrorMessage("Error returning the site: " & ex.Message)
        _log.Error(ex.Message, _userId, ex)
    End Try

    If retObj.ReturnValue Is Nothing Then
        retObj.AddErrorMessage("Site Not Found.")
    End If

    Return retObj
End Function

Я обновил приведенный выше код, добавив некоторые записи в журнал после каждой строки.

Public Function GetSettingFromDBById(ByVal SettingId As Integer) As ReturnObject(Of Model.ISettingBase) 

    Dim retObj As New ReturnObject(Of Model.ISettingBase)
    Dim dbSetting As CPT_Setting
    Dim SettingsList As New List(Of CPT_Setting)

    Dim errStr As String = " ENTER "

    Try
        Dim _cptDB As New CPT.Data.CPTLinqRepository.DB(_connString)
        Using _cptDB
            errStr &= " - Inside Context "
            If _cptDB Is Nothing Then
                errStr &= " - With Context is Nothing "
                _log.Error("Unusual Object - Unable to create connection object - Object is NOTHING", _userId)
            End If

            If System.DBNull.Value.Equals(_cptDB) Then
                errStr &= " - With Context is NULL "
                _log.Error("Unusual Object - Unable to create connection object - Object is NULL", _userId)
            End If

            errStr &= " - Querying With SettingID = " & SettingId.ToString()

            Dim dbSettingTemp = (From s In context.CPT_Settings _
                              Where s.SettingId = settingId _
                              Select s)

            If dbSettingTemp Is Nothing Then
                errStr &= " -- Nothing is returned from DB - Object is NOTHING -- "
                _log.Error(errStr, _userId)
            End If
            If System.DBNull.Value.Equals(dbSettingTemp) Then
                errStr &= " -- Nothing is returned from DB - Object is NULL -- "
                _log.Error(errStr, _userId)
            End If

            errStr &= " -- Before SingleOrDefault -- "
            dbSetting = dbSettingTemp.SingleOrDefault
            errStr &= " -- After SingleOrDefault -- "

            If dbSetting IsNot Nothing Then
                If System.DBNull.Value.Equals(dbSetting) Then
                    errStr &= " - NULL OBJECT RETURNED - Before Mapping "
                    _log.Error("Unusual Exception - NULL OBJECT RETURNED " & errStr, _userId)
                End If

                retObj.ReturnValue = Mapping.Setting.MapDBToModel(dbSetting)
                errStr &= " - After Mapping With SettingID=" & dbSetting.SettingId.ToString() & " SettingName=" & dbSetting.SettingName.ToString() & " StartDate=" & dbSetting.StartDate.ToShortDateString() & " EndDate=" & dbSetting.EndDate.ToShortDateString()

            Else
                errStr &= " - DBSetting Is Nothing "
                _log.Error("Unusual Object - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId)
            End If

        End Using
    Catch ex As Exception
        retObj.ReturnValue = Nothing
        retObj.AddErrorMessage("Error returning the site: " & ex.Message)
        _log.Error("Unusual Exception for SettingID=" & SettingId.ToString() & "--" & errStr & "--" & ex.Message, _userId, ex)
    End Try

    If retObj.ReturnValue Is Nothing Then
        retObj.AddErrorMessage("Site Not Found.")
        _log.Info("Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId)
    End If

    Return retObj
End Function

Помните: в БД есть все строки для всех идентификаторов настройки, указанных в сообщениях ниже.

Результаты:

Сценарий 1:

Необычный объект - Нет данных, полученных для SettingID = 142176 ENTER - Внутренний контекст - Запрос с SettingID = 142176 - До SingleOrDefault - - После SingleOrDefault - - DBSettingНичего

Необычный объект - Решения MRDD - Нет данных, полученных для SettingID = 142176 ENTER - Внутренний контекст - Запрос с SettingID = 142176 - Перед SingleOrDefault - - После SingleOrDefault - - После DBSetting - Ничего

Сценарий 2

Необычное исключение для SettingID = 138145 - ENTER - Внутренний контекст - Запрос с SettingID = 138145 - До SingleOrDefault - - После SingleOrDefault - --Specifiedприведение недопустимо.

Необычный объект - Решения MRDD - Нет данных, полученных для SettingID = 138145 ENTER - Внутренний контекст - Запрос с SettingID = 138145 - Befили SingleOrDefault - - После SingleOrDefault -

Сценарий 3

Необычное исключение для SettingID = 164638-- ENTER - Внутренний контекст - Запрос с SettingID = 164638 -До SingleOrDefault - --Index находился за пределами массива.

Необычный объект - Решения MRDD - Нет данных, полученных для SettingID = 164638 ENTER - Внутренний контекст - Запрос с SettingID = 164638 - До SingleOrDefault -

Ответы [ 4 ]

3 голосов
/ 14 мая 2012

Я поддержал Micorsoft Support, и мы включили отладку трассировки и анализа файлов дампа, но не смогли ничего найти.

После тщательного анализа я обнаружил, что на серверах 3/4 нет последних обновлений фреймворка, поэтому администраторы сервера обновили машины до Обновление надежности 1 для .Net Framework 4 и, похоже,решили проблему.Никаких изменений кода не было сделано.После обновления прошло две недели, и в этом блоке кода не было обнаружено ни одного исключения.

Я потратил месяц только на это.Слей это.Иногда это просто не код.

1 голос
/ 10 мая 2012

Вместо использования ToString() вы должны использовать Convert.ToString()

Надеюсь, это решит вашу проблему.

0 голосов
/ 10 мая 2012

Использовать одиночный вместо singleordefault?

Так мы недавно решили похожую ситуацию в работе.

0 голосов
/ 06 апреля 2012

Вы должны проверить, что

From s In context.CPT_Settings _
Where s.SettingId = settingId _
Select s

не возвращает более одного объекта. Возможно, это никогда не должно, но это может быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...