Ricevo un errore 'Impossibile eseguire il cast di tipo' System.Int32 'per digitare' System.String 'Eccezioni su .SingleorDefault() nel codice seguente. Funziona 9/10 volte ma casualmente genera un'eccezione. Mi sono assicurato che SettingID che sto passando non ha valori Null e i dati nella tabella esistono sempre per l'ID di impostazione, e sto sempre passando SettingID come Integer.Impossibile eseguire il cast dell'oggetto di tipo 'System.Int32' per digitare 'System.String'
Qualche idea su cosa non va con questo codice.
Qui è l'eccezione Info:
System.InvalidCastException: Impossibile eseguire il cast oggetto di tipo 'System.Int32' digitare 'System.String'.
a System.Data.SqlClient.SqlBuffer.get_String()
a Read_CPT_Setting (ObjectMaterializer`1)
a System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
a System.Linq. Enumerable.SingleOrDefault [TSource] (fonte IEnumerable`1)
a System.Linq.Queryable.SingleOrDefault [TSource] (fonte IQueryable`1)
a CPT.Service.SettingLinqProvider.GetSettingFromDBById (Int32 SettingID)
CODICE:
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
Ho aggiornato il codice di cui sopra con un po 'di registrazione al posto dopo ogni riga.
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
Ricorda: DB ha tutte le righe per tutti i settingIDs citati nei messaggi di seguito.
Risultati:
Scenario 1:
insolito oggetto - Non sono dati recuperati per SettingID = 142176 ENTER - All'interno del contesto - Interrogazione Con SettingID = 142176 - Prima SingleOrDefault - - Dopo SingleOrDefault - - DBSetting Is Nothing
Oggetto insolito - Soluzioni MRDD - Nessun dato recuperato per SettingID = 142176 INVIO - Contesto interno - Interrogazione con SettingID = 142176 - Prima di SingleOrD EFAULT - - Dopo SingleOrDefault - - DBSetting è niente
Scenario 2
Eccezione insolito per SettingID = 138145-- ENTER - All'interno del contesto - Interrogazione Con SettingID = 138.145 - Prima SingleOrDefault - - - Dopo SingleOrDefault - - Il cast specificato non è valido.
insoliti Object - MRDD Solutions - Nessun dati recuperati per SettingID = 138.145 ENTER - Contesto All'interno - Interrogazione Con SettingID = 138.145 - Prima SingleOrDefault - - Dopo SingleOrDefault -
Scenario 3
Eccezione insolita per SettingID = 164638-- INVIO - Contesto interno - Interrogazione con SettingID = 164638 - Prima di SingleOrDefault - --Index era fuori dai limiti dell'array.
insoliti Object - MRDD Solutions - Nessun dati recuperati per SettingID = 164.638 ENTER - Contesto All'interno - Interrogazione Con SettingID = 164.638 - Prima SingleOrDefault -
Che tipo è la colonna SettingID nel database? –
C'è una discrepanza tra i tipi tra le proprietà della tua classe 'CPT_Setting' e le colonne della tabella db? Come: una colonna è testo e la proprietà corrispondente è int. –
No. Non c'è corrispondenza tra le colonne DB e le proprietà DBML/Classe. Mi sono assicurato che fosse corretto con il secondo set di occhi. – ravi