Я получаю спорадический 'Невозможно привести объект типа' 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 -